ReactJS | Ключи
В предыдущей статье о ReactJS | Списки, мы обсудили ключи, а также рассказали, зачем они нужны при создании списков. Мы продолжим обсуждение дальше в этой статье.
«Ключ» - это специальный строковый атрибут, который необходимо включить при создании списков элементов в React. Ключи используются для React, чтобы определить, какие элементы в списке изменены, обновлены или удалены. Другими словами, мы можем сказать, что ключи используются для идентификации элементов в списках. Следующее, что приходит в голову, это то, что должно быть выбрано в качестве ключевого для элементов в списках. Рекомендуется использовать строку в качестве ключа, который однозначно идентифицирует элементы в списке. В примере ниже показан список со строковыми ключами:
Javascript
const numbers = [ 1, 2, 3, 4, 5 ]; const updatedNums = numbers.map((number)=>{ return <li>{ number } </li>; }); |
Вы также можете назначить индексы массива как ключи к элементам списка. В приведенном ниже примере индексы массива назначаются в качестве ключей для элементов.
Javascript
const numbers = [ 1, 2, 3, 4, 5 ]; const updatedNums = numbers.map((number, index)=>{ return <li>{ number } </li>; }); |
Назначение индексов в качестве ключей крайне не рекомендуется, потому что, если элементы массивов будут переупорядочены в будущем, это запутает разработчика, поскольку ключи для элементов также изменятся.
Использование ключей с компонентами
Рассмотрим ситуацию, когда вы создали отдельный компонент для элементов списка и извлекаете элементы списка из этого компонента. В этом случае вам нужно будет назначить ключи компоненту, который вы возвращаете из итератора, а не элементам списка. То есть вы должны назначать ключи <Component />, а не <li>. Чтобы избежать ошибок, следует помнить, что все, что вы возвращаете изнутри функции map (), должно быть назначено ключом.
Код ниже показывает неправильное использование ключей:
Javascript
import React from 'react' ; import ReactDOM from 'react-dom' ; // Component to be extracted function MenuItems(props) { const item = props.item; return ( <li> {item} </li> ); } // Component that will return an // unordered list function Navmenu(props) { const list = props.menuitems; const updatedList = list.map((listItems)=>{ return ( ); }); return ( <ul>{updatedList}</ul>); } const menuItems = [1, 2, 3, 4, 5]; ReactDOM.render( , document.getElementById( 'root' ) ); |
Выход:
Вы можете видеть в приведенном выше выводе, что список успешно отрисован, но на консоль выдается предупреждение о том, что элементам внутри итератора не назначены ключи . Это потому, что мы не присвоили ключ элементам, которые возвращаем в итератор map ().
Ниже показан пример правильного использования ключей:
Javascript
import React from 'react' ; import ReactDOM from 'react-dom' ; // Component to be extracted function MenuItems(props) { const item = props.item; return ( <li> {item} </li> ); } // Component that will return an // unordered list function Navmenu(props) { const list = props.menuitems; const updatedList = list.map((listItems)=>{ return ( ); }); return ( <ul>{updatedList}</ul>); } const menuItems = [1, 2, 3, 4, 5]; ReactDOM.render( , document.getElementById( 'root' ) ); |
Приведенный выше код будет успешно работать без каких-либо предупреждающих сообщений.
Уникальность ключей
Мы много раз говорили, обсуждая ключи, что ключи, назначенные элементам массива, должны быть уникальными. Под этим мы не имели в виду, что ключи должны быть глобально уникальными. Все элементы в конкретном массиве должны иметь уникальные ключи. То есть два разных массива могут иметь один и тот же набор ключей.
В приведенном ниже коде мы создали два разных массива menuItems1 и menuItems2 . Вы можете видеть в приведенном ниже коде, что ключи для первых 5 элементов для обоих массивов одинаковы, но код работает успешно без каких-либо предупреждений.
Javascript
import React from 'react' ; import ReactDOM from 'react-dom' ; // Component to be extracted function MenuItems(props) { const item = props.item; return ( <li> {item} </li> ); } // Component that will return an // unordered list function Navmenu(props) { const list = props.menuitems; const updatedList = list.map((listItems)=>{ return ( ); }); return ( <ul>{updatedList}</ul>); } const menuItems1 = [1, 2, 3, 4, 5]; const menuItems2 = [1, 2, 3, 4, 5, 6]; ReactDOM.render( <div> </div>, document.getElementById( 'root' ) ); |
Примечание . Ключи - это не то же самое, что реквизиты, только метод назначения «ключа» компоненту такой же, как у реквизита. Ключи являются внутренними для React и недоступны изнутри компонента, как реквизиты. Следовательно, мы можем использовать то же значение, которое мы присвоили ключу, для любого другого свойства, которое мы передаем компоненту.