Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mapStateToProps获取新的道具,但无法调用componentWillReceiveProps_Javascript_Reactjs_Redux - Fatal编程技术网

Javascript mapStateToProps获取新的道具,但无法调用componentWillReceiveProps

Javascript mapStateToProps获取新的道具,但无法调用componentWillReceiveProps,javascript,reactjs,redux,Javascript,Reactjs,Redux,我正在使用React:16+和React-redux:6+ 我把所有的动作和减速器都接线了。而且,只要单击一个按钮,我就可以调用mapStateToProps(),但在此之后,将不会调用componentWillReceiveProps或shouldComponentUpdate 这是我的密码: class HeaderContainer扩展React.Component{ 建造师(道具){ 超级(); this.props=props; 此.state={ headerBtn:[] } }

我正在使用React:16+和React-redux:6+

我把所有的动作和减速器都接线了。而且,只要单击一个按钮,我就可以调用mapStateToProps(),但在此之后,将不会调用componentWillReceiveProps或shouldComponentUpdate

这是我的密码:

class HeaderContainer扩展React.Component{
建造师(道具){
超级();
this.props=props;
此.state={
headerBtn:[]
}
}
组件将接收道具(下一步){
console.log(nextrops);
}
render(){
返回(
)
}
}
常量mapStateToHeaderProps=(状态)=>{
console.log(“收到新道具”);
console.log(状态);
日志(state.HeaderReducer.headerBtns);
返回{
headerBtns:state.HeaderReducer.headerBtns
}
}
const mapDispatchToHeaderProps=(调度)=>{
返回{
选择交换:(交换,交换)=>{
调度(HeaderAction.选择交换(交换,交换));
}
}
}
导出默认连接(mapStateToHeaderProps、mapDispatchToHeaderProps)(HeaderContainer)
尝试将道具添加到super中

super(props);
尝试将道具添加到super中

super(props);

经过24小时的POCs和调试,我的reducer没有返回新对象,尽管使用了spread操作符:

let newState = {...state};
newState.name = ...
因此,我从互联网上读到的,特别是Redux doc,是如果状态可变,那么MapStateTops将不会被调用。这似乎不正确。在我的情况下,或者在任何状态突变的情况下,Redux都会调用MapStateTops。它根本不会调用shouldComponentUpdate()

原因是“仅扩散”操作符仅浅复制对象。因此,如果对象中存在嵌套对象,spread操作符将保留对象的引用,因此,一旦内部对象更新,原始状态将发生变化。为了避免这种情况,请始终使用任何深度复制对象的工具

_.cloneDeep(stateCopy, stateInitial) 
在我的情况下工作

顺便说一下

console.log(newState === state) 
返回false,表示该状态没有发生突变,它确实是一个克隆状态。非常奇怪(

更新
不要使用spread运算符。它不会进行深度复制。它只适用于状态具有简单键值对的情况。对于嵌套在对象中的复杂对象,spread运算符将严重失败。

经过24小时的POC和调试,结果表明,尽管使用了spread运算符,我的reducer并没有返回新对象:

let newState = {...state};
newState.name = ...
所以,我从互联网上读到的,尤其是Redux疑难解答文档,是如果状态可变,则不会调用MapStateTops。这似乎不正确。在我的情况下,或者在任何状态突变的情况下,Redux都会调用MapStateTops。它根本不会调用shouldComponentUpdate()

原因是spread运算符仅浅复制对象。因此,如果对象中存在嵌套对象,spread运算符将保留对象的引用,因此,一旦内部对象更新,原始状态将发生变化。为避免此类情况,请始终使用任何深复制对象的工具

_.cloneDeep(stateCopy, stateInitial) 
在我的情况下工作

顺便说一下

console.log(newState === state) 
返回false,表示该状态未发生突变,它确实是克隆状态。非常奇怪:(

更新
不要使用spread运算符。它不会进行深度复制。它只适用于状态具有简单键值对的情况。对于嵌套在对象中的复杂对象,spread运算符将严重失败。

我使用了相同的代码,并且当存储区中的props更新时,会调用componentWillReceiveProps。您能“react:”16.8.6“,”react-redux:”7.0.1“,”redux:”4.0.1“?我使用了相同的代码,当商店中的道具更新时,会调用componentWillReceiveProps。你能试试“react:”16.8.6“,”react-redux:”7.0.1“,”redux:“4.0.1”吗?
this.props=props;
是多余的,构造函数正在处理这个问题。如果您没有访问构造函数中的
this.props
则将
props
传递到
super()
调用或不调用。
this.props=props;
是多余的,构造函数正在处理此问题。如果您没有访问构造函数中的
this.props
权限,则将
props
传递到
super()
调用与否并不重要。