Hooks
-
аналогия
ClassComponentHooksвремя исполнения -
Постепенно привыкнув к этому, я обнаружил, что
Hooksвремя выполнения и生命周期又有些不同。 НапримерcomponentWillReceivePropsКоторый соответствуетHooks? -
Запутался, иди поищи
HooksЧтение статьи на базовом уровне
какAPI, неужели нельзя просто и мило называть по документу,HooksПочему это так сложно?
ReactЧиновник также нашел эту проблему,React Переписать документациюсказал,Reactосновываться наHooksПереписать документацию.
Эта статья в основном включает два аспекта:
-
объяснять
HooksПричина, по которой трудно учиться -
дать обучение
Hooksпредложение
Базовая архитектура React
Его можно обобщить формулойReact:
const UI = fn(state);
视图можно рассматривать как状态проходить через函数отображение.
Взаимодействие пользователя с интерфейсом можно рассматривать как постоянную реализацию этой формулы.
Эта формула слишком коротка, нет объясненияstateОткуда (штат) приходит, давайте расширимся:
const state = reconcile(update);
const UI = fn(state);
-
взаимодействие с пользователем
update(продлить) -
updateпроходить черезreconcileшаги для расчета текущего приложенияstate -
fnБудуstateСопоставлено с просмотром изменений (пользовательский интерфейс)
мы даемfnИмя:commit:
const state = reconcile(update);
const UI = commit(state);
ТакupdateГде оно возникает? Конечно, от взаимодействия с пользователем, например: события кликов.
такReactБазовая архитектура может быть упрощена до трех шагов:
-
взаимодействие с пользователем
update -
state= reconcile(update); -
UI= commit(state);
ClassComponentУчитьHooks
Уровень абстракции для функций жизненного цикла
У нас уже есть полная базовая архитектура, которая управляет обновлениями представлений. Как разработчикам следует использовать эту архитектуру?
Можно провести аналогию с уровнем абстракции компьютера:
高层:应用程序
中层:操作系统
底层:计算机组成架构
вести перепискуReact:
高层:应用程序 ClassComponent生命周期
中层:操作系统 介入架构的API
底层:计算机组成架构 React底层架构
можно увидеть,生命周期函数Он относится к более высокому уровню абстракции. Это также разработано, чтобы облегчить разработчикам начало работы.React.
представьте себеVue2Разработчик собираетсяReactСтек технологий, просто нужна аналогияVueжизненный цикл, чтобы учитьсяReactжизненный цикл.
все это вHooksОднако никаких проблем до прибытия...
Крючки уровней абстракции
HooksОтносится к среднему уровню абстракции. То есть,HooksНепосредственное вмешательство в текущий процесс базовой архитектуры.
高层:应用程序
中层:操作系统 Hooks
底层:计算机组成架构 React底层架构
когда мы используем生命周期函数сравниватьHooks, на самом деле используя高抽象层级вещи для описания低抽象层级вещи.
Животное --> Млекопитающее --> Крупный рогатый скот --> Корова
Ибо человек видел только корову, других животных никогда не видел, как ему объяснить哺乳动物Что это такое?
Именно из-за асимметричного уровня абстракции, по причине生命周期函数Обучение по аналогииHooksстолкнется с проблемами.
Как выучить хуки
теперь, когдаHooks
-
взаимодействие с пользователем
update -
state= reconcile(update); -
UI= commit(state);
Формула управления, давайте объясним несколько общихhook
useState
Например:
function App() {
const [state, updateState] = useState(0);
return <div onClick={() => updateState(state + 1)}></div>;
}
useState
-
законсервированный
state -
Изменять
stateМетодыupdateState
Формула контраста,stateОн принадлежит формуле, рассчитанной на шаге 2:
- state = reconcile(update);
На данный момент вид не обновлен.
пользовательские кликиdivвызыватьupdateState, что соответствует шагу 1 формулы:
- взаимодействие с пользователем
update
так позвониupdateState
когдаreconcileРассчитатьstate
-
UI= commit(state);
useEffect
Например:
useEffect(doSomething, [xx, yy])
useEffectdoSomethingВызывается асинхронно после завершения третьего шага:
-
UI= commit(state);
так вdoSomethingПредставление можно получить внутри функции для завершения обновленного представления.
второй параметр[xx, yy]как зависимость, решилdoSomethingбудет называться.
useLayoutEffect
отличный отuseEffectВызывается асинхронно после выполнения третьего шага,useLayoutEffectбудет выполнен на третьем шагеUIВыполняется синхронно после операции.
useRef
useStateа такжеuseEffect
那么这三个步骤如何交流呢? пройти черезuseRef.
useStateuseLayoutEffectдля третьего шага,useEffectПосле завершения третьего шага.
использоватьuseRef, вы можете достичь цели обмена данными ссылочного типа между различными шагами.
можно увидеть,ReactСоответствие каждому шагу трехэтапного рабочего процесса базовой архитектурыhook, обеспечивая тандем этих трехэтапных рабочих процессовhook.
Разработчикам нужно только пройти базовыйHooksсобранный自定义hook, логика может выполняться на различных этапах процесса выполнения базовой архитектуры.
Обучение снизу вверх ставит телегу впереди лошади?
Некоторые одноклассники опровергнут: учись преждеReactнужно учиться生命周期函数Сроки исполнения, узнайте сейчасHooksнужно учиться底层架构运行流程. Разве это не ставит телегу впереди лошади и не усложняет задачу?
вообще-то нет. Я задам вам несколько вопросов:
-
componentWillReceivePropsПочему он отмечен какunsafe? -
getDerivedStateFromPropsВы использовали его? -
this.setStateСинхронный или асинхронный?
И生命周期函数Сопутствующие вопросы совсем не простые! Многие пользовались несколько летReactПередняя часть не обязательно отвечает вышеизложенному.
Как высокий уровень абстракции,生命周期函数隐藏了太多实现细节。 в то же времяReactСлишком гибкий, не нравитсяVueпройти через模版语言Действия разработчика ограничены.
Результат: другойReactРазработчики пишут всякую чушьClassComponent.
В отличие от底层架构运行流程УчитьHooks:
-
底层架构运行流程то естьReactАбсолютная истина, не скрывающая большей абстракции -
HooksСпецификация написания ограничивает замечательные операции разработчика
Единственная проблема здесь - отсутствие копии с底层Документы отправления. Это тожеReact
ReactДемистификация технологии ReactУчить.
Здесь есть и другие точки зрения.Hooksстатья:
-
от
理念Уровень:Алгебраические эффекты и хуки -
от
微观(код) уровень:Реализация исходного кода всех распространенных хуков