【发布时间】:2019-10-10 14:14:35
【问题描述】:
我有影响者数据对象。这个对象正在使用FETCH_INFLUENCER 操作从数据库中提取并放入两个不同的对象中:influencer 和 formInfluencer 在 redux 存储中。然后我有动作 SET_INFLUENCER 应该创建新的状态实例并在 redux 中更新 influencer 对象。出于某种原因,它同时更新了influencer 和formInfluencer。我真的很难在这里找到答案,因为我认为我已尽一切努力防止将两个不同的变量指向同一个对象,但它仍然会发生。
减速器:
case 'FETCH_INFLUENCER_FULFILLED':
return { ...state, fetching: false, fetched: true, influencer: action.payload.data, formInfluencer: Object.assign([], action.payload.data) }
case 'SET_INFLUENCER':
return { ...state, influencer: action.payload }
行动:
export function fetchInfluencer(id) {
return {
type: "FETCH_INFLUENCER",
payload: axios.get('/api/influencer/' + id, {headers: {Authorization: 'Bearer ' + localStorage.getItem('token')}})
}
}
export function setInfluencer(influencer) {
return {
type: "SET_INFLUENCER",
payload: influencer
}
}
派送:
handleUserChange(e) {
let influencer = [...this.props.influencer]
influencer[0].user[e.target.name] = e.target.value;
this.props.dispatch(setInfluencer(influencer))
}
将状态映射到道具:
const mapStateToProps = (state) => {
return {
influencer: state.influencers.influencer,
formInfluencer: state.influencers.formInfluencer
}
}
export default connect(mapStateToProps)(InfluencerDetails)
如果您知道为什么会发生这种情况,我很乐意听到答案。
【问题讨论】:
-
influencer[0].user[e.target.name]这会改变 props,这在 React 中是被禁止的。 -
这可能是它更新您商店中的两个对象的原因。
-
我认为用
let influencer = [...this.props.influencer]创建道具副本可以防止变异。那么解决这个问题的方法是什么?如果您有答案或提示,我对此有点想法。 -
这个道具也直接分配给redux
state.influencer而不是state.formInfluencer所以我认为这不应该是一个问题。嗯,我猜我对突变主题有一些误解。 -
influencer = [...this.props.influencer]制作了 this.props.influencer 的 shallow 副本;它的内容仍然与原始引用相同,因此影响者 [0] 仍然与 this.props.influencer[0] 相同的引用,并且变异的影响者 [0].user 仍然会变异该状态。
标签: javascript arrays reactjs redux react-redux