Использование оператора распространения в реакции с такими объектами, как props
в JSX, похоже, не дает того, что я ожидал.
<Text {...this.props} />
похоже, рендерится в style = "foo"
, где должен быть style:"foo"
как задокументировано здесь. Я нигде не мог найти это задокументировано. Я совершенно новичок, чтобы реагировать, и я пытаюсь понять синтаксис и задаюсь вопросом, делает ли React недокументированные вещи, подобные этому, внутри.
Простой тест только подчеркнул мое замешательство:
const x = {...{test:1}}.test;
alert(x);
предупрежден
1
И это точно не компилируется:
<Text test: 1 />
При деструктуризации из объекта извлекаются пары ключ-значение.
Взгляните на этот пример
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} />
@Basti это не товарищ по заговору
Этот является задокументирован в документации 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
Я не уверен, что понимаю ваше беспокойство - опять же, вы не должны слишком много думать о выходе спреда как о напрямую, потребляемом в JSX - в конечном счете, это ярлык, который разрешен с помощью магии транспиляции, а не компонента, непосредственно потребляющего распространение.
Понятно, спасибо. Так что я просто буду иметь в виду, что они делают вещи в фоновом режиме, которые не должны иметь смысла с точки зрения синтаксиса. Как вы его назвали магия транспиляции :)
Вы сказали Это будет внутренне преобразовано в - и это момент, когда я чувствую, что это не задокументировано, что они делают еще одно преобразование из
a:1
вa = "1"