Javascript 扩展语法“;。。。这是“道具”;总之,我觉得很奇怪

Javascript 扩展语法“;。。。这是“道具”;总之,我觉得很奇怪,javascript,reactjs,spread-syntax,Javascript,Reactjs,Spread Syntax,在JSX中使用spread操作符react处理props之类的对象似乎无法输出我所期望的结果 <Text {...this.props} /> 警惕 一, 这肯定不会编译: <Text test: 1 /> 解构从对象中提取键值对 看看这个例子 const obj = { a: 'a', b: 'b' } 现在,解构obj将导致 const { a, b } = obj; console.log(a); // 'a' console.log(b); //

在JSX中使用spread操作符react处理
props
之类的对象似乎无法输出我所期望的结果

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

一,

这肯定不会编译:

<Text test: 1 />

解构从对象中提取键值对

看看这个例子

const obj = {
  a: 'a',
  b: 'b'
}
现在,解构obj将导致

const { a, b } = obj;
console.log(a);  // 'a'
console.log(b);  // 'b'
如果您在作为React组件的道具传递时分解对象,则会发生这种情况

<Component {...obj} />

这将在内部转换为

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

因此,如果要将样式作为道具传递给组件,则应按照以下步骤进行传递:

const style = {
  background:'yellow'
} 

<Component style={style} />
const style={
背景:“黄色”
} 

const obj={
样式={
背景:“黄色”
} 
}

解构从对象中提取键值对

看看这个例子

const obj = {
  a: 'a',
  b: 'b'
}
现在,解构obj将导致

const { a, b } = obj;
console.log(a);  // 'a'
console.log(b);  // 'b'
如果您在作为React组件的道具传递时分解对象,则会发生这种情况

<Component {...obj} />

这将在内部转换为

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

因此,如果要将样式作为道具传递给组件,则应按照以下步骤进行传递:

const style = {
  background:'yellow'
} 

<Component style={style} />
const style={
背景:“黄色”
} 

const obj={
样式={
背景:“黄色”
} 
}
这在React文档中有记录

要在此处复制粘贴,它会声明:

如果您已经将道具作为对象,并且希望在JSX中传递它,那么可以使用。。。作为“扩散”操作符传递整个道具对象

它是完全有效的,有文档记录的JSX

此外,它们还提供了将道具传递给组件的两种不同方法的示例——一种作为离散属性,另一种作为扩展对象——并注意,就接收道具的组件而言,它们是相同的:

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

function App2() {
  const props = {firstName: 'Ben', lastName: 'Hector'};
  return <Greeting {...props} />;
}
函数App1(){
回来
}
函数App2(){
const props={firstName:'Ben',lastName:'Hector'};
回来
}
将此扩展到上面的示例,您可以将这两个视为等效项:

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

function App2() {
    const props = {test: 1};
    return <Text {...props} />;
}
函数App1(){
回来
}
函数App2(){
const props={test:1};
回来
}
至于它在引擎盖下如何工作的细节,请记住这是一个透明的过程,所以我们不需要太在意它在引擎盖下是如何工作的——只要你知道它们是等效的,一条是“捷径”,你就可以了

还值得注意的是,文档中规定应谨慎使用扩展方法,因为“扩展属性可能很有用,但它们也可以轻松地将不必要的道具传递给不关心它们的组件,或者将无效的HTML属性传递给DOM。”

希望这有助于澄清你的问题

这在React文档中有记录

要在此处复制粘贴,它会声明:

如果您已经将道具作为对象,并且希望在JSX中传递它,那么可以使用。。。作为“扩散”操作符传递整个道具对象

它是完全有效的,有文档记录的JSX

此外,它们还提供了将道具传递给组件的两种不同方法的示例——一种作为离散属性,另一种作为扩展对象——并注意,就接收道具的组件而言,它们是相同的:

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

function App2() {
  const props = {firstName: 'Ben', lastName: 'Hector'};
  return <Greeting {...props} />;
}
函数App1(){
回来
}
函数App2(){
const props={firstName:'Ben',lastName:'Hector'};
回来
}
将此扩展到上面的示例,您可以将这两个视为等效项:

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

function App2() {
    const props = {test: 1};
    return <Text {...props} />;
}
函数App1(){
回来
}
函数App2(){
const props={test:1};
回来
}
至于它在引擎盖下如何工作的细节,请记住这是一个透明的过程,所以我们不需要太在意它在引擎盖下是如何工作的——只要你知道它们是等效的,一条是“捷径”,你就可以了

还值得注意的是,文档中规定应谨慎使用扩展方法,因为“扩展属性可能很有用,但它们也可以轻松地将不必要的道具传递给不关心它们的组件,或者将无效的HTML属性传递给DOM。”


希望这有助于澄清你的问题

事实上,{…props}将(每个文档)读入
firstName:'Ben',lastName:'Hector'
而不是
firstName=“Ben”lastName=“Hector”
中,这就是为什么我如此困惑的原因,因为
firstName:'Ben'
在JSXI中没有有效的语法,我不确定我是否理解了您的担忧,您不应该过多地考虑将排列的输出直接消耗到JSX中——最终,这是一个通过透明的魔力允许的快捷方式,而不是直接消耗排列的组件。我明白了,谢谢。所以我要记住的是,他们在后台做的事情不需要在语法上有意义。正如你所说的,它是透明的魔力:)事实上,{…道具}会(根据文档)变成
firstName:'Ben',lastName:'Hector'
而不是
firstName=“Ben”lastName=“Hector”
,这就是我如此困惑的原因,由于
firstName:'Ben'
在JSXI中没有有效的语法,我不确定我是否理解您的担忧——同样,您不应该过多地考虑将排列的输出直接消耗到JSX中——最终,这是通过透明的魔力允许的快捷方式,不是直接消耗排列的组件。我明白了,谢谢。所以我要记住的是,他们在后台做的事情不需要在语法上有意义。正如你称之为“透明的魔力:)你说这将在内部转化为-这就是我觉得它没有被记录的地方,他们会