Некоторое время назад я подготовился к интервью и многое обобщил.Ниже приведены некоторые из резюме, которые я обобщил при подготовке к React-интервью, объединив мой реальный опыт интервью и мои предыдущие статьи по анализу исходного кода.React
Частые вопросы на собеседовании.
В прошлом статьи, которые я писал по анализу исходного кода, мало кто читал, потому что в большинстве случаев вы можете понять принципы и решить практические проблемы, не углубляясь в исходный код. вопросы интервью, чтобы вы могли лучше получить больше прибыли за меньшее время.
Поскольку это обсуждается с точки зрения вопросов для интервью, некоторые моменты могут быть не очень подробными. Я разместил соответствующие ссылки под вопросами. Если вы хотите глубже понять, пожалуйста, нажмите на эти статьи.
Из-за большого количества тем она разделена на верхнюю и нижнюю части.В этой статье мы сначала обсудим следующие 19 тем:
React
Каковы жизненные циклы и какие изменения произошли в жизненном цикле версии 16?setState
Это синхронно или асинхронно?почему иногда несколько раз подряд
setState
Работает только один раз?React
Как реализовать собственный механизм событий?Зачем
React
событие, чтобы связать себяthis
?Родные события и
React
разница событий?React
Для чего предназначено синтетическое событие?React
и каков порядок выполнения нативных событий? Можно ли смешать?虚拟Dom
что это такое?虚拟Dom
Сравнивать普通Dom
Быстрее?虚拟Dom
середина?typeof
Какова роль атрибутов?React
Каков процесс рендеринга компонента?Почему это должно быть включено в код
React
?Зачем
React
Первая буква компонента должна быть заглавной?React
рендеринг真实Dom
Какие оптимизации производительности были сделаны?Что такое компонента более высокого порядка? Как добиться?
HOC
Каковы практические сценарии применения в бизнес-сценариях?Компоненты высшего порядка (
HOC
)а такжеMixin
Каковы сходства и различия?Hook
Каковы преимущества?
Каковы жизненные циклы React и какие изменения произошли в жизненном цикле 16-й версии?
15 Жизненный цикл
фаза инициализации
constructor
КонструкторgetDefaultProps
props
По умолчаниюgetInitialState
state
По умолчаниюгорная сцена
componentWillMount
Вызывается перед инициализацией и визуализацией компонентаrender
Рендеринг компонентовcomponentDidMount
компонент монтируется наDOM
звонить послефаза обновления
componentWillReceiveProps
компонент получит новыеprops
позвонить доshouldComponentUpdate
Нужно ли обновлять компонентcomponentWillUpdate
Вызывается перед обновлением компонентаrender
Рендеринг компонентовcomponentDidUpdate
Вызывается после обновления компонентаэтап удаления
componentWillUnmount
Вызывается перед выгрузкой компонента
16 Жизненный цикл
фаза инициализации
constructor
КонструкторgetDefaultProps
props
По умолчаниюgetInitialState
state
По умолчаниюгорная сцена
staticgetDerivedStateFromProps(props,state)
render
componentDidMount
getDerivedStateFromProps
: Компонент вызывается каждый разrerender
, в том числе после сборки компонента (виртуальныйdom
После этого фактическиdom
перед монтажом), каждый раз новыйprops
илиstate
после; каждый раз, когда получаются новые реквизиты, объект возвращается как новыйstate
, возврат null означает, что обновление не требуетсяstate
;сотрудничатьcomponentDidUpdate
, может покрытьcomponentWillReceiveProps
все виды использования
фаза обновления
staticgetDerivedStateFromProps(props,state)
shouldComponentUpdate
render
getSnapshotBeforeUpdate(prevProps,prevState)
componentDidUpdate
getSnapshotBeforeUpdate
: Время срабатывания:update
когда это произойдет, вrender
После этого в компонентеdom
Перед рендерингом возвращает значение какcomponentDidUpdate
Третий параметр ;fitcomponentDidUpdate
, может покрытьcomponentWillUpdate
все виды использования
этап удаления
componentWillUnmount
обработка ошибок
componentDidCatch
React16
Новый жизненный цикл устарелcomponentWillMount、componentWillReceivePorps,componentWillUpdate
недавно добавленныйgetDerivedStateFromProps、getSnapshotBeforeUpdate
для замены трех устаревших функций ловушек.
React16
Эти три функции ловушек не удаляются, но их нельзя смешивать с вновь добавленными функциями ловушек.React17
Эти три хука-функции будут удалены, и будет добавлена обработка ошибок (componentDidCatch
)
Является ли setState синхронным или асинхронным?
Жизненный цикл и синтетические события
существуетReact
в жизненном цикле и синтетических событиях,React
все еще в своем механизме обновления, независимо от того, сколько раз он вызываетсяsetState
, не будет выполнять обновление немедленно, а сохранит обновленное_pendingStateQueue
, сохраните компонент, который нужно обновить, вdirtyComponent
.
При выполнении последнего механизма обновления, на примере жизненного цикла, все компоненты, то есть компонент верхнего уровняdidmount
затем установит пакетный флаг наfalse
. будет вывезенdirtyComponent
компоненты в и_pendingStateQueue
серединаstate
обновить. Это гарантирует, что компонент не будет повторно отображаться несколько раз.
componentDidMount() { this.setState({ index: this.state.index + 1 }) console.log('state', this.state.index); }
Итак, как и в приведенном выше коде, когда мы выполняемsetState
получить это немедленноstate
, в настоящее время не могу получить обновленноеstate
, потому что вReact
В пакетном механизме ,state
Он временно сохраняется, и после того, как механизм пакетной обработки завершится, он будет равномерно обновляться.
так.setState
не является асинхронным как таковым, ноReact
Пакетный механизм создает иллюзию асинхронности.
В асинхронном коде и нативных событиях
componentDidMount() { setTimeout(() => { console.log('调用setState'); this.setState({ index: this.state.index + 1 }) console.log('state', this.state.index); }, 0); }
Как и в приведенном выше коде, когда мы вызываем асинхронный кодsetState
когда, согласноJavaScript
Асинхронный механизм сначала временно сохранит асинхронный код и выполнит его после выполнения всего синхронного кода.React
Механизм дозирования завершен, флаг обработки установлен наfalse
, затем позвонитеsetState
Вы можете выполнить обновление немедленно и получить обновленный результат.
Вызывается в родном событииsetState
не уйдетReact
Механизм пакетной обработки, поэтому последние результаты можно получить сразу.
Лучшие практики
setState
Второй параметр принимает функцию, котораяReact
вызывается после выполнения механизма пакетной обработки, поэтому вы хотите вызватьsetState
Чтобы получить обновленное значение сразу после этого, получите его в этой функции обратного вызова.
this.setState({ index: this.state.index + 1 }, () => { console.log(this.state.index); })
Рекомендуемое чтение:Изучите механизм выполнения setState из практических задач.
Почему иногда setState несколько раз подряд вступает в силу только один раз?
Например, следующий код выводит один и тот же результат дважды:
componentDidMount() { this.setState({ index: this.state.index + 1 }, () => { console.log(this.state.index); }) this.setState({ index: this.state.index + 1 }, () => { console.log(this.state.index); }) }
Причина в том,React
будет группировать несколько сохраненных в механизмеsetState
Чтобы объединить, давайте посмотримReact
в исходном коде_assign
функция, похожая наObject
изassign
:
_assign(nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial);
Если объект передан, он, очевидно, будет объединен один раз, поэтому приведенный выше код выводит один и тот же результат дважды:
Object.assign( nextState, {index: state.index+ 1}, {index: state.index+ 1})
Уведомление,assign
В функции выполняется специальная обработка функции.Первым обрабатываемым параметром является функция, и обрабатываются параметры функции.preState
является результатом предыдущего слияния, поэтому результат вычисления точен:
componentDidMount() { this.setState((state, props) => ({ index: state.index + 1 }), () => { console.log(this.state.index); }) this.setState((state, props) => ({ index: state.index + 1 }), () => { console.log(this.state.index); }) }
Таким образом, приведенный выше код выводит два разных результата.
Лучшие практики
React
для нескольких последовательныхsetState
для слияния, если вы хотите использовать последний раз сразуsetState
После результата приступайте к следующему разуsetState
, может позволитьsetState
Принимает функцию вместо объекта. Эта функция использует предыдущуюstate
В качестве первого параметра значение, когда было применено это обновление.props
как второй параметр.
Как React реализует собственный механизм событий?
React
Событие не привязано к реальностиDom
На узле, но через прокси событий, в самом внешнемdocument
Единое распределение событий.
Когда компоненты смонтированы и обновлены:
пройти через
lastProps
,nextProps
Чтобы определить, следует ли добавлять или удалять события, вызовите методы регистрации и удаления событий соответственно.передача
EventPluginHub
изenqueuePutListener
для хранения событийПолучать
document
объект.По названию события (например,
onClick
,onCaptureClick
), чтобы определить, следует ли всплывать или захватывать.определить, есть ли
addEventListener
метод, в противном случае используйтеattachEvent
(совместимо с IE).Дать
document
Зарегистрируйте обратный вызов собственного события какdispatchEvent
(унифицированный механизм распределения событий).
Инициализация события:
EventPluginHub
Ответственный за управлениеReact
синтетическое событиеcallback
, Так и будетcallback
сохранить вlistenerBank
, а также сохраняетPlugin
.Получить уникальный идентификатор элемента, привязанного к событию
key
.Буду
callback
Уникальная идентификация элемента на основе типа событияkey
сохранить вlistenerBank
середина.listenerBank
Структура:listenerBank[registrationName][key]
.
Когда событие срабатывает:
вызывать
document
Регистрация обратных вызовов для нативных событийdispatchEvent
Получить элемент, который запускает событие на самом глубоком уровне
Пройдите все родительские элементы этого элемента и обработайте каждый уровень элементов по очереди.
Создайте синтетическое событие.
Сохраните синтетические события на каждом уровне в
eventQueue
в очереди событий.траверс
eventQueue
.пройти через
isPropagationStopped
Определяет, выполняет ли текущее событие метод предотвращения всплытия.Если всплытие предотвращено, остановите обход, в противном случае пропустите
executeDispatch
Выполнение синтетических событий.Отпустите событие о завершении обработки.
React
Переопределено в собственном синтетическом событииstopPropagation
метод, будетisPropagationStopped
Установить какtrue
, а затем решить, продолжать ли выполнение в соответствии с этим обходом в процессе обхода каждого уровня событий. ЭтоReact
Самореализованный барботажный механизм.
Рекомендуемое чтение:[Подробно о реакции] Механизм событий React
Почему событие React должно связывать это само?
В упомянутом выше потоке обработки событийReact
существуетdocument
Единое распределение событий наdispatchEvent
Моделируйте всплытие и захват событий, вызывая события на всех уровнях в цикле.
существуетReact
В исходном коде, когда будет вызван конкретный обработчик события, он будет вызванinvokeGuardedCallback
метод.
function invokeGuardedCallback(name, func, a) { try { func(a); } catch (x) { if (caughtError === null) { caughtError = x; } }}
Видно, что обработчик события вызывается напрямую, а вызываемый компонент не указывается, поэтому он получается напрямую без ручной привязки.this
неточен, поэтому нам нужно вручную привязать текущий компонент кthis
начальство.
Разница между собственными событиями и событиями React?
React
События названы верблюжьим регистром, а не строчными.пройти через
JSX
Вы передаете функцию в качестве обработчика события, а не строка.существует
React
в вы не можете вернутьсяfalse
чтобы предотвратить поведение по умолчанию. нужно вызывать явноpreventDefault
.
Что такое синтетические события React?
React
согласно сW3C
Спецификация определяет параметры каждого обработчика событий, синтетического события.
Обработчик события доставитSyntheticEvent
, который представляет собой встроенную кросс-браузерную оболочку событий. Он имеет тот же интерфейс, что и собственные события браузера, в том числеstopPropagation()
а такжеpreventDefault()
, они работают одинаково во всех браузерах.
React
СинтетическийSyntheticEvent
Используется пул событий, который может значительно сэкономить память без частого создания и уничтожения объектов событий.
Кроме того, независимо от того, какая среда браузера используется, браузер будет единообразно создавать тип события как синтетическое событие, чтобы достичь цели совместимости браузера.
Каков порядок выполнения React и нативных событий? Можно ли смешать?
React
Все событияdocument
для единой раздачи. когда правдаDom
После запуска события оно всплывает доdocument
ПослеReact
событие обрабатывается.
Таким образом, собственное событие будет выполняться первым, а затем выполнятьсяReact
Синтетические события, окончательное исполнение действительно вdocument
события, установленные на
React
Лучше не смешивать события и нативные события. Если выполняется в нативном событииstopPropagation
метод, приведет к другимReact
Недействительность события. потому что события для всех элементов не смогут всплывать доdocument
на, ведущий ко всемуReact
События не будут запущены. .
Что такое виртуальный дом?
в родномJavaScript
В программе мы непосредственноDOM
создавать и изменять, в то время какDOM
Элементы взаимодействуют с нашим приложением через события, которые мы слушаем.
а такжеReact
сначала преобразует ваш код вJavaScript
объект, то этоJavaScript
Затем объекты превращаются в реальныеDOM
. этоJavaScript
объекты называются виртуальнымиDOM
.
Когда нам нужно создать или обновить элементы,React
Сначала сделайте этоVitrualDom
объекты создаются и изменяются, а затемVitrualDom
Объекты визуализируются в реальный DOM.
когда нам нужноDOM
При мониторинге событий сначалаVitrualDom
следить за событиями,VitrualDom
будет родной проксиDOM
события, на которые нужно реагировать.
Рекомендуемое чтение:[Углубленное реагирование] Углубленный анализ процесса рендеринга и характеристик виртуального DOM.
Действительно ли виртуальный дом быстрее, чем обычный дом?
Во многих статьях говоритсяVitrualDom
Его можно улучшить, что на самом деле очень налицо.
Прямое управлениеDOM
Без сомнения, это очень требовательно к производительности. ноReact
использоватьVitrualDom
Также не обойтись без операцииDOM
из.
Если это первый рендер,VitrualDom
Нет никакого преимущества, даже если он выполняет больше вычислений и потребляет больше памяти.
VitrualDom
Преимущество в том, чтоReact
изDiff
Алгоритмы и стратегии пакетной обработки,React
Перед обновлением страницы способ обновления и рендеринга рассчитывается заранее.DOM
. По сути, этим процессом расчета мы непосредственно оперируемDOM
Можно также судить и осознавать это самим, но это обязательно отнимет много сил и времени, а то, что мы делаем сами, зачастую не так хорошо, какReact
OK. Итак, в этом процессеReact
Помогли нам "улучшить производительность".
Так что я больше склоняюсь к тому,VitrualDom
Помогает нам повысить эффективность разработки, помогает нам рассчитать, как эффективнее обновлять при повторном рендеринге, а неDOM
Эксплуатация быстрее.
Какова роль атрибута ?typeof в виртуальном Доме?
ReactElement
есть один?typeof
Атрибут, ему присвоеноREACT_ELEMENT_TYPE
:
var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' && Symbol.for && Symbol.for('react.element')) || 0xeac7;
видимый,?typeof
ЯвляетсяSymbol
Переменная типа, которая предотвращаетXSS
.
Если на вашем сервере есть уязвимость, которая позволяет пользователям хранить произвольныеJSON
объект, а клиентский код ожидает строку, что может стать проблемой:
// JSONlet expectedTextButGotJSON = { type: 'div', props: { dangerouslySetInnerHTML: { __html: '/* put your exploit here */' }, },};let message = { text: expectedTextButGotJSON };<p> {message.text}</p>
JSON
нельзя хранить вSymbol
переменная типа.
ReactElement.isValidElement
функция для определенияReact
Является ли компонент действительным, ниже приводится его конкретная реализация.
ReactElement.isValidElement = function (object) { return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;};
видимыйReact
будет отображаться без?typeof
Идентификация и компоненты, не прошедшие проверку правил, отфильтровываются.
когда ваша среда не поддерживаетSymbol
час,?typeof
назначается как0xeac7
, почему,React
Разработчик дал ответ:
0xeac7
немного похожеReact
.
Каков процесс рендеринга компонентов React?
-
использовать
React.createElement
илиJSX
записыватьReact
компоненты, практически всеJSX
В конечном итоге код будет преобразован вReact.createElement(...)
,Babel
Помогли нам в процессе этого преобразования. -
createElement
функциональная параkey
а такжеref
и т. д. специальныеprops
обработать и получитьdefaultProps
по умолчаниюprops
Назначьте назначения и обработайте входящие дочерние узлы и, наконец, создайтеReactElement
объект (так называемый виртуальныйDOM
). -
ReactDOM.render
будет генерировать виртуальныйDOM
Рендеринг в указанный контейнер, который принимает пакетную обработку, транзакции и другие механизмы и оптимизирует производительность определенных браузеров и, наконец, преобразует его в реальныйDOM
.
Почему React нужно внедрять в код?
JSX
Просто дляReact.createElement(component,props,...children)
Синтаксический сахар, обеспечиваемый данным способом.
всеJSX
В конечном итоге код будет преобразован вReact.createElement(...)
,Babel
Помогли нам в процессе этого преобразования.
так используетсяJSX
код должен быть импортированReact
.
Почему компоненты React должны писаться с большой буквы?
babel
будет оцениваться во время компиляцииJSX
Первая буква компонента в, когда первая буква строчная, считается нативнойDOM
Этикетка,createElement
Первая переменная компилируется в строку, когда первая буква заглавная, считается пользовательским компонентом,createElement
Первая переменная компилируется как объект;
Какие оптимизации производительности делает React при рендеринге реального Dom?
существуетIE(8-11)
а такжеEdge
В браузере узел, вставленный в откровение, которое намного эффективнее, чем вставляя полное последовательное дерево узла.
React
пройти черезlazyTree
,существуетIE(8-11)
а такжеEdge
В других браузерах по очереди отображается один узел, а в других браузерах весьDOM
Структура строится, а затем вставляется в контейнер целиком.
И, при рендеринге узлов по отдельности,React
также считаетсяfragment
и другие специальные узлы, эти узлы не будут вставляться в рендеринг один за другим.
Что такое компонента более высокого порядка? Как добиться?
Компоненты более высокого порядка можно рассматривать какReact
Реализация шаблона декоратора, компонент высшего порядка — это функция, которая принимает компонент в качестве параметра и возвращает новый компонент.
Компоненты высшего порядка (
HOC
)ДаReact
Расширенные методы в , чтобы повторно использовать логику компонента. Но компоненты более высокого порядка сами по себе неReactAPI
. Это всего лишь модель, котораяReact
Неизбежно возникает его собственная композиционная природа.
function visible(WrappedComponent) { return class extends Component { render() { const { visible, ...props } = this.props; if (visible === false) return null; return <WrappedComponent {...props} />; } }}
Приведенный выше код представляет собойHOC
Простое приложение функции принимает компонент в качестве параметра и возвращает новый компонент, который может получитьvisible props
,согласно сvisible
Значение, определяющее, отображать ли видимый.
Мы можем реализовать компоненты более высокого порядка двумя способами:
Риелтером
Функция возвращает компонент, который мы определяем сами, а затем вrender
возвращает компонент для переноса, чтобы мы могли проксировать все входящиеprops
, и решить, как визуализировать. Фактически, компонент более высокого порядка, сгенерированный таким образом, является родительским компонентом исходного компонента. Вышеприведенная функцияvisible
только одинHOC
Как реализован прокси свойства.
function proxyHOC(WrappedComponent) { return class extends Component { render() { return <WrappedComponent {...this.props} />; } }}
Усовершенствованные элементы по сравнению с родными компонентами:
Действует на все входящие
props
Жизненный цикл активного компонента
операционные компоненты
static
методПолучать
refs
обратное наследование
Возвращает компонент, который наследует исходный компонент, вrender
вызвать исходный компонентrender
. Поскольку исходный компонент наследуется, к исходному компоненту можно получить доступ через этот生命周期、props、state、render
и т. д., он может манипулировать большим количеством свойств, чем прокси-сервер свойств.
function inheritHOC(WrappedComponent) { return class extends WrappedComponent { render() { return super.render(); } }}
Усовершенствованные элементы по сравнению с родными компонентами:
Действует на все входящие
props
Жизненный цикл активного компонента
операционные компоненты
static
методПолучать
refs
оперативный
state
Может отображать угон
Рекомендуемое чтение:[Углубленное реагирование] От Mixin до HOC и Hook
Каковы практические сценарии применения HOC в бизнес-сценариях?
HOC
Функции, которые можно реализовать:
Рендеринг комбинации
условный рендеринг
действовать
props
Получать
refs
государственное управление
действовать
state
рендеринг угона
HOC
Практические сценарии применения в бизнесе:
управление журналом
Контроль доступа
двусторонняя привязка
проверка формы
Для конкретной реализации, пожалуйста, обратитесь к моей статье: https://juejin.cn/post/6844903815762673671
Каковы сходства и различия между компонентами высшего порядка (HOC) и миксинами?
Mixin
а такжеHOC
можно использовать для решенияReact
проблема повторного использования кода.
Картинка взята из интернета
Mixin
Могут быть взаимозависимыми и связанными, что не способствует сопровождению кода.разные
Mixin
методы могут конфликтовать друг с другомMixin
Очень часто компонент ощутим и даже нуждается в обработке, что лавинообразно увеличивает сложность кода.
а такжеHOC
Возникновение этих проблем можно решить:
Компонент более высокого порядка — это чистая функция без побочных эффектов, и каждый компонент более высокого порядка не будет зависеть и связываться друг с другом.
Компоненты более высокого порядка также могут вызывать конфликты, но мы можем избежать такого поведения, придерживаясь соглашений.
Компонентам более высокого порядка все равно, как и почему используются данные, а обернутому компоненту все равно, откуда берутся данные. Добавление компонентов более высокого порядка не увеличит нагрузку на исходные компоненты.
В чем преимущества крючков?
Уменьшите риск повторного использования логики состояния
Hook
а такжеMixin
Есть определенные сходства в использовании, ноMixin
Введенные логика и состояние могут перекрывать друг друга, и несколькоHook
Они не влияют друг на друга, что избавляет нас от необходимости сосредотачиваться на предотвращении конфликтов, избегающих логического повторного использования. использовать без соблюденияHOC
Также могут быть некоторые конфликты, такие какprops
Переопределить и т. д., используйтеHook
Этих проблем можно избежать.
Избегайте гнездования в аду
интенсивное использованиеHOC
В случае очень глубокой вложенности кода используйтеHOC
, мы можем добиться повторного использования логики плоского состояния и избежать большого количества вложенных компонентов.
Сделайте компоненты более понятными
В использованииclass
Когда компоненты строят нашу программу, каждый из них имеет свое собственное состояние.Сложность бизнес-логики заставляет эти компоненты становиться все больше и больше, и в каждом жизненном цикле будет вызываться все больше и больше логики, что усложняет ее обслуживание. использоватьHook
, что позволяет в большей степени изолировать общую логику и разделить компонент на более мелкие функции вместо принудительного разделения на основе методов жизненного цикла.
Используйте функции вместо классов
Вместо функции напишитеclass
Возможно, вам потребуется освоить больше знаний, и тем больше моментов, на которые вам нужно обратить внимание, таких какthis
Указывать, связывать события и т. д. Кроме того, компьютер понимаетclass
Быстрее, чем понять функцию.Hooks
так что вы можетеclasses
использовать большеReact
новые особенности.
Следующее уведомление:
ReactDiff
Какова стратегия алгоритма?React
серединаkey
Какова роль?ReactFiber
что это такое? Зачем вносить?Зачем рекомендовать в
componentDidMount
Инициировать сетевой запрос?React
Оптимизация кода?React
Каковы принципы проектирования компонентов?Redux
Каков основной принцип?что
Redux
промежуточное ПО?Reduxconnect
Стратегия реализации функции?Mox
Каков основной принцип?Redux
а такжеMobx
Сходства и различия, как выбрать?
перепечатыватьПосмотреть исходный текст