Sunrabbit

[React Hook] useState

  • Язык написания: Корейский
  • Страна: Все страныcountry-flag
  • ИТ

Создано: 2024-03-14

Создано: 2024-03-14 01:53

Странно, но в React-сообществе очень любят использовать префикс `use`

useServer, useCallback, useState, useMemo и т.д.

Даже кастомные хуки используют `use`

Откуда это взялось?


useState — известный хук.

Он хранит состояние и перерисовывает компонент при его изменении. Очень просто.

Это всем известный пример.


Мы сказали, что при изменении состояния происходит перерисовка, но какой именно области кода это касается?

Только тега `<p>`? Или же и `<button>`?


Правильный ответ — всего компонента `ExampleComponent`, где вызван `useState`.

Перерисовывается `ExampleComponent`, но

с помощью виртуального DOM сравниваются значения и изменяются только те части, которые действительно изменились.


useState вызывается при каждой перерисовке, как же сохраняется значение?

Ответ кроется в структуре useState.

Это реальный код useState из React.


Из глобального объекта берётся `dispatcher` и вызывается `useState`.

Из этого кода сложно понять структуру.


Если копать глубже, то можно найти следующий код.

Берётся `hook`, функция `set` напрямую связывается с `queue` внутри `hook` с помощью `bind`.

(`bind` связывает `this` с существующей функцией, остальные аргументы передаются как аргументы функции, а возвращается новая функция с привязанным `this`)


Из этого кода всё равно сложно понять причину.

Давайте копнём ещё глубже


Мы видим, что начальное значение присваивается каждый раз. Это не объясняет, как сохраняется состояние.

Давайте копнём ещё глубже. `hook` выглядит подозрительно.

`currentlyRenderingFiber` и `workInProgressHook` — глобальные переменные.

Используя присвоение справа налево, реализован связный список.


Таким образом, структура хука, вероятно, выглядит так:

В начало добавляются новые значения.


Но всё равно непонятно, и после изучения других реализаций useState

оказалось, что не всегда вызывается `mountState`, а при перерисовке вызываются `updateState` и `rerenderState`.

Таким образом, структура такая, как описано выше, и в зависимости от события вызываются разные функции.

Если вы хотите посмотреть код напрямую, то можете найти его в `react/packages/react-reconciler/src/ReactFiberHooks.js`.

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

Создание пользовательских директив в Nuxt.jsВ этой статье описывается, как создавать пользовательские директивы прокрутки в Nuxt.js. Рассматриваются способы использования хуков функций bind, inserted, update, componentUpdated, unbind, а также регистрация плагинов Nuxt.
뚠뚠멍의 생각들
뚠뚠멍의 생각들
뚠뚠멍의 생각들
뚠뚠멍의 생각들

September 28, 2024

[Эффективный Java] Элемент 6. Избегайте ненужного создания объектовНенужное создание объектов приводит к расточительности памяти, поэтому для объектов, таких как строки или логические значения, лучше использовать литералы или статические фабричные методы.
제이온
제이온
제이온
제이온

April 28, 2024

React - kakao не определено, как решить?В этой статье рассматриваются способы решения ошибки "kakao is not defined" при использовании API Карт Kakao в React. Ошибка может быть решена путем объявления объекта kakao вне компонента или использования пользовательского хука.
뚠뚠멍의 생각들
뚠뚠멍의 생각들
뚠뚠멍의 생각들
뚠뚠멍의 생각들

September 2, 2024

[Для неспециалистов, выживание разработчика] 14. Краткое изложение часто задаваемых вопросов на техническом собеседовании для начинающих разработчиковМы обобщили и систематизировали часто задаваемые технические вопросы на собеседовании для начинающих разработчиков (области памяти, структуры данных, базы данных и т. д.). Надеемся, что это поможет вам подготовиться к собеседованию по разработке.
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

April 3, 2024

Как кэшировать ответы API + кэширование веб-страницСтатья о методах кэширования веб-страниц и ответов API. Рассматриваются различные методы кэширования с использованием хранилища браузера, Axios interceptor, фреймворка Nuxt, Nginx и другие, а также преимущества и недостатки кэширования на стороне сервера
뚠뚠멍의 생각들
뚠뚠멍의 생각들
뚠뚠멍의 생각들
뚠뚠멍의 생각들

September 29, 2024