Javascript mapStateToProps获取新的道具,但无法调用componentWillReceiveProps
我正在使用React:16+和React-redux:6+ 我把所有的动作和减速器都接线了。而且,只要单击一个按钮,我就可以调用mapStateToProps(),但在此之后,将不会调用componentWillReceiveProps或shouldComponentUpdate 这是我的密码: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:[] } }
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()
调用与否并不重要。