В React 16.7 есть State Hook, могу ли я использовать функциональный компонент вместо компонента класса в любой ситуации? - PullRequest
0 голосов
/ 04 ноября 2018

В React 16.7 есть State Hook, так что я могу использовать компонент функции вместо компонента класса в любой ситуации, правильно? https://reactjs.org/docs/hooks-state.html

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

useState крюк предназначен для замены this.state в компонентах класса:

this.state = { foo: 1, bar: 2 };

становится либо

const [foo, setFoo] = useState(1);
const [bar, setBar] = useState(2);

или

const [state, setState] = useState({ foo: 1, bar: 2 });

Во втором случае следует учитывать, что setState не объединит свойства состояния с предыдущим состоянием , если это не будет сделано явно:

В отличие от метода setState, найденного в компонентах класса, useState делает не автоматически объединять объекты обновления. Вы можете повторить это поведение путем объединения формы средства обновления функций с распространением объекта Синтаксис:

setState(prevState => ({...prevState, ...updatedValues});

Как объясняется в другом ответе, ограничение состоит в том, что порядок вызовов useState должен быть одинаковым при каждом вызове функционального компонента, потому что этот порядок является единственным способом для структуры идентифицировать состояния компонента.

Могут возникнуть проблемы, если по каким-либо причинам необходимо получить доступ к состоянию вне компонента, например отладка, тестирование или конкретные случаи. Как поясняет документация , предполагается, что состояние функционального компонента проверяется его побочными эффектами, а не утверждается непосредственно.

0 голосов
/ 11 ноября 2018

Вы можете использовать React Hooks + функциональные компоненты для большинства ситуаций в качестве замены для компонентов класса, кроме случаев, когда это необходимо в следующих ситуациях:

  • Определенные методы жизненного цикла - Вам необходимо использовать getSnapshotBeforeUpdate и componentDidCatch жизненные циклы. Как сказал Дэн, нет эквивалентов Крюка необычному getSnapshotBeforeUpdate и componentDidCatch жизненных циклов пока нет.

  • Отладка - Вам нужна хорошая отладка компонентов. Состояния, созданные с помощью useState, не отображаются в настоящий момент как обычное значение ключа в React Devtools. Он отображается в формате, который React использует для внутреннего представления состояния функции.

  • Тестирование - В ферментных тестах вы могли вручную устанавливать состояние тестируемых компонентов. Вы не можете сделать это с помощью хуков состояния, так как состояние находится за пределами компонента. Вы также не можете утверждать состояния компонентов.

0 голосов
/ 04 ноября 2018

На самом деле, есть некоторые правила, когда вы используете hook: не вызывайте Hooks внутри циклов, условий или вложенных функций и не вызывайте Hooks из обычных функций JavaScript.

Вы можете прочитать эти правила и пояснения здесь: https://reactjs.org/docs/hooks-rules.html

А вот официальное объяснение.

Наша цель - чтобы крючки как можно скорее охватили все варианты использования классов. Нет никаких эквивалентов Hook для необычных жизненных циклов getSnapshotBeforeUpdate и componentDidCatch, но мы планируем добавить их в ближайшее время. Для хуков это очень раннее время, поэтому некоторые интеграции, такие как поддержка DevTools или типизация Flow / TypeScript, могут быть еще не готовы. Некоторые сторонние библиотеки также могут быть несовместимы с Hooks на данный момент.

...