您可以使用动作类型和有效负载作为输入字段名称和值来调度动作,然后仅更改该特定字段。然后你可以Reselect那个特定的属性,它会进一步记忆那个字段的值,因此当其他道具发生变化时不会渲染组件。
所以我的方法是。
dispatch({
type: 'UPDATE_PROFILE_FIELD',
payload: {
'field_name': 'first_name',
'value': 'John Doe',
}
});
然后在减速器上:
switch (action.type) {
case 'UPDATE_PROFILE_FIELD':
const { field_name, value } = action.payload;
// field_name can be first_name, last_name, phone_number
const newState = Object.assign(oldState, { [field_name]: value });
...
...
// Update new state as desired
return newState;
}
然后使用重新选择,我们可以从特定状态中仅选择该字段。
const profileSelector = (state) => state.profile
const getFirstName = (profileSelector, profile) => profile.first_name
现在,我们可以在组件中使用getFirstName()。
另外,我建议使用不可变状态(请参阅 Immerjs),更改原始对象会导致突变问题,从而导致其他问题,例如不必要的重新渲染、未同步的反应状态等。