изменение свойства immer не вызывает обновления в функциональном компоненте

#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>
  );
};
 

демонстрация code sandbox

Как я могу перенести состояние immer в хуки?

Комментарии:

1. Не уверен, что именно происходит с immer, но если вы добавляете мелкое title свойство state , а затем обновляете его draft.title = 'new value'; , запускаются изменения и происходит рендеринг. Похоже, проблема связана с вашим new Node() экземпляром.

2. Ваш код immer хорош, поскольку он будет работать с простым объектом. Вы должны проверить, есть ли у вашего экземпляра узла state.root .