gpt4 book ai didi

javascript - Redux 不会重新渲染组件

转载 作者:行者123 更新时间:2023-12-01 01:28:11 26 4
gpt4 key购买 nike

我有一个组件,它从 mapStateToProps() 方法获取data。组件的代码是:

    handleClick = () => {
if (this.props.data.status) {
this.props.changeIpStatus(index, !this.props.data.status);

} else {
this.props.changeIpStatus(index, !this.props.data.status);

}
}

render() {
if (this.props.data.status) {
this.switchClasses = `switcher blocked`;
this.dotClasses = `dot blocked`;
} else {
this.switchClasses = `switcher`;
this.dotClasses = `dot`;
}
return (
<div className="block">
<div onClick={this.handleClick} className={this.switchClasses}>
<div className={this.dotClasses}></div>
</div>
</div>
)
}
}

我的 Redux 连接如下所示:

const mapStateToProps = (state) => ({
data: state.ipTable.data.clicks,
})

const mapDispatchToProps = (dispatch) => {
return {
changeIpStatus: (index, status) => {
return dispatch(changeIpStatus(index, status));
},
}
}

export default connect(mapStateToProps, mapDispatchToProps)(BlockSwitcher)

当我单击切换器时,它应该重新渲染,因为数据已更改。我通过控制台日志看到数据已更改。但它不会调用重新渲染。为什么?我的组件有 mapStateToProps ,其数据更改和操作导入正确(已检查)。

更新:这是我的 reducer :

const initialState = {
data: {}
}

const ipReducer = (state = initialState, action) => {
switch (action.type) {
case `SET_CLICKS`:
return {
...state,
data: action.data
}

case `CHANGE_IP_STATUS`:
let newState = Object.assign({}, state);
newState.data.clicks[action.index].status = action.status;
return newState;

default: return state;
}
}

export default ipReducer;

最佳答案

您可以使用 JSON.parse(JSON.stringify(...)) 方法,但请注意,如果您的状态包含不可序列化的属性,那么您会丢失它。

这是一种替代方法。您可以更频繁地看到此方法。

// map the clicks, if index match return the new one with the new status
// if the index does not match just return the current click

const newClicks = state.data.clicks.map((click, index) => {
if (index !== action.index) return click;
return { ...click, status: action.status };
});

// Here, set your new state with your new clicks without mutating the original one

const newState = { ...state, data: { ...state.data, clicks: newClicks } };
return newState;

第二种选择就是这样。在不映射所有点击的情况下,我们可以使用Object.assign来进行点击突变。

const newClicks = Object.assign([], state.data.clicks, {
[action.index]: { ...state.data.clicks[action.index], status: action.status }
});

const newState = { ...state, data: { ...state.data, clicks: newClicks } };
return newState;

关于javascript - Redux 不会重新渲染组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53560285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com