Синтаксис распространения "... this.props" в reactjs кажется странным

Использование оператора распространения в реакции с такими объектами, как props в JSX, похоже, не дает того, что я ожидал.

<Text {...this.props} />

похоже, рендерится в style = "foo", где должен быть style:"foo" как задокументировано здесь. Я нигде не мог найти это задокументировано. Я совершенно новичок, чтобы реагировать, и я пытаюсь понять синтаксис и задаюсь вопросом, делает ли React недокументированные вещи, подобные этому, внутри.

Простой тест только подчеркнул мое замешательство:

const x = {...{test:1}}.test;
alert(x);

предупрежден

1

И это точно не компилируется:

<Text test: 1 />
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
2 710
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

При деструктуризации из объекта извлекаются пары ключ-значение.

Взгляните на этот пример

const obj = {
  a: 'a',
  b: 'b'
}

Теперь деструктуризация obj приведет к

const { a, b } = obj;
console.info(a);  // 'a'
console.info(b);  // 'b'

Если вы деструктурируете объект, передавая его в качестве реквизита для компонента React, вот что произойдет.

<Component {...obj} />

Это будет внутренне преобразовано в

<Component a = {a} b = {b} />

Поэтому, если вы передаете стили как свойства компонента, это следует делать как

const style = {
  background:'yellow'
} 

<Component style = {style} />

или

const obj = {
  style = {
      background:'yellow'
    } 
}

<Component {...obj} />

Вы сказали Это будет внутренне преобразовано в - и это момент, когда я чувствую, что это не задокументировано, что они делают еще одно преобразование из a:1 в a = "1"

Basti 27.10.2018 04:32

@Basti это не товарищ по заговору

molebox 27.10.2018 08:18
Ответ принят как подходящий

Этот является задокументирован в документации React здесь.

Чтобы скопировать пасту сюда, говорится:

If you already have props as an object, and you want to pass it in JSX, you can use ... as a “spread” operator to pass the whole props object.

Это совершенно правильный, документированный JSX.

Кроме того, они предоставляют пример двух различных методов передачи свойств компоненту - одного в виде дискретных атрибутов и другого в виде объекта распространения - и отмечают, что они одинаковы в том, что касается компонента, получающего реквизиты:

function App1() {
  return <Greeting firstName = "Ben" lastName = "Hector" />;
}

function App2() {
  const props = {firstName: 'Ben', lastName: 'Hector'};
  return <Greeting {...props} />;
}

Распространяя это на приведенный выше пример, вы можете думать об этих двух как об эквивалентных:

function App1() {
    return <Text test = {1} />;
}

function App2() {
    const props = {test: 1};
    return <Text {...props} />;
}

Что касается специфики того, как это работает под капотом, помните, что это транспиляция, поэтому нам не нужно сильно беспокоиться о том, как это работает под капотом - пока вы знаете, что они эквивалент, а один - «ярлык», все должно быть в порядке.

Также стоит отметить, что в документации указывается, что подход распространения следует использовать с осторожностью, потому что «атрибуты распространения могут быть полезны, но они также позволяют легко передавать ненужные реквизиты компонентам, которые не заботятся о них, или передавать недопустимые атрибуты HTML в ДОМ ".

Надеюсь, это поможет вам прояснить ситуацию!

фактически {... props} пересылаются (согласно документации) в firstName: 'Ben', lastName: 'Hector', а не в firstName = "Ben" lastName = "Hector", и это причина того, что я так запутался, поскольку firstName: 'Ben' не является допустимым синтаксисом в JSX

Basti 27.10.2018 04:29

Я не уверен, что понимаю ваше беспокойство - опять же, вы не должны слишком много думать о выходе спреда как о напрямую, потребляемом в JSX - в конечном счете, это ярлык, который разрешен с помощью магии транспиляции, а не компонента, непосредственно потребляющего распространение.

Alexander Nied 27.10.2018 04:33

Понятно, спасибо. Так что я просто буду иметь в виду, что они делают вещи в фоновом режиме, которые не должны иметь смысла с точки зрения синтаксиса. Как вы его назвали магия транспиляции :)

Basti 27.10.2018 04:44

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