Проблема в том, что ваш код работает синхронно. Вы устанавливаете состояние и затем вызываете this.updateDataBase();
, но состояние не будет обновлено в этом контексте. Состояние фактически обновляется, и последующий рендеринг происходит после этого. Вы можете представить, что он работает как очередь, в которой вы вызываете setState
, он принимает к сведению, что необходимо обновить состояние, но все остальное, что находится в очереди, должно выполняться в первую очередь.
Взгляните на это: https://codesandbox.io/s/32n06zlqop?fontsize=14 Если вы нажмете кнопку, она сразу выйдет из состояния, в котором она ложна, а затем снова выйдет из нее в componentDidUpdate
, и вы увидите, что состояние установлено то.
Таким образом, у вас есть два варианта, вы можете вызывать функцию обновления базы данных внутри метода componentDidUpdate
жизненного цикла. Эта функция вызывается после каждого рендера, который может быть вызван изменением состояния.
Или, вы можете передать второй аргумент функции обратного вызова, чтобы установить состояние, которое будет вызываться после того, как состояние было фактически установлено. Вероятно, это будет самая элегантная версия:
this.setState({
check: true,
saved:[...this.state.saved, article]
}, this.updateDataBase)