如何解决使用通用函数更新状态后不重新渲染的问题
How to fix not re-rendering issue after updating state using a generic function
我正在尝试使用一个通用函数更新我状态的 属性 特定 属性,该函数将获取当前状态、属性 名称和 属性 新值作为参数和 returns 状态 属性 的更新值。但是我的 React 组件没有使用更新后的值重新渲染。我到底做错了什么?
使用 chrome 开发者工具,当我检查了新的状态对象时它有更新的值,但是我的反应组件渲染函数没有被再次调用
以下是我在 reducer
中编写的用于更新函数的代码片段:
function App(state = initialState, action) {
switch (action.type) {
case ON_CHANGE:
let newState = Utilities.updateProperty(
state,
action.change.key,
action.change.value
);
return newState;
case DIFFERENT_ACTION:
// TODO implementation
return state;
default:
return initialState;
}
}
下面是Utilities.updateProperty
函数中的代码:
updateProperty(object, key, value) {
let keys = key.split(".");
let obj = object;
for (var i = 0; i < keys.length - 1; i++) {
obj = obj[keys[i]];
}
obj[keys[keys.length - 1]] = value;
return object;
}
当我在写 return newState;
的行添加一个断点时,我可以看到这里的值已完美更新。所以我期待我的组件将重新呈现新值。
如果我如下更改我的 return newState
它会正常工作:
return {
...newState,
...{
now: new Date()
}
};
您需要先传播您的状态,使其成为一个新对象
updateProperty(object, key, value) {
let keys = key.split(".");
let obj = { ...object }; // let obj = object;
for (var i = 0; i < keys.length - 1; i++) {
obj = obj[keys[i]];
}
obj[keys[keys.length - 1]] = value;
return obj; // return object;
}
我会选择这样的东西,它将涵盖所有基础(未经测试)。
import produce from "immer";
import set from "lodash.set";
updateProperty(object, key, value) {
return produce(object, draft => set(draft, key, value))
}
我正在尝试使用一个通用函数更新我状态的 属性 特定 属性,该函数将获取当前状态、属性 名称和 属性 新值作为参数和 returns 状态 属性 的更新值。但是我的 React 组件没有使用更新后的值重新渲染。我到底做错了什么?
使用 chrome 开发者工具,当我检查了新的状态对象时它有更新的值,但是我的反应组件渲染函数没有被再次调用
以下是我在 reducer
中编写的用于更新函数的代码片段:
function App(state = initialState, action) {
switch (action.type) {
case ON_CHANGE:
let newState = Utilities.updateProperty(
state,
action.change.key,
action.change.value
);
return newState;
case DIFFERENT_ACTION:
// TODO implementation
return state;
default:
return initialState;
}
}
下面是Utilities.updateProperty
函数中的代码:
updateProperty(object, key, value) {
let keys = key.split(".");
let obj = object;
for (var i = 0; i < keys.length - 1; i++) {
obj = obj[keys[i]];
}
obj[keys[keys.length - 1]] = value;
return object;
}
当我在写 return newState;
的行添加一个断点时,我可以看到这里的值已完美更新。所以我期待我的组件将重新呈现新值。
如果我如下更改我的 return newState
它会正常工作:
return {
...newState,
...{
now: new Date()
}
};
您需要先传播您的状态,使其成为一个新对象
updateProperty(object, key, value) {
let keys = key.split(".");
let obj = { ...object }; // let obj = object;
for (var i = 0; i < keys.length - 1; i++) {
obj = obj[keys[i]];
}
obj[keys[keys.length - 1]] = value;
return obj; // return object;
}
我会选择这样的东西,它将涵盖所有基础(未经测试)。
import produce from "immer";
import set from "lodash.set";
updateProperty(object, key, value) {
return produce(object, draft => set(draft, key, value))
}