React Hooks дают нам опцию useState, и я всегда вижу сравнения Hooks и Class-State. Но как насчет хуков и некоторых обычных переменных?
Например,
function Foo() {
let a = 0;
a = 1;
return <div>{a}</div>;
}
Я не использовал крючки, и это даст мне те же результаты, что и:
function Foo() {
const [a, setA] = useState(0);
if (a != 1) setA(1); // to avoid infinite-loop
return <div>{a}</div>;
}
Так в чем же разница? Использование крючков в этом случае еще сложнее ... Так зачем начинать его использовать?
javascript
node.js
reactjs
react-hooks
Моше Нагар
источник
источник
let a = 1; return <div>{a}</div>
и вы получите тот же результат.Ответы:
Причина в том, что если вы
useState
передаете представление. Переменные сами по себе изменяют только биты в памяти, и состояние вашего приложения может быть не синхронизировано с представлением.Сравните эти примеры:
В обоих случаях
a
изменения происходят при нажатии, но только приuseState
правильном использовании представления показываетa
текущее значение.источник
a
будет собирать мусор после завершения ее выполнения, а в первом - поскольку она используетuseState
ее, она сохранит значениеa
useRef
если он не хотел повторно визуализировать представление. Остается вопрос, стоит ли ему использовать локальные переменные или ссылки React. Например, если у вас есть тайм-аут, который необходимо очистить, или постоянный http-запрос с использованием axios, сохраняете ли вы тайм-аут или источник axios в переменной или в ссылке React?useRef
(если вы не хотите перерисовывать) илиuseState
(если вы хотите перерисовать). В случае таймеров, поскольку они являются побочными эффектами, они должны быть запущены вuseEffect
ловушку. Если вы хотитеtimerId
только для целей очистки, вы можете оставить его в локальной переменной обработчика . Если вы хотите иметь возможность очистить таймер из другого места в компоненте, вы должны использоватьuseRef
. ХранениеtimerId
в локальной переменной компонента было бы ошибкой, поскольку локальные переменные «сбрасываются» при каждом рендеринге.Обновление состояния заставит компонент повторно выполнить рендеринг снова, но локальные значения - нет.
В вашем случае вы отобразили это значение в своем компоненте. Это означает, что при изменении значения компонент должен быть повторно отображен для отображения обновленного значения.
Так что будет лучше использовать,
useState
чем обычное локальное значение.источник
Ваш первый пример работает только потому, что данные практически никогда не меняются.
setState
Начальная точка использования состоит в том, чтобы перерисовать весь ваш компонент, когда государство изменится. Таким образом, если ваш пример потребовал какого-то изменения состояния или управления, вы быстро поймете, что значения изменений будут необходимы, и чтобы обновить представление значением переменной, вам понадобится состояние и повторное отображение.источник
эквивалентно
Что
useState
возвращает две вещи:если вы позвоните,
setA(1)
вы бы позвонилиthis.setState({ a: 1 })
и запустили повторную визуализацию.источник
Локальные переменные будут сбрасываться при каждом рендеринге после мутации, тогда как состояние будет обновляться:
источник