Как работает функция map в React.js ?

#javascript #dictionary #reactjs #key

#javascript #словарь #reactjs #Клавиша

Вопрос:

Я следую руководству по ReactJS от www.tutorialpoints.com и я на этой странице

В двух словах он предоставляет следующие данные в формате JSON:

 this.state = {
         data: 
         [
            {
               "id":1,
               "name":"Foo",
               "age":"20"
            },

            {
               "id":2,
               "name":"Bar",
               "age":"30"
            },

            {
               "id":3,
               "name":"Baz",
               "age":"40"
            }
         ]
      }
  

и выполняет цикл через него с помощью функции map, приведенной ниже:

 {this.state.data.map((person, i) => <TableRow key = {i} data = {person} />)}
  

Чего я не могу понять, так это почему они используют кортеж (person, i) для таргетинга на КАЖДЫЙ объект и как работает key = {i} часть кода. Я попытался удалить key часть, и код все еще работает. Из дальнейшего чтения я понял, что это помогает перезагрузить только определенные данные, которые были изменены, а не весь набор данных, но я не уверен.

Может ли кто-нибудь пройти ТОЛЬКО цикл в этом примере построчно, чтобы пояснить, как это работает?

Ответ №1:

Рассмотрим ваши .map() возвраты 10 элементов. Когда вы меняете один из 10 элементов, скажем, 5-й элемент, React не будет знать, какой элемент изменить в частности, без key . Таким образом, он повторно отобразит все элементы .map() .

Если вы предоставите key , элемент с этим key будет повторно отображен, оставляя остальные 9 элементов нетронутыми. Это делается для повышения производительности.

[ОБНОВИТЬ]

key Зарезервирован для уникальной идентификации элемента React. Это не обязательно должно быть i , это может быть любая случайная строка. Лично я использую shortid для генерации случайного уникального ключа.

 {this.state.data.map((person) => <TableRow key = {shortid.generate()} data = {person} />)}
  

React не будет добавлять свою ссылку ids ( data-reactid ), когда у вас есть массив элементов React. Когда вы пытаетесь отобразить этот массив, React добавит ваш key к своему data-reactid во время нормализации.

Массив элементов без key

 <tr class="" data-version="1.0.0" data-reactid=".0.2.2.1.0.0.1" role="row">
<tr class="" data-version="1.0.0" data-reactid=".0.2.2.1.0.0.1" role="row">
<tr class="" data-version="1.0.0" data-reactid=".0.2.2.1.0.0.1" role="row">
<tr class="" data-version="1.0.0" data-reactid=".0.2.2.1.0.0.1" role="row">
<tr class="" data-version="1.0.0" data-reactid=".0.2.2.1.0.0.1" role="row">
  

Массив элементов с key

 <tr class="" data-version="1.0.0" data-reactid=".0.2.2.1.0.0.1.$123" role="row">
<tr class="" data-version="1.0.0" data-reactid=".0.2.2.1.0.0.1.$124" role="row">
<tr class="" data-version="1.0.0" data-reactid=".0.2.2.1.0.0.1.$125" role="row">
<tr class="" data-version="1.0.0" data-reactid=".0.2.2.1.0.0.1.$126" role="row">
<tr class="" data-version="1.0.0" data-reactid=".0.2.2.1.0.0.1.$127" role="row">
  

Число после $ — это ключевое значение, которое вы предоставляете этому компоненту. С помощью этого React может однозначно идентифицировать компонент.

Последняя версия React не будет раскрывать data-reactid в DOM.

Прочитайте это для лучшего понимания

Комментарии:

1. Вместо {this.state.data.map(person => <TableRow data = {person} />)} я могу использовать код, приведенный в вопросе, и вся эта логика будет выполняться React? key Переменная зарезервирована ТОЛЬКО для этой конкретной цели? Можете ли вы направить меня к примеру, где это легко увидеть в действии?

2. Я вижу, что вы не предоставили кортеж (person, i) для функции map. Это потому, что у вас есть функция для генерации ключа?

3. Да, я использую shortid для генерации случайной строки. Я добавил ссылку.