- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在继续之前,我应该提到的是,是的,我已经阅读了“Use if statement in React JSX ”及其在 SO 和其他地方的不同变体的问题和答案。
但是,这些帖子更多的是关于如何在不使用 JSX 中的语句的情况下解决问题。我想知道为什么 JSX 中不允许使用语句,我找不到任何相关的帖子。
我正在阅读关于这个名为“If-Else in JSX ”的官方文档,给出的原因是引用,
JSX is just syntactic sugar for function calls and object construction
他们继续对比以下两段代码,第一段有效,第二段无效:
这是有效的:
// This JSX:
ReactDOM.render(<div id="msg">Hello World!</div>, mountNode);
// Is transformed to this JS:
ReactDOM.render(React.createElement("div", {id:"msg"}, "Hello World!"), mountNode);
这无效:
// This JSX:
<div id={if (condition) { 'msg' }}>Hello World!</div>
// Is transformed to this JS:
React.createElement("div", {id: if (condition) { 'msg' }}, "Hello World!");
我真的很想了解这一点。首先,在第二个示例中,我绝不会想到在 HTML 元素的 id 属性内编写 JavaScript。事实上,这是我第一次看到 id 属性中使用任何类型的代码。如果我尝试编写 if 条件,我只需在渲染返回表达式中用大括号括起来即可,作为其他可用 JS(如映射或三元表达式)的简单模拟。
render() {
return (
{if ...
}
)
我毫不怀疑,本文档的作者非常清楚这个有点非正统的示例解释了他们的断言“JSX 只是函数调用和对象构造的语法糖”,但我不知道如何解释。
最佳答案
让我们从概念上开始。语句与表达式的定义是什么?
语句会做某事。表达式计算出一个值。
JSX 旨在构建并从一段代码传递到另一段代码,最终以 HTML 形式结束。这个名字甚至暗示了这种“JavaScript 到 XML”的转换。
它的重点是返回 HTML 节点的“值”。 JSX 允许使用表达式,因为它们可以帮助您确定值。
也许仔细研究三元表达式和 if/else 之间的区别会有所帮助。
如果/否则
if(isSaturday){
wakeUpHour = 10;
}else{
wakeUpHour = 7;
}
三元
wakeUpHour = isSaturday ? 10 : 7;
它们都完成了同样的事情,对吧?但在幕后,他们的运作方式有所不同。在英语中,if/else 可能为:
三元语句也有两部分:
我们认为这些都完成了同样的事情。这里的关键点是三元表达式本身只是一个值。这不是几行代码。要使用该值做某事需要另一部分,即分配它。
在 JSX 中,我们不想分配东西。我们想要值(value)观。因此,我们只采用三元表达式(一个值),而不是赋值部分或任何其他代码语句。
最后,希望不会增加您的困惑,我想指出您可以在 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' });
这是行不通的,与通常无法将未封装的代码块传递到函数的参数中的原因相同。
关于javascript - 为什么 JSX 中只能使用表达式,而不能使用语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60988649/
typescript 抛出: Cannot use JSX unless the '--jsx' flag is provided.ts(17004) 更改后tsconfig.json jsx至 re
我正在尝试使用 JSX 表达式作为另一个 JSX 表达式的生成主体的一部分: render() { return ( {[...Array(5).keys()].
eslint jsx-quotes 规则在 Visual Studio 代码中不起作用。配置: .eslintrc.json: { "plugins": ["jsx"], "parse
如果我声明 var A = new Set(...........); var B = new Set(...........); 是否有 JSX 操作来计算两组 A - B 的差异? 最佳答案
这个问题在这里已经有了答案: How to render react components by using map and join? (18 个答案) 关闭 5 年前。 我遇到过这样的情况,我有
完成执行另一个 .jsx 脚本后,如何让我的 .jsx 脚本? 也许这将有助于理解我正在尝试做的事情: // WebCard.jsx file function mySnippet(){ //
JSX 不允许多次指定一个属性。 F.ex. /* /* where obj contains an attribute called "prop1" */ 属性的顺
我在尝试使用循环数组构建自定义组件时遇到问题,该循环数组有条件地呈现不同的元素。该组件包含特殊的类名,用于生成每行 3 个元素的网格,与传递给组件的参数数量无关。 我正在使用 map用于遍历条件索引,
我有一个要从 JS 转换为 TS 的 React 项目。我遇到的一个问题是 TSX React 假设功能组件中定义的所有属性都是必需的 Prop 。 // ComponentA.tsx class C
我有一个通过数组映射的 React 组件。 每个数组项都有一个可选的 ID 类型。 如果我有这个 ID,我将渲染一个元素,否则什么都不渲染。 这个元素有一个 onClick 调用函数接受 ID 作为参
我目前正在编写一个带有 ref 元素的 StencilJS 组件,我需要将其作为 @Prop 传递给另一个元素。像这样: this.canvas = el}> 创建颜色选择器时,this.canv
我正在尝试将对象传递给 react 中的 jsx 标记的值 我将标签选项的值设置为一个对象 onChange 我得到了标签 中的值并用值设置本地状态 我控制台记录了本地状态,但它返回了 [objec
我正在尝试使用 Chart.js 和 Typescript 在 React 中构建应用程序,但是当尝试渲染折线图时,我在这一行收到上述错误: . 除此之外,我还收到消息“类型‘ChartCompone
我正在使用一个变量来有条件地显示不同的 JSX,并且它没有使用在其父函数中定义的样式。我怎样才能做到这一点? 您可以在此处查看演示:https://codesandbox.io/s/styled-js
使用 Nextjs 和 styled-jsx 我编写了下面的组件。 现在我想知道如何将 styled-jsx 应用于从 getLinks 方法返回的 jsx。 在下面的示例中,来自 getLinks
所以我现在的问题是,如果我有一个 JSX 父组件,但我需要包含一个 html 标签,例如 我认为 React JSX 不支持它(如果我错了请纠正我)我可以混合使用 jsx 和非 jsx 组件吗?我个人
我正在编写一个 react 应用程序来从嵌套对象数组中打印 TreeView 。每个节点都应该是可折叠的(默认打开)。一个节点可以有任意数量的子节点。这是我想要实现的示例: 我正在将所有节点组件收集到
它不是 React 项目,也不是 V-DOM 相关的。我只需要一个 jsx 运行时编译器到 (HTML/XML) 字符串,稍后将用作 element.innerHTML = result 它应该用作支
当 jsx 跨越多行时,哪种 eslint 规则更喜欢前者而不是后者?目前 prettier 正在从 preferred 变为 notPreferred const preferred = (
我正在使用 IDEA 2017.2。我需要设置 JSX codestyle,这样大括号之间就有空格,比如 { event.series } 。但是,它会将其自动格式化为 {event.series}
我是一名优秀的程序员,十分优秀!