Проблема
Проблема заключается в порядке, в котором применяются операции и как работает приращение. В вашем случае это (грубо говоря, на самом деле происходит больше, например, GetValue
абстрактные операции) следующим образом:
- Внутренний
[[Get]]
метод вызывается для this.state.count
- Внутренний
[[Set]]
метод вызывается на this.state.count
с результатом шага 1 + 1 - Внутренний
[[Set]]
метод вызывается на ({}).count
со старым значением
Таким образом, после шага 3 у вас есть { count: 1 }
в состоянии и ваш объект как { count: 0 }
setState
Под капотом setState
, React делает следующее (опять примерно):
Вызывает
enqueueSetState
с объектом из шага 3 компонента
updater
, который помещает его в очередь обновления состояния. Когда состояние обновляется,
Object.assign()
вызывается для старого состояния в al oop обход новых частичных состояний, следовательно, переопределяя
count
на
0
.
Решение
Как уже упоминалось в комментариях, переключитесь на приращение префикса, как на шаге 3 возвращаемым значением будет новое значение:
{ count : ++this.state.count }
Ссылка
- Увеличение ссылки на MDN
- Внутренние методы spe c
- Приращение постфикса spe c
- Приращение префикса spe c
Object.assign()
ссылка на MDN