React的JSX语法中的双花括号的目的是什么?


111

react.js教程中,我们可以看到双花括号的用法:

<span dangerouslySetInnerHTML={{ __html: rawMarkup }} />

然后在第二个教程“ Thinking in react”中

 <span style={{ color: 'red' }}>
     {this.props.product.name}
 </span>;

但是,React JSX文档没有描述或提及双花括号。此语法(双curies)的作用是什么?还有另一种方法可以在jsx中表达相同的东西,或者这仅仅是文档中的遗漏?


9
来自文档The exterior set of curly braces are letting JSX know you want a JS expression. The interior set of curly braces represent a JavaScript object, meaning you’re passing in a object to the style attribute.
Sayan

Answers:


116

它只是内在prop值中的对象文字。和...一样

var obj = {__html: rawMarkup};

<span dangerouslySetInnerHTML={obj} />

@BenAlpert一会儿很高兴。奇怪的是,我实际上很喜欢编辑文档(以前是法律期刊的编辑),并且可能还有其他一些改进。PS,仍然住在博尔德吗?让我们在某个时候喝咖啡或午餐...认识一个在React上拥有内幕消息的人会很高兴,因为我们刚刚开始着手一个大项目。
Ben Roberts

1
@BenRoberts太好了,谢谢!不幸的是,这些天我在加利福尼亚外出,但是可以随意去freenode上的#reactjs IRC聊天室,我很乐意回答问题。
苏菲·阿尔珀特2014年

@BenAlpert您是否知道知道dangerouslySetInnerHTML={__html: rawMarkup}替代它的想法是什么dangerouslySetInnerHTML={rawMarkup}?是因为对象{__html: rawMarkup}是可变的,而字符串不是可变的?
Brian Kung


55

花括号在这里有2种用法:-

  1. {..}的结果为JSX中的表达式。
  2. {key:value}表示一个javascript对象。

让我们看一个简单的例子。

<Image source={pic} style={{width: 193}}/>

如果观察到pic被大括号包围。这就是JSX嵌入变量的方式。pic可以是任何Javascript表达式/变量/对象。您还可以执行类似{2 + 3}的操作,它将得出{5}

让我们在这里剖析样式。 {width: 193}是一个Javascript对象。要将这个对象嵌入JSX,您需要大括号,因此,{ {width: 193} }

注意:要在JSX中嵌入任何类型的Javascript表达式/变量/对象,都需要花括号。


5
与标记为已接受的答案相比,我发现此答案更具解释性。
罗希特·曼迪瓦尔

@RohitMandiwal谢谢您先生。我知道当您在另一个内放一个花括号时,这有点令人困惑。
Mav55

14

如果您不知道,为什么{{color: 'red'}}style标记中使用

<span style={{color: 'red'}}>
    {this.props.product.name}
</span>;

根据React的官方文档,style属性接受JavaScript对象而不是CSS字符串。


6

React使用JSX,在JSX中,任何变量,状态对象,表达式等都必须包含在{}中。

在JSX中提供内联样式时,必须将其指定为对象,因此必须再次在花括号内。{}。

这就是为什么有两对花括号的原因


3

这意味着您无需声明设置为预期样式属性的对象的样式变量,而只需在对象中设置样式属性即可。当您要添加的样式很少时,这通常是最佳做法需要更多样式的元素更容易声明样式变量

例如,对于具有较少样式属性的元素,执行此操作

<span style={{color: 'red'}}>
  {this.props.product.name}
</span>

对于具有更多样式属性的HTML元素,请执行此操作

const spanStyle = {
   backgroundColor: 'red',
   color: 'grey',
   margin: '-25px'
}

然后用jsx语法调用它

<span style={spanStyle}>
  {this.props.product.name}
</span>

1

我尝试用简单的语言告诉大家,让所有人都能理解。下面的代码:

<span dangerouslySetInnerHTML={{__html: rawMarkup}} />

等于

<span 
     dangerouslySetInnerHTML={ {__html: rawMarkup} } 
/>

因此,如果要为属性分配文字对象,则只需使用React表达式。

对于一些主要从AngularJs迁移到ReactJs的人来说,这可能与AngularJs的表达式绑定运算符{{}}混淆了。因此,尝试在ReactJs中以不同的方式看待它。


7
您的两个代码片段除了格式似乎完全相同。
jcollum

4
@jcollum-这正是他的意思。双括号“ operator”不是他所显示的运算符。它在html模板引擎中非常常见,以至于在响应时看起来很奇怪。
aaaaaa

我还是不明白
Andrew Lam

@AndrewLam-刚刚对其进行了编辑。现在可以理解了吗?
Ehsan

1

我对双花括号的解释是,样式对象仅接受JavaScript对象,因此该对象必须位于单花括号内。

style={jsObj}

样式工件的对象具有key:value对(字典对数组),并且该对象表示为,例如{color:'#ffffff'}

所以你有:

style = { jsObj }

jsObj = {color:'#ffffff'}

就像在代数中一样,当您替换时,它表示:

style = { {color:'#ffffff'} }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.