Это ответ, который я разобрал сам.Пожалуйста, дайте мне несколько советов, пожалуйста, укажите на неправильные, и пришлите мне копию других популярных тестовых сайтов (не ограниченных и реагирующих)~ Спасибо
Интервью Вопрос Ответы
-
React
-
Представляем Redux, какую проблему он в основном решает? Как выглядит поток данных? Как управлять несколькими компонентами, используя одно и то же состояние?
- Redux — это контейнер состояний, решающий проблему разделения состояний между компонентами, реализующий многокомпонентное взаимодействие, а также являющийся механизмом MVC.
- Модули Redux4
- view — отправляет действие при изменении состояния компонента
- Действие: Создайте объект действия, описывающий изменение состояния, и передайте его в хранилище.
- store: получить объект действия и передать его редьюсеру, заставить редьюсер выполнить задачу обновления состояния, обновить узел dom после обновления (то есть выполнить рендеринг в представлении)
- редуктор: обработать объект действия, обновить состояние компонента и вернуть новое значение состояния в хранилище
- Поток данных Redux:
- Создайте хранилище для хранения данных, определите действия для изменения хранилища и сопоставьте различные редукторы внутри.
- Уровень представления отправляет действие, хранилище получает действие для изменения состояния, выполняет метод обновления и вызывает обратный вызов, переданный подпиской.
- Уровень представления подписывается на обновления состояния в componentDidMount, и после получения обновленного хранилища setState и forceUpdate обновляют представление.
- Несколько компонентов используют одно и то же состояние. Всем можно управлять в одном редукторе.
-
Процесс подключения React-Redux к реактивным компонентам
- ProviderОбеспечить хранилище для потомков: обернуть слой в самый внешний слой приложения при его использовании, суть в том, что контекст переносит хранилище по слоям
-
connectПредоставьте данные и методы изменения для компонентов: по сути, это высокоуровневый компонент, соединяющий компоненты React с хранилищем Redux, возвращающий новый класс компонентов, который был связан с Redux Store, и понимающий, что несколько компонентов используют одно и то же состояние. Добавьте методы для использования состояния и отправки компонентам через mapStateToProps и mapDispatchToProps. При подключении рендеринг компонента запускается setState.
- mapStateToProps(Function): этот обратный вызов вызывается при изменении хранилища Redux.Этот метод должен возвращать объект, интегрированный с реквизитами компонента.Компонент не прослушивает хранилище Redux, если не передается mapStateToProps. Используйте второй параметр ownProps с осторожностью, изменение свойства родительского компонента также приведет к выполнению mapStateToProps.
- mapDispatchToProps: возвращает объект (сопоставление создателя действия) или функцию для получения отправки, возможно, используя bindActionCreator.
-
Как промежуточное ПО получает хранилище и действие и как с этим бороться
- При созданииStore ПО промежуточного слоя и хранилище связываются через функцию applyMiddleware, и хранилище передается в ПО промежуточного слоя при инициализации хранилища.
- Параметры метода, которые может передать промежуточное ПО, преобразуются в массивы.Первое промежуточное ПО получает действие при отправке (действие) в первый раз, а последующее промежуточное ПО получает действие, которое вызывает отправку после обработки предыдущим промежуточным ПО. обработать
-
Что такое промежуточное ПО Redux, принимает несколько параметров
-
Промежуточное программное обеспечение Redux — это функция, которая улучшает метод диспетчеризации, так что диспетчеризация больше не принимает чисто объектные действия, а принимает функцию, которая передает исходную диспетчеризацию в качестве параметра.
-
Параметры приема представляют собой серию функций промежуточного программного обеспечения, использующих сокращение для реализации компоновки и выполнения этих операций между выпуском действия и выполнением редюсера.
-
Рукописный состав:
function compose (...funcs) {
funcs.reduce((a, b) => {
return (...args) => a(b(...args)) // ...args — это первый параметр, переданный в
})
}
-
compose возвращает расширенную отправку
-
-
Как ПО промежуточного слоя для избыточных запросов обрабатывает параллелизм
- промежуточное ПО redux-trunk — действие, переданное в диспетчер, может быть определено как метод fun, а fun может получить контроль над диспетчером, чтобы он мог контролировать, когда редьюсер начинает менять состояние.
- Параллелизм через Promise.all
- Используйте async и await с Array.map() // Цикл forEach выполняется последовательно или нет? Сомнительный
- Вы можете использовать очереди для управления количеством параллелизма
- промежуточное ПО redux-saga — генератор + обещание
- промежуточное ПО redux-trunk — действие, переданное в диспетчер, может быть определено как метод fun, а fun может получить контроль над диспетчером, чтобы он мог контролировать, когда редьюсер начинает менять состояние.
-
Как обрабатывать асинхронные запросы в Redux
- Требуются два действия отправки: когда пользователь инициирует первую отправку, выполняется асинхронная операция, а настоящая отправка запускается при возврате асинхронной операции.
- Используйте redux-trunk, получите диспетчерское управление, вы можете решить, когда запускать редьюсер для изменения состояния
-
В чем разница между диспетчером состояний Redux и монтированием переменной в окно
- Данные контролируемые
- ответ данных
-
Как настроить React-маршрутизатор
- Приложение браузера представляет пакет react-router-dom, который автоматически импортирует react-router, а проект RN представляет react-router-native.
- основные компоненты
- маршрутизатор маршрутизатор
- Связать соединение
- Маршрут
- Эксклюзивное переключение
- Перенаправление перенаправление
- 3 способа рендеринга маршрута, в порядке приоритета
- match имеет значение null, когда дети не совпадают
- component
- render
- Примечание. При использовании рендеринга встроенных функций вам необходимо использовать рендеринг/дочерние элементы, а не компонент
- динамическая маршрутизация
- Вложенные маршруты
- Защита маршрута: создайте высокоуровневый компонент для переноса маршрута, чтобы он имел функцию оценки разрешений, обычно в сочетании с сохранением.
-
Как react-router реализует переключение маршрутов? BrowserRouter как маршрутизатор
- Компонент Router использует Provider для предоставления объекта истории вниз, а также мониторинга изменения местоположения
- Маршрут получает действие (реквизиты || контекст), Маршрутизатор пытается сопоставить путь к своему свойству с местоположением, обнаруживает совпадения (дочерние элементы > компонент > рендеринг) и отображает содержимое.
- Ссылка переходит по ссылке, генерирует тег a, отключает событие по умолчанию, js обрабатывает переход по событию клика (history.push) -> Ссылка и использует тег a напрямую. Разница в том, что страница a будет перезагружена, а ссылка будет только повторно визуализировать часть компонента Route
- Redirect to
- Получить историю из контекста this.context.router.history.push...
-
Маршрутизация динамически загруженных модулей
- компонент: import(...), при упаковке он делится на несколько фрагментов в соответствии с импортированной страницей маршрутизации и загружается по запросу.
- Ленивая загрузка с использованием реактивно-загружаемого пакета
-
Как контролировать маршрут управления во внешнем интерфейсе
- Реализуйте компонент высшего порядка PrivateRoute в качестве защиты маршрута.
-
Как решить проблемы при использовании маршрутизации
Проблемы, вызванные обновлением версии
-
Как разделить соответствующие состояния между несколькими компонентами, каждый маленький компонент имеет свое собственное состояние, и между ними есть некоторые общие состояния, которые необходимо поддерживать, как об этом думать
- Состояние каждого виджета помещается в приватное состояние, а публичным управляет Redux.
-
Жизненный цикл React и его собственное понимание, а также модификация жизненного цикла V16
- Этап 3
- при установке
- constructor
- getDerivedStateFromProps
- render -> React обновляет DOM и ссылки
- componentDidMount (стадия фиксации)
- При обновлении -> условия для запуска обновления: изменение родительского реквизита, setState, forceUpdate()
- getDerivedStateFromProps
- shouldComponentUpdate -> оптимизирует отрисовку компонентов
- render
- getSnapshotBeforeUpdate (выполняется перед фиксацией) -> React обновляет DOM и ссылки
- componentDidUpdate
- при удалении
- componentWillUnmount
- при установке
- Изменения в жизненном цикле? причина?
- v17 намерен удалить три воля.После появления волокна слайс задачи может быть прерван.Эти три волевых метода могут выполняться несколько раз, что не соответствует первоначальному замыслу определения жизненного цикла.
- componentWillMount
- componentWillReceiveProps
- componentWillUpdate
- Вводятся 2 новых:
- static getDerivedStateFromProps -> не может получить это, не вызывает побочных эффектов в этих завещаниях
- getSnapshotBeforeUpdate: Сценариев использования не много, только замена старого апи
- v17 намерен удалить три воля.После появления волокна слайс задачи может быть прерван.Эти три волевых метода могут выполняться несколько раз, что не соответствует первоначальному замыслу определения жизненного цикла.
- Этап 3
-
Представляем React-оптимизацию
- Ядро: рендерить только то, что нужно рендерить, вычислять только то, что нужно вычислить
- выравнивание состояния
- Нужно ли перерисовывать?
- Компоненты класса: shouldComponentUpdate, PureComponent (поверхностное сравнение состояния)
- функциональный компонент: используйте функцию высшего порядка React.memo, второй параметр похож на shouldComponentUpdate
- ReactHooks: useMemo (кэшировать возвращаемые результаты энергозатратных операций) (не говоря уже о userMemo)
- Разница между useMemo и useEffect: useEffect выполняется после обновления dom, useMemo выполняется во время рендеринга
-
Принцип делегирования событий компонента React
- Делегирование событий: события регистрируются в документе
- Единое управление и удаление
- Избегайте многократной регистрации одного и того же типа события, например
- Исходный код реакции определяет, является ли это синтетическим событием, с помощью таблицы сопоставления синтетических событий.
- e.stopPropagationПредотвратить попадание пузырьков на уровень документа, решение: e.nativeEvent.stopImmediatePropagation()
- Делегирование событий: события регистрируются в документе
-
Сравнение diff, patch, update и vue
- Когда состояние компонента в React изменится, React перерендерит этот компонент и его потомков, но это не значит, что при рендеринге будет отброшен последний результат рендеринга, React сравнит новые и старые vnodes, а затем исправит их до дом.
- Если дерево компонентов слишком велико, алгоритм diff несколько потеряет производительность, и разработчику необходимо установить хук shouldComponentUpdate.
- По сравнению с Vue: Vue реализует сбор зависимостей во время получения, не сравнивает все дерево и обновляет компоненты с измененными состояниями более детально, в то же время в defineProperty нет поверхностных сравнений, как у объектов PureComponent.
- Состояние в реакции должно быть спроектировано плоским, чтобы облегчить оптимизацию shouldComponentUpdate.
-
Режим React Render Props — перехват рендеринга
- форма:
- props: метод fun, который возвращает компонент B, передается компоненту A. Формальные параметры fun будут переданы, когда компонент A вызовет fun для рендеринга B, а формальные параметры поступают из компонента A.
- Чидден: Смысл тот же, props становится дочерним элементом B, верно?
- Цель: При рендеринге компонента B параметры берутся из A
- Использование: повторное использование логики, извлечение чистой логики для инкапсуляции компонента (эквивалентного вышеприведенному компоненту A), такого как метод общей обработки формы onChange и т. д.
- Повторное использование аналогичной логики в директиве vue:
- форма:
-
import {Button} from 'antd', при упаковке упаковывается только кнопка, и она загружается в модули, как это делается?
-
пройти через
babel-plugin-importОбработка конфигурации.{ "plugins": [ ["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }] ] } -
эквивалентно
import Button from 'antd/es/button'; import 'antd/es/button/style/css';
-
-
При монтировании React есть 3 компонента: textComponent, composeComponent, domComponent, различия и отношения.
Не уверен, что это за тестовый сайт, это тип первого параметра React.createElement? Знайте только разницу между классом и функцией.Первый вызывает метод рендеринга экземпляра, а второй выполняется напрямую
-
Какие изменения произошли внутри компании после изменения структуры Dom в React? непонимание сути проблемы
- setState вызывает изменения состояния
- React перестраивает дерево vnode
- По сравнению со старым деревом vnode получаются патчи измененной части (алгоритм diff).
- Обновление патчей до настоящего дома
-
Является ли setState синхронным или асинхронным?
- Вывод: синхронность в нативных событиях и setTimeout, асинхронность в синтетических событиях и жизненном цикле.
- Причина: Пакетное обновление React
- В исходном коде по isBatchingUpdates (по умолчанию false, синхронное обновление) определить, обновлять сразу или поставить в очередь, чтобы отложить обновление
- Метод batchedUpdates изменит isBatchingUpdates на true, вызывая асинхронное обновление setState.
- React вызовет метод batchedUpdates перед вызовом обработчика событий, поэтому событие setState, обрабатываемое React, является асинхронным.
-
Как React проверяет и изменяет данные
- Массовое обновление — см. Синхронизация setState, проблемы с асинхронностью
- Пакетное обновление dom перед выполнением следующей задачи макроса -> Promise.then
-
Какие методы вызовут реакцию на повторный рендеринг
- setState
- рендеринг родительского компонента
- forceUpdate
-
Разница между React15/16.x
- Процесс согласования использует срезы задач
- модификация жизненного цикла
-
Реагируйте на распространенные методы связи
- props
- Контекст — расширенный API Не связывайтесь с этим
- React-Redux: прохождение магазина
- React-router: история проходов, локация
- Подкомпоненты могут получить контекст тремя способами:
- class static contextType
- хуки: useState
- несколько контекстов
- класс может принимать только один контекст
- Потребители могут быть вложены слой за слоем и будут убиты
- useState может получать несколько состояний
- Уведомление:
- Если значением Провайдера является объект, его следует повесить в состоянии родительского элемента, т.к. изменение реквизита объекта Провайдера вызовет отрисовку дочернего компонента
- использовать избыточность
-
Знакомство с компонентами высшего порядка React
- Получить компонент и вернуть компонент
- Режим React Render Props (выше)
-
алгоритм сравнения
-
стратегия алгоритма сравнения
-
Минимальная временная сложность операции преобразования одного дерева в другое дерево без использования алгоритма оптимизации составляет O(n3)
-
Сравнение с коллегами: в сети есть несколько мобильных узлов на разных уровнях.
-
Два компонента разных типов (тип, ключ) генерируют разные древовидные структуры.
-
Укажите, какие элементы одинаковы по ключу
-
-
diff process — есть 3 операции при сравнении двух внодов: удалить, заменить, обновить
- удалить: newVnode не существует
- Замена: vnode и newNode имеют разные типы или ключи
- Обновление: иметь тот же тип ключа, но разные vnode и newVnode
-
При сравнении элементов одного типа React выполняет рендеринг после обновления свойств и рекурсивно сравнивает старый и новый виртуальные дома.
-
Разница с vue относится к вопросу 17
-
-
Волоконная архитектура
- React использует механизм данных волокна для хранения дополнительной информации о дереве компонентов.
- Выполнить рендеринг для первого рендеринга, затем diff, а затем рендерить
- Обход дерева рендеринга волокон в глубину: приоритет следующего волокна: дочерний элемент > одноуровневый элемент > parent.sibling
- В reconcilerChildren дерево рендеринга волокон создается в соответствии с дочерними элементами, и выполняется diff.Различие здесь также отличается от алгоритма vue diff.vue опирается на некоторые допущения, чтобы заставить два конца оказаться в середине.
- Нарисуйте дерево рендеринга волокон В соответствии с порядком приоритетов слой за слоем формируется структура связанного списка, а в рендере создается корневое волокно.
- После того, как все волокна выполнены, зафиксируйте, фиксация не может быть прервана, обновите DOM за один раз, найдите родительский узел и выполните соответствующую операцию DOM в соответствии с effectTag на объекте волокна.
- приоритет волокна: расчет времени истечения
- структура данных волокна:
- тип: тип, различать различные волокна, такие как узел функционального класса и т. д.
- props: параметры свойств и т. д.
- node: настоящий узел dom - null при добавлении
- base: сохранить старое волокно для diff - null, если новое
- родитель: workInProgressFiber, родительский узел
- Резюме простой версии процесса волокна:
- Инициализировать подзадачи в рендере
-
window.requestIdleCallbackВыполнить
- Обновите текущий файбер — внутри будет вызываться reconcilerChildren, и каждый файбер будет помечен тегом effectTag
- вернуться к следующему волокну
- После выполнения задач в дереве рендеринга волокна зафиксируйте и обновите dom в соответствии с effectTag.
-
зачем использовать крючки?
- Функциональный компонент перед хуком не имеет состояния и не имеет побочных эффектов и является только простым компонентом отображения.
- Недостатки компонентов класса, зачем вводить хуки?
- Переиспользовать логику между компонентами сложно, например, при использовании Context необходимо вводить Provider и Consumer слой за слоем.
- Сложные компоненты становятся непонятными: хуки разбивают взаимосвязанные части компонента на более мелкие функции
- Непонятный класс: типа вот эта проблема в js, какие-то проблемы при построении
- Какие изменения произошли с функциональными компонентами после введения хуков?
- Функциональные компоненты могут хранить и изменять значения состояния: useState, useReducer
- Может выполнять побочные эффекты: useEffect
- Логика состояния повторного использования: настраиваемый хук
-