javascript - React shouldComponentUpdate 检测变化
问题描述
我必须在这里做一些愚蠢的事情,但经过一天的尝试,我正在转向这里......
val
我在组件状态下保存的数组的每个元素都有一个下拉菜单:
class C extends Component {
state = { val : [ 1,2,3,4] }
...
}
每个下拉条目的更改都会触发此回调:
onChanged = (event, index) => {
console.log("val changed");
this.setState(state => {
const val = state.val;
val[index] = event.target.value;
return { val: val };
});
};
现在的问题是我无法弄清楚如何检测shouldComponentUpdate
. 具体来说,当我更改下拉选项之一时,我看到val changed
被记录。但是,在该shouldComponentUpdate
方法中,nextState
andthis.state
始终包含相同的值(并且在比较时似乎相同)。所以我无法检测到shouldComponentUpdate
. 这是我正在使用的确切代码:
shouldComponentUpdate(nextProps, nextState) {
console.log(
"shouldComponentUpdate",
nextProps.val,
this.state.val,
nextState.val,
this.state.val === nextState.val
);
return false;
}
在更改下拉选项之一之前,这会记录类似
shouldComponentUpdate, undefined, [1, 2, 3, 4], [1, 2, 3, 4], true
如果我将第一个下拉列表从 更改1
为9
,那么我会看到
shouldComponentUpdate, undefined, [9, 2, 3, 4], [9, 2, 3, 4], true
我希望在更改后立即看到
shouldComponentUpdate, undefined, [1, 2, 3, 4], [9, 2, 3, 4], true
请告诉我如何检测变化shouldComponentUpdate
或应该使用什么成语。
编辑:
有人建议我把回调slice
中的值数组onChanged
,也就是改成回调为:
onChanged = (event, index) => {
console.log("val changed");
this.setState(state => {
const val = state.val.slice();
val[index] = event.target.value;
return { val: val };
});
};
那并没有解决问题。这是更改前后的控制台日志:
shouldComponentUpdate undefined (4) [1, 2, 3, 4] (4) [1, 2, 3, 4] true
val changed
shouldComponentUpdate undefined (4) [9, 2, 3, 4] (4) [9, 2, 3, 4] true
编辑:
Crkeys 我很笨。有一个愚蠢的返回声明受到打击。我完全错过了。我接受下面的答案,因为正如问题所述,它们是正确的。
解决方案
那是因为您正在改变数组并重新使用它。
更改const val = state.val;
为
const val = [...state.val];
或者
const val = state.val.slice();
创建一个新数组
推荐阅读
- python-3.x - 24 ^ 15 = 23 按位运算
- ansible - Ansible to legacy network device(伪终端问题)
- sql - 尝试排除一个月时出现字符串转换错误
- string - 从网页读取 REST API 端点 - 使用 JAVA
- asp.net - Web.Config 中的 HttpRedirects 未按需要重定向
- apache-flink - url http://localhost:8081/jars/:jarid/run 的错误 404
- sql-server-2016 - 无法将副本添加到可用性组:不同的 sql server 版本
- insert - db2wh中的dbload vs insert,哪个更好用于加载数据,这两者有什么区别
- c# - web.config中的asp.net连接字符串问题
- node.js - 在 sequelize belongs-to-many 关系中创建实例