javascript - 如何在没有无限重定向的情况下更新现有状态对象?
问题描述
const useExample = (something) => {
const [v, setV] React.useState(something)
React.useEffect(() => setV({...v ...something), [something, v, setV])
}
上面的代码运行一个无限循环,因为我使用v
的是 set v
。如何将 v 设置为使用v
但不导致此循环的值?
解决方案
我怀疑如果我知道你为什么要将道具与状态结合起来,可能会有更好的解决方案来解决你的问题。
看起来您正在尝试创建一个函数,该函数将先前传递给它的参数与当前传递给它的参数结合起来,让当前覆盖最后一个属性。如果是这种情况,那么有一种更简单的方法可以做到这一点。
使用到目前为止提供的信息,您可以通过记忆道具(something
在您的方法中调用)来防止无限循环,v
并让该记忆函数设置合并结果:
import React, { useState, useMemo } from 'react';
const Something = something => {
const [v, setV] = useState(something);
//memoize setting merged
const merged = useMemo(() => {
return { ...v, ...something };
}, [something, v]);
return (
<div>
{JSON.stringify(merged)}
{/* can still set v */}
<button onClick={() => setV({ other: 22 })}>
Add other
</button>
</div>
);
};
export default () => {
const [p, setP] = useState(1);
return (
<div>
{/* change the props passed to Something */}
<button onClick={() => setP(p + 1)}>UP</button>
<Something prop={p} />
</div>
);
};
推荐阅读
- javascript - unsplash 查询给出随机图像
- node.js - 如何更改 vue.js 中的 element.style?
- docker - 2 个 Drupal 图像在一台机器上
- javascript - @RenderPage() 中的 Razor ASP.NET 按钮 onclick 事件不起作用
- junit - 模拟 SqlRowSet
- java - Resilience4j.retry 异常不工作
- nginx - 带有反向代理的Nodejs
- asp.net - 显示数据库中保存为字节的 IFormFile 的图像
- scala - 函数与整数值比较时的火花
- python - 分组,然后比较列表类型行中的值以填充新列