当前位置: 首页 > 知识库问答 >
问题:

如何在React.js中循环和渲染元素,而无需映射对象数组?

莫兴言
2023-03-14

我正在尝试将jQuery组件转换为React.js,其中一个困难是基于for循环呈现n个元素。

我明白这是不可能的,或者推荐的,并且在模型中存在数组的地方,使用map是完全有意义的。那很好,但是当你没有数组的时候呢?取而代之的是,你有一个数值,它等于要渲染的给定数量的元素,那么你应该怎么做?

下面是我的示例,我想根据元素的层次结构,为元素添加任意数量的span标记作为前缀。所以在第3级,我希望在文本元素之前有3个span标记。

在javascript:

for (var i = 0; i < level; i++) {
    $el.append('<span class="indent"></span>');
}
$el.append('Some text value');

我似乎无法在JSX React.js组件中实现这一点或任何类似的功能。相反,我必须执行以下操作,首先构建一个长度正确的临时数组,然后循环数组。

React.js

render: function() {
  var tmp = [];
  for (var i = 0; i < this.props.level; i++) {
    tmp.push(i);
  }
  var indents = tmp.map(function (i) {
    return (
      <span className='indent'></span>
    );
  });

  return (
    ...
    {indents}
    "Some text value"
    ...
  );
}

这肯定不是最好的,或者是实现这一目标的唯一方法?我错过了什么?

共有3个答案

欧阳翔
2023-03-14

Array.from()将一个iterable对象转换为一个数组和一个可选的映射函数。您可以创建具有.length属性的对象,如下所示:

return Array.from({length: this.props.level}, (item, index) => 
  <span className="indent" key={index}></span>
);
顾靖
2023-03-14

下面是一些ES6功能的更多功能示例:

'use strict';

const React = require('react');

function renderArticles(articles) {
    if (articles.length > 0) {      
        return articles.map((article, index) => (
            <Article key={index} article={article} />
        ));
    }
    else return [];
}

const Article = ({article}) => {
    return ( 
        <article key={article.id}>
            <a href={article.link}>{article.title}</a>
            <p>{article.description}</p>
        </article>
    );
};

const Articles = React.createClass({
    render() {
        const articles = renderArticles(this.props.articles);

        return (
            <section>
                { articles }
            </section>
        );
    }
});

module.exports = Articles;
宫修贤
2023-03-14

更新:截至

Render方法不必返回单个元素。也可以返回数组。

var indents = [];
for (var i = 0; i < this.props.level; i++) {
  indents.push(<span className='indent' key={i}></span>);
}
return indents;

return this.props.level.map((item, index) => (
    <span className="indent" key={index}>
        {index}
    </span>
));

文档在这里解释关于JSX孩子

旧的:

您可以使用一个循环来代替

var indents = [];
for (var i = 0; i < this.props.level; i++) {
  indents.push(<span className='indent' key={i}></span>);
}
return (
   <div>
    {indents}
    "Some text value"
   </div>
);

你也可以使用. map和花式es6

return (
   <div>
    {this.props.level.map((item, index) => (
       <span className='indent' key={index} />
    ))}
    "Some text value"
   </div>
);

此外,还必须将返回值包装在容器中。我在上面的例子中使用了div

正如医生在这里说的

目前,在组件的渲染中,您只能返回一个节点;如果您有一个div列表要返回,您必须将组件包装在div、span或任何其他组件中。

 类似资料:
  • 问题内容: 我正在尝试将jQuery组件转换为React.js,而我遇到的困难之一是基于for循环渲染n个元素。 我了解这是不可能的,也不建议这样做,并且在模型中存在数组的地方使用它完全有意义。很好,但是当您没有数组时该怎么办?取而代之的是,您拥有一个等于要渲染的给定元素数量的数值,那么您应该怎么做? 这是我的示例,我想根据元素的层次结构级别为元素添加任意数量的span标签。因此,在第3级,我要在

  • 问题内容: 你能告诉我如何在react js中渲染列表吗?我喜欢这样 问题答案: 您可以通过两种方式进行操作: 第一: 第二: 直接在返回中编写map函数

  • 我想呈现一个消息数组: 此代码适用于: 但是如果我写这样的代码有什么区别: 这里,键在呈现时总是生成随机数。两个版本都适用于我的应用程序。 另外,如果我有1000条消息,那么如果在消息数组中添加了一条额外的消息-,是否所有消息都会重新提交当收到新的时,总是重新发布每条消息,这似乎是应用程序的一大负担。

  • 问题内容: 我试图通过对象属性(此示例的名称)并在函数的轻松循环中列出它们。我发现这样做有些尴尬,但这似乎不正确。 这是我得到的: 有一个更好的方法吗?我只需要一个循环即可遍历对象数组,列出所需的属性并创建许多html节点之一。 问题答案: 您可以简单地在数组上 映射

  • 我想显示从数组只有两个数据。数据是这样的: 0:名称:“jan”url:https://www.pet/event/imain5/" 1:名称:“willium”url:https://www.pet/event/imain6/" 2:名称:"petter"url:"https://www.pet/event/imain7/" 现在在我的代码中,它显示了从0到2的所有名称。 但我想显示前两个名称,

  • 我创建了一个需要在应用程序的多个部分中单独显示的组件-(在我的导航内部、主页和单独的路由上)。因此,我在此组件中的一个use中进行了所有操作调度(用于读取数据的api调用)效果: 如您所见,此效果应该只运行一次(当组件装载时)。 在其他任何地方,我都不会在此组件内部或外部调度这些特定操作。 该组件在3个位置渲染(导航内部、其自身的时间路径和主组件内部)。我可以在导航内部同时在时间上渲染它,没有问题