javascript - React Hooks - 使用 lodash 的 deepCopy 不会导致重新渲染
问题描述
我正在使用带有钩子的 React.js 并尝试更改嵌套状态值。
因为我不想直接改变状态,所以我使用了 lodash 的“CloneDeep”函数。
状态更改成功,但没有发生重新渲染,因此在重新输入之前我看不到页面中的更改。
更多信息(在我的 Web 控制台中检查结果):
console.log(logicalLinesDeepCopy == logicalLines);
=> false
console.log(logicalLinesDeepCopy === logicalLines);
=> false
console.log(logicalLines[menuLineId].content[menuSentenceId].triggers);
=> []
console.log(logicalLinesDeepCopy[menuLineId].content[menuSentenceId].triggers);
=> [(object)]
我的代码:
// relevant imports:
import CloneDeep from "lodash/cloneDeep";
// relevant state initiation: (the value is filled before I call the relevant function)
const [logicalLines, setLogicalLines] = useState(null);
// relevant function:
const addTriggerToListInState = (trigger) => {
// Deep copy:
let logicalLinesDeepCopy = CloneDeep(logicalLines);
// Change the deep copy:
const lineCopy = logicalLinesDeepCopy[menuLineId];
const triggersListCopy = lineCopy.content[menuSentenceId].triggers;
triggersListCopy.push(trigger);
// Some debug checks:
console.log(logicalLinesDeepCopy == logicalLines);
console.log(logicalLinesDeepCopy === logicalLines);
console.log(logicalLines[menuLineId].content[menuSentenceId].triggers);
console.log(logicalLinesDeepCopy[menuLineId].content[menuSentenceId].triggers);
// Setting the state:
setLogicalLines(logicalLinesDeepCopy);
};
所以看起来新状态的引用和嵌套内容都与前一个不同,那么为什么它不会导致重新渲染,我该如何改变它来导致它呢?
谢谢!
萨皮尔
解决方案
推荐阅读
- python - Jupyter notebook 错误:端口 8888 已在使用中,正在尝试另一个端口
- java - 读取 XML 文件只获取一个值 android
- powershell - Powershell 从日志文件中提取 TCP 端口以更新防火墙规则
- r - 来自两个小标题的ggplot;背景为等高线的散点图
- flutter - 如何制作一个类来存储静态颜色?
- powershell - 适用于 Microsoft Word、Excel、Powerpoint 的 PowerSTIG?
- python - 将 sas7bdat 文件上传到 Python
- github - 在 github 问题中嵌入大型或非标准文件
- angular - 从 firebase 获取文档并访问函数返回的数据
- floating-point - Common Lisp 中浮点数的字节表示