Понимание ключевой опоры React
Посмотрите «Использование ключевой опоры при рендеринге списка с помощью React» на egghead.io
(часть Руководства для начинающих по ReactJS).
Поэкспериментируйте с этой формой:
TopicTrainingConsultingQuestion
Тема сообщения
Тело сообщения
В частности, попробуйте изменить тему, затем переключите тему и обратите внимание, что
значение в поле ввода не меняется на более разумный предмет. Даже если
вы набираете что-то вроде «Моей компании требуется обучение», а затем меняете тему
с «Обучение» на «Вопрос» было бы разумнее сбросить
при условии лучшего значения по умолчанию.
Теперь попробуйте этот:
TopicTrainingConsultingQuestion
Тема сообщения
Тело письма
Теперь все работает как положено. Вот реализация, и я выделю
разница:
const defaultValuesByTopic = { обучение: «Я хотел бы пройти обучение», консультирование: «Мне нужны консультации», вопрос: «У меня есть вопросы», } функция Контакт() { const [тема, setTopic] = React. useState('обучение') возвращаться ( <форма>
Единственная разница между этими реализациями в том, что рабочая имеет
ключ
проп а другой нет.
Хочу поделиться с вами небольшой хитростью не потому, что я часто ею пользуюсь (хотя
это именно то, что я делаю на моей странице контактов), но потому что
понимание этого принципа поможет вам лучше понять React. В нем есть
что делать с «экземплярами» компонента React и как React обрабатывает ключ
prop.
То, что я собираюсь вам показать, во многом связано с экземплярами элементов/компонентов и
точно так же относится к
s, как указано выше, как и для компонентов, которые вы
напиши и выложи. Может быть немного проще понять состояние компонента, поэтому
это угол, с которого мы собираемся подойти к этому.
Представьте, что у вас есть компонент React, который управляет внутренним состоянием. Это состояние
прикрепленный к экземпляру компонента. Вот почему вы можете визуализировать этот компонент
дважды на странице, и они будут работать совершенно независимо. Для нашего
демонстрация, давайте использовать что-то действительно простое:
функция Счетчик() { const [количество, setCount] = React.useState (0) const приращение = () => setCount (c => c + 1) вернуть }
Мы могли бы отображать это много раз на странице, и каждый раз был бы полностью
независимый. React будет хранить состояние для каждого отдельного экземпляра. Когда один
компонент удаляется со страницы, это не повлияет на другие. Если вы делаете новый
one, это не влияет на существующие компоненты.
Возможно, вы знаете, что React key
prop — это то, что вам нужно надеть на элементы
когда вы сопоставляете массив (иначе React разозлится на вас).
Примечание: Если вы хотите знать, почему это необходимо и что может произойти, если
вы его игнорируете или просто ставите индекс
в качестве ключа, смотрите «Use the key prop
при рендеринге списка с
React»
Ключ React
prop дает вам возможность управлять экземплярами компонентов. Каждый
когда React визуализирует ваши компоненты, он вызывает ваши функции для получения
новые элементы React, которые он использует для обновления DOM. Если вы вернетесь тем же
типы элементов, он сохраняет эти компоненты/узлы DOM, даже если все реквизиты
измененный.
Чтобы узнать больше об этом, прочитайте Один простой трюк для оптимизации React
re-renders
Я хочу поговорить о звездочке над словом «все» выше.
Исключением является ключ
prop. Это позволяет вам вернуть то же самое
тип элемента, но заставить React размонтировать предыдущий экземпляр и смонтировать новый
один. Это означает, что все состояния, существовавшие в компоненте в тот момент,
полностью удален, и компонент «повторно инициализирован» для всех целей и
целей. Для компонентов это означает, что React будет выполнять очистку эффектов (или
componentWillUnmount
), то он запустит инициализаторы состояния (или
конструктор
) и обратные вызовы эффектов (или componentDidMount
).
ПРИМЕЧАНИЕ: очистка эффекта на самом деле происходит после того, как новый компонент был
смонтирован, но до запуска следующего обратного вызова эффекта.
Вот простой пример работы со счетчиком:
function Counter() { console.log('Вызван счетчик') const [счетчик, setCount] = React.useState(() => { console.log('Инициализатор счетчика useState') вернуть 0 }) const приращение = () => setCount (c => c + 1) React. useEffect(() => { console.log('Счетчик обратного вызова useEffect') возврат () => { console.log('Очистка счетчика useEffect') } }, []) console.log('Счетчик возврата реагирующих элементов') вернуть } функция CounterParent() { // использование useReducer таким образом в основном гарантирует, что каждый раз, когда вы вызываете // setCounterKey, `counterKey` устанавливается на новый объект, который // сделать ключ другим, в результате чего React размонтирует предыдущий // компонент и монтируем новый. const [counterKey, setCounterKey] = React.useReducer(c => c + 1, 0) возвращаться ( <дел> <Ключ счетчика={counterKey} />
Добавить комментарий