当使用ReactJS和JSX时,我们可以编写以某种方式返回一些元素的纯JS代码吗?
当我们在 JSX 中返回一些东西时,我们可以这样写:
<ul>
{Array.from({ length: 9 }).map((e, i) => (
<li>{i}</li>
))}
</ul>
或使用 IIFE:
<ul>
{(function () {
const result = [];
for (let i = 0; i < 9; i++) {
result.push(<li>{i}</li>);
}
return result;
})()}
</ul>
示例:https : //codesandbox.io/s/busy-aryabhata-egv27
但是有没有可能写出类似的东西:
<ul>
{
const result = [];
for (let i = 0; i < 9; i++) {
result.push(<li>{i}</li>);
}
return result; // somehow "return" the array
}
</ul>
也就是说,只需编写没有 IIFE 的纯代码,并且能够以某种方式返回我们创建的数组?
回答
您可以将 for 循环拉到 JSX 上方,如下所示:
const result = [];
for (let i = 0; i < 9; i++) {
result.push(<li>{i}</li>);
}
return (
<ul>
{result}
</ul>
)
但是如果你想把这段代码嵌入到 JSX 中,那么你只能使用表达式,而不能使用语句。这就是第二个例子中 IIFE 的原因:它是一个表达式,所以你可以把它放在 JSX 中,但它可以包含语句,从而让你有点作弊。
记住 JSX 被转换为函数调用(或一系列函数调用)可能会有所帮助。例如,这个:
<ul>{something}</ul>
变成这样:
React.createElement("ul", null, something);
查看该函数版本,很明显以下代码不是合法语法:
React.createElement(
"ul",
null,
const result = [];
for (let i = 0; i < 9; i++) {
result.push(<li>{i}</li>);
}
return result;
)
这就是 JSX 也不会让你这样做的原因。
THE END
二维码