如何在 React 中循环和渲染元素.js而没有要映射的对象数组?

2022-08-30 01:58:24

我正在尝试将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"
    ...
  );
}

当然,这不可能是最好的,或者说是实现这一目标的唯一方法?我错过了什么?


答案 1

更新:截至 React > 0.16

呈现方法不一定必须返回单个元素。也可以返回数组。

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 或任何其他组件中。


答案 2

以下是一些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;