[英]Component is not re-rendering on state update
该组件不会在状态更新时呈现,即使mapStateToProps成功执行。
零件:
import React from 'react';
import AddItem from './addItemComponent';
import { connect } from 'react-redux';
import RenderItem from './RenderItem';
class HomeComponent extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<div className="container">
<AddItem />
</div>
<div className="container">
{this.props.Items.length}
</div>
</div>
);
}
}
function mapStateToProps(state) {
return {
Items: state.auth.items
}
}
export default connect(mapStateToProps)(HomeComponent);
减速器:
const ItemsReducers = (state = {}, Action) => {
if (!state.items)
state.items = [];
console.log("inside the reducers", state);
var newState = Object.assign({}, state);
switch (Action.type) {
case 'AddItem':
newState.items.push(Action.payload);
return newState;
break;
default:
return newState;
break;
}
return newState;
}
export default ItemsReducers;
为了避免发生突变,我只克隆对象并执行推入操作。 但是仍然面临问题。 如果我有任何帮助,那会有所帮助。
Object.assign()创建对象的浅表副本,而不是深层副本。 因此,您有突变!
在您的示例中,由于state
已更改,所以mapStateToProps
正在执行,但是items
保持相同的引用。 因此,即使数组的长度已更改,您的旧items
也将与新items
相同。 如果输出未更改,则mapStateToProps
不会重新渲染组件。
您需要复制状态和项目,如下所示:
var newState = Object.assign({}, state);
newStats.items = newState.items.slice();
但这不是使用redux的好方法。
我建议将不可变性帮助程序包与update()一起使用。 它创建对象的副本,而无需更改原始源
import update from 'immutability-helper';
const reducer = (state = {}, action) => {
switch (action.type) {
case: 'addItem':
return !state.items
? update(state, {items: {$set: [action.payload]}})
: update(state, {items: {$push: [action.payload]}})
default:
return state;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.