Является ли {...{key}} тем же, что и key = {key} для назначения свойства реакции?

Я начинающий разработчик в React, и несколько дней назад я увидел интересный синтаксис, который я не понимаю.

В компоненте View есть {...{key}}, Я бы написал вместо этого key = {key}, это точно так же? а у вас есть ссылка или объяснение?

  render() {
    const { tasks } = this.props;
    return (
        <View>
          {
            tasks.map((task, key) => {
              return (
                <View {...{ key }}>
                  <Task/>
                </View>
              );
            })
          }
        </View>
    );
  }

Это то же самое. Имейте в виду, что имя свойства будет ключевым, тогда как если бы вы использовали синтаксис = {}, вы могли бы назвать свойство конкретно.

Kobe 11.07.2019 10:26

Да, это то же самое. Не уверен, почему люди предпочитают такой синтаксис.

Chris 11.07.2019 10:30

@Chris, я использую его для записи многих свойств, имя которых я не хочу изменять.

Kobe 11.07.2019 10:30

Если вы хотите узнать больше о синтаксисе распространения - oprea.rocks/blog/what-do-the-the-three-dots-mean-in-javascript

Monika Mangal 11.07.2019 10:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
4
4
486
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

<View {...{ key }}>
  <Task/>
</View>

Приведенный выше код на самом деле состоит из нескольких частей.

  1. создайте объект на лету, с любым значением, которое вы получите для key во время цикла, назначьте его свойству этого вновь созданного объекта с именем свойства «ключ»

  2. Разложите объект, созданный на шаге 1 и используемый как свойство View.

Следовательно, гораздо лучше написать ниже вместо этого

<View key = {key}>
...
</View>

Да, это то же самое.

Обычно вы видите отображение, написанное следующим образом:

tasks.map((task, index) =>

но вместо этого написав:

tasks.map((task, key) =>

вы можете назначить ключ элементу, просто {...{key}} вместо того, чтобы писать key = {index}


Это сводится к вопросу предпочтений, на самом деле. Тем не менее, я лично считаю, что это просто ненужная «чрезмерная инженерия» чего-то очень простого.

Ответ принят как подходящий

Думайте о свойствах, которые вы предоставляете <View>, как о объекте реквизита. Скажем

var variable = 2

Написание <View value = {variable}>, по сути, похоже на написание:

// value = {variable} is the same as {value: variable}

props = {
  value: 2
}

Однако запись <View {...{variable}}> делает менее эффективным объявление имени свойства, оно всегда будет таким же, как имя переменной, если не указано иное:

// {...{variable}} spreads out into {variable: variable}

props: {
  variable: 2
}

// {...{value: variable}} spreads out into {value: variable}
// which is a slower way of writing value = {variable}

Один из немногих реальных случаев использования второго синтаксиса — это быстрая передача нескольких переменных, которые вы хотите сохранить с одним и тем же именем:

<View {...{ user, firstName, lastName, email }}>
// rather than
<View user = {user} firstName = {firstName} lastName = {lastName} email = {email}>

Однако основным недостатком этого синтаксиса является то, что вы не можем редактируете саму переменную без необходимости объявлять имя свойства. Например, вы можете написать это с первым синтаксисом:

value = {variable + 2}

но вы не можете написать:

{...{variable + 2}}

Где имя объекта? Вы должны были бы написать:

{...{value: value + 2}}

Что, опять же, является способом написания первого синтаксиса помедленнее.


Несколько иной вариант использования синтаксиса распространения — передача нескольких свойств объекта одновременно. Например, скажем, у нас есть этот объект:

var user = {
  firstName: 'foo',
  lastName: 'bar',
  email: '[email protected]',
}

Вместо того, чтобы писать:

<View firstName = {user.firstName} lastName = {user.lastName} email = {user.email}>

Мы можем просто написать:

<View {...user}>

TL;DR
В целом, для написания длинных списков переменных, которые вы просто хотите передать следующему компоненту, используйте синтаксис распространения ({...{variable1, variable2}}), в противном случае используйте обычный синтаксис (value = {variable}), так как у вас будет гораздо больше контроля над тем, что вы перейти к вашим компонентам.

У вас была бы очень веская точка зрения, если бы мы говорили об обычном реквизите. Тем не менее, key — это особая поддержка, поскольку она не «передается» и помогает React идентифицировать элементы в списке — следовательно, не можем имеет любое имя, кроме key, без изменения результата.

Chris 11.07.2019 10:41

Это очень, очень верно, это совершенно пролетело мимо моей головы, я сейчас плохо это изменю

Kobe 11.07.2019 10:42

Другим серьезным недостатком этого синтаксиса является то, что для каждого цикла будет создаваться новый объект, который излишне

Isaac 11.07.2019 10:44

@Isaac Оказывается, так это на 33% медленнее. Интересно.

Chris 11.07.2019 12:14

@ Крис, интересно, как получить эту статистику?

adesurirey 11.07.2019 19:37

@adesurirey я сделал тест на jsperf.com

Chris 11.07.2019 20:56

Другие вопросы по теме