#reactjs #react-hooks #immer.js
#reactjs #реагирующие крючки #immer.js
Вопрос:
Я сохраняю объект узла в состоянии. Когда я нажимаю кнопку, я хочу изменить свойство ‘title’ и запустить обновление компонента для отображения нового значения заголовка. В функциональном компоненте ничего не происходит, он обновляется только в компоненте класса.
компонент класса:
class ClassTest extends Component {
state = {
root: new Node()
};
render() {
const { root } = this.state;
return (
<div>
<div>class component: {root.title}</div>
<button
onClick={() =>
this.setState(
produce((draft) => {
draft.root.title = "title changed";
})
)
}
>
change
</button>
</div>
);
}
}
функциональный компонент:
const FunctionTest = () => {
const [state, setState] = useState({ root: new Node() });
const { root } = state;
return (
<div>
<div>function component: {root.title}</div>
<button
onClick={() =>
setState(
produce((draft) => {
draft.root.title = "title changed";
})
)
}
>
change
</button>
</div>
);
};
Как я могу перенести состояние immer в хуки?
Комментарии:
1. Не уверен, что именно происходит с immer, но если вы добавляете мелкое
title
свойствоstate
, а затем обновляете егоdraft.title = 'new value';
, запускаются изменения и происходит рендеринг. Похоже, проблема связана с вашимnew Node()
экземпляром.2. Ваш код immer хорош, поскольку он будет работать с простым объектом. Вы должны проверить, есть ли у вашего экземпляра узла
state.root
.