так какReact
Разработчики, можете ли вы ответить на следующие два вопроса:
- Для следующих функциональных компонентов:
function Child() {
useEffect(() => {
console.log('child');
}, [])
return <p>hello</p>;
}
function Parent() {
useEffect(() => {
console.log('parent');
}, [])
return <Child/>;
}
function App() {
useEffect(() => {
console.log('app');
}, [])
return <Parent/>;
}
оказывать<App/>
Каков порядок печати консоли?
- Вызываются ли следующие две функции обратного вызова одновременно?
// componentDidMount生命周期钩子
class App extends React.Component {
componentDidMount() {
console.log('hello');
}
}
// 依赖为[]的useEffect
useEffect(() => {
console.log('hello');
}, [])
Отвечать:
👉向右滑动翻看答案 1. child -> parent -> app
2. 不同
На самом деле эти два вопроса рассматриваются отдельно:
-
useEffect
исполнительный лист -
useEffect
Как принять участиеReact
процесс работы
В этой статье мы углубимся в исходный код и познакомим вас с этими знаниями.
Это оuseEffect
все из.
Порядок выполнения useEffect
React
Исходный код можно разделить на три части:
- планировщик: расписание обновлений
- Координатор: решить, что обновить
- визуализатор: визуализирует обновленный контент в представлении
Среди них только渲染器
Выполняется операция визуализации представления.
Только для среды браузера渲染器
сделал бы что-то вродеappendChild
,insertBefore
ТакойDOM
работать.
协调器
Как вы решаете, что обновлять?
Ответ: он будет соответствовать контенту, который должен быть обновленfiber
(можно понимать как虚拟DOM
) отмечены.
эти отмеченыfiber
сформирует связанный списокeffectList
.
渲染器
пройдетeffectList
, выполните операцию, соответствующую отметке.
-
Например
Placement
отметка, соответствующая вставкеDOM
-
Например
Update
Отметьте соответствующее обновлениеDOM
Атрибуты
useEffect
Также следует тому же принципу работы:
-
Когда запускается обновление,
FunctionComponent
выполняется, выполняется до тех пор, покаuseEffect
будет судить о его втором параметре, когдаdeps
Есть ли изменение. -
если
deps
изменить, тоuseEffect
вести перепискуFunctionComponent
изfiber
Это будет отмеченоPassive
(т.е. тег, который должен выполнить USEFECHECT). -
существует
渲染器
в, траверсeffectList
пройти кfiber
, нашелPassive
отметить, затем выполнитьuseEffect
изdestroy
(которыйuseEffect
функция возвращаемого значения функции обратного вызова) иcreate
(которыйuseEffect
Перезвоните).
Среди них первые два шага происходят в协调器
середина.
так,effectList
Порядок сборки такойuseEffect
исполнительный порядок.
effectList
协调器
Рабочий процесс заключается в использовании遍历
осуществленный递归
. Так что его можно разделить на递
а также归
два этапа.
мы знаем,递
идет от корневого узла к листовым узлам,归
от листового узла до корневого узла.
effectList
Сборка происходит в归
сцена. так,effectList
Порядок также от листовых узлов до самого верха.
useEffect
вести перепискуfiber
так какeffectList
Узел в , логика вызова которого также следует归
обработать.
Теперь у нас достаточно знаний, чтобы ответить на первый вопрос:
из-за归
этап изChild
прибытьParent
прибытьApp
, поэтому соответствующийeffectList
Тоже в том же порядке.
такuseEffect
Функции обратного вызова выполняются в том же порядке.
Не используйте аналогию с хуком жизненного цикла для хука
мы новичкиhook
, буду использоватьClassComponent
Аналогия с крючком жизненного циклаhook
время исполнения.
Так учит даже официальный сайт.
Однако, как мы уже знаем из вышеизложенного,React
Выполнение следующее:
调度 -- 协调 -- 渲染
Принцип работы, связанный с рендерингом, следующий:
构建effectList -- 遍历effectList执行对应操作
весь процесс и生命周期钩子
Это не имеет значения.
Фактически生命周期钩子
Просто функция ловушки, прикрепленная к этому процессу.
Итак, лучше начать сReact
Запустите процесс, чтобы понятьuseEffect
время исполнения.
оказывать
Согласно процессу,effectList
Будет в渲染器
обработано в.
дляuseEffect
Например, пересечениеeffectList
, найдет все содержащиеPassive
отмеченfiber
.
выполнить соответствующееuseEffect
изdestroy
.
всеdestroy
После выполнения выполнить всеcreate
.
Весь процесс выполняется асинхронно после рендеринга страницы.
Чтобы ответить на второй вопрос:
еслиuseEffect
изdeps
для[]
,из-заdeps
не изменится, что соответствуетfiber
только вmount
отмечено, когдаPassive
.
Это похожеcomponentDidMount
из.
Тем не менее, обработкаPassive
effect
выполняется асинхронно после завершения рендеринга, аcomponentDidMount
выполняются синхронно после рендеринга, поэтому они разные.
useEffect и useLayoutEffect
а такжеcomponentDidMount
более похожиuseLayoutEffect
, он будет выполняться синхронно после завершения рендеринга.
ВотОнлайн-демонстрация, вы можете поставитьDemo
серединаuseLayoutEffect
заменитьuseEffect
, чтобы увидеть их различия.
Суммировать
Благодаря этой статье мы узналиuseEffect
полный процесс исполнения.
В этой серии статей будет по-прежнему использоваться метод примеров + исходный код для интерпретации часто используемых бизнес-приложений.React
характеристика.
Электронные книги с открытым исходным кодомДемистификация технологии ReactЛегко изучить исходный код React