Хорошо, хотя технически это работает, это сбивает с толку и может привести к ошибкам при добавлении дополнительных материалов. Причина, по которой это работает, заключается в том, что useEffect
запускается после изменений состояния, а изменение значений ref не вызывает повторного рендеринга. Лучшим способом было бы обновить значение ref в обработчике onChange
, а не в эффекте. Но код, который вы разместили, работает следующим образом:
- Изначально оба будут пустыми
- Пользователь что-то вводит, вызывая изменение состояния через
setValue
- Это вызывает повторную визуализацию, поэтому
{value}
является новым значением, но, поскольку ссылка еще не была обновлена, {prevValue.current}
по-прежнему отображается как старое значение.
- Затем, после рендеринга, эффект запускается, поскольку он имеет
value
в качестве зависимости. Таким образом, этот эффект обновляет ссылку, чтобы содержать значение состояния CURRENT.
- Однако, поскольку изменение значения ref не вызывает повторного рендеринга, новое значение не отражается в том, что рендерится.
Итак, как только эти шаги завершатся, тогда да, технически значение состояния и ref - это одно и то же значение. Однако, поскольку изменение ссылки не привело к повторному рендерингу, оно по-прежнему показывает старое значение ссылки в том, что рендерится.
Это, очевидно, не очень хорошо, потому что, если что-то еще запускает повторную визуализацию, например, если у вас есть другой вход со значением подключенного состояния, тогда да, {prevValue.current}
затем повторно отобразит как текущий {value}
, а затем технически это неправильно, потому что это покажет текущее значение, а не предыдущее значение.
Таким образом, хотя технически он работает в этом случае использования, он будет подвержен ошибкам при добавлении большего количества кода, и затрудняет оборачивание головы вокруг
person
Jayce444
schedule
19.01.2021