让我们从概念上开始。语句与表达式的定义是什么?
一个声明可以做一些事情。表达式计算出一个值。
JSX 旨在构建并从一段代码传递到另一段代码,最终以 HTML 形式结束。这个名字甚至暗示了这种“JavaScript 到 XML”的转换。
它的重点是返回 HTML 节点的“值”。 JSX 允许使用表达式,因为它们可以帮助您确定值。
也许仔细研究三元表达式和 if/else 之间的区别会有所帮助。
If/Else
if(isSaturday){
wakeUpHour = 10;
}else{
wakeUpHour = 7;
}
Ternary
wakeUpHour = isSaturday ? 10 : 7;
两者都完成同样的事情,对吧?但在幕后,他们的运作方式有所不同。在英语中,if/else 可能是这样的:
- 如果 'isSaturday' 的值为 true,则运行大括号内的代码
- 将数字 10 分配给“wakeUpHour”
- 否则,运行下一个大括号内的代码
- 将数字 7 分配给“wakeUpHour”
三元语句也有两部分:
- 如果 isSaturday 为真,则值为 10。否则值为 7。
- 将此值分配给“wakeUpHour”
我们认为这些都完成了同样的事情。这里的关键点是三元表达式本身只是一个值。这不是几行代码。到做一点事该值需要另一部分,对其进行赋值。
在 JSX 中,我们不想分配东西。我们想要价值观。因此,我们只采用三元表达式(一个值),而不是赋值部分或任何其他代码语句。
最后,希望不要增加您的困惑,我要指出的是,您can在 JSX 中定义函数。
const myJSX = <button onClick={ () => { return 'hello'; } }>Say hello</button>
等等,什么?我以为我们无法执行代码行。它不是执行代码行,而是定义它们;它被渲染为:
var myJSX = React.createElement("button", {onClick: () => {
return 'hello';
}}, "Say hello");
将其与尝试仅放入 if/else 语句进行比较:
const myJSX = <span>{ if(true){ return 'hello'; } }</span>
它会尝试渲染为:
var myJSX = React.createElement("span", null, if(true){ return 'hello' });
这是行不通的,出于同样的原因,您通常无法将未封装的代码块传递到函数的参数中。