首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用ReactJS和JSX时,我们是否可以编写简单的JS代码,以某种方式返回一些元素?

在使用ReactJS和JSX时,我们是否可以编写简单的JS代码,以某种方式返回一些元素?
EN

Stack Overflow用户
提问于 2021-02-19 04:37:06
回答 3查看 70关注 0票数 1

当我们在JSX中返回一些东西时,我们可以写:

代码语言:javascript
复制
  <ul>
    {Array.from({ length: 9 }).map((e, i) => (
      <li>{i}</li>
    ))}
  </ul>

或者用生命:

代码语言:javascript
复制
  <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

但是否有可能写这样的东西:

代码语言:javascript
复制
  <ul>
    {
      const result = [];
      for (let i = 0; i < 9; i++) {
        result.push(<li>{i}</li>);
      }
      return result;  // somehow "return" the array
    }
  </ul>

也就是说,只需编写没有生命的普通代码,并且能够以某种方式返回我们创建的数组?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-19 04:51:26

您可以将for循环向上拉到JSX之上,如下所示:

代码语言:javascript
复制
const result = [];
for (let i = 0; i < 9; i++) {
  result.push(<li>{i}</li>);
}

return (
  <ul>
    {result}
  </ul>
)

但是,如果要将此代码嵌入到JSX中,则只能使用表达式,而不能使用语句。这就是第二个例子中生命的原因:它是一个表达式,所以你可以把它放在JSX中,但是它可以包含语句,这样你就可以作弊了。

记住将JSX转换为函数调用(或一系列函数调用)可能会有所帮助。例如,这是:

代码语言:javascript
复制
<ul>{something}</ul>

变成这样:

代码语言:javascript
复制
React.createElement("ul", null, something);

查看该函数版本,应该很明显,以下代码不是合法语法:

代码语言:javascript
复制
React.createElement(
  "ul",
  null,
  const result = [];
  for (let i = 0; i < 9; i++) {
    result.push(<li>{i}</li>);
  }
  return result;
)

这就是为什么JSX也不让你这么做。

票数 5
EN

Stack Overflow用户

发布于 2021-02-19 04:51:38

正如您已经注意到的,JSX支持任意的JavaScript。强调词语的表达。生命之所以有效,是因为它是一个定义表达式和调用表达式的函数。对后一个示例没有支持,因为JSX没有支持块而不是表达式的机制,而且JavaScript除了通过IIFE之外,也没有将块作为表达式处理的机制。

但是,有一个关于表达的第1阶段建议,如果我理解正确,它将允许您这样做:

代码语言:javascript
复制
<ul>
  {
    do {
      const result = [];
      for (let i = 0; i < 9; i++) {
        result.push(<li>{i}</li>);
      }
      result;
    }
  }
</ul>

它是一个第一阶段提案,所以它还没有在标准中,并且可能成为标准,也可能不成为标准。幸运的是,它有一个Babel插件,您可能有兴趣试用它:@babel/plugin-proposal-do-expressions

票数 3
EN

Stack Overflow用户

发布于 2021-02-19 04:58:41

不像写的那样。JSX只允许表达式,即返回值的代码。您可以在返回其他代码的代码中编写“不返回”代码;例如,您可以在map中分配map的代码。因此,如果您真的想编写上面的内容,可以将其包装在一个map中。

代码语言:javascript
复制
  <ul>
    {
      [0].map(() => {
        const result = [];
        for (let i = 0; i < 9; i++) {
          result.push(<li>{i}</li>);
        }
        return result;
      });
    }
  </ul>

对我来说,这就像是一个思想实验,而不是对最佳实践的要求。在我看来,这将是在JSX之外构建一系列值,并在其中映射它。

代码语言:javascript
复制
const YourComponent = () => {
  ...
  const numbers = Array.from({ length: 9 });

  return(
    <ul>
      { numbers.map((_, i) => <li>{i}</li>) }
    </ul>
  );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66271856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档