如何在React中循环一个对象?

时间:2016-10-10 19:40:30

标签: javascript reactjs

React的新功能并试图循环Object属性但React抱怨对象无效React儿童,有人可以就如何解决这个问题给我一些建议吗?我添加了createFragment但不完全确定需要采取的措施或采取何种方法?

JS

var tifs = {1: 'Joe', 2: 'Jane'};
var tifOptions = Object.keys(tifs).forEach(function(key) {
    return <option value={key}>{tifs[key]}</option>
});

渲染功能

render() {
        const model = this.props.model;

        let tifOptions = {};

        if(model.get('tifs')) {
            tifOptions = Object.keys(this.props.model.get('tifs')).forEach(function(key) {
                return <option value={key}>{this.props.model.get('tifs')[key]}</option>
            });
        }

        return (
            <div class={cellClasses}>

                    <div class="grid__col-5 text--center grid__col--bleed">
                        <h5 class="flush text--uppercase">TIF</h5>
                        <select id="tif" name="tif" onChange={this.handleChange}>
                            {tifOptions}
                        </select>
                    </div>

            </div>
        );
    }

控制台错误

If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object)

7 个答案:

答案 0 :(得分:86)

问题在于您使用forEach()的方式,因为它始终会返回undefined。您可能正在寻找map()方法,该方法返回一个新数组:

var tifOptions = Object.keys(tifs).map(function(key) {
    return <option value={key}>{tifs[key]}</option>
});

如果您仍想使用forEach(),则必须执行以下操作:

var tifOptions = [];

Object.keys(tifs).forEach(function(key) {
    tifOptions.push(<option value={key}>{tifs[key]}</option>);
});

<强>更新

如果你正在编写ES6,你可以使用arrow function完成同样的事情:

const tifOptions = Object.keys(tifs).map(key => 
    <option value={key}>{tifs[key]}</option>
)

这是一个显示上述所有选项的小提琴:https://jsfiddle.net/fs7sagep/

答案 1 :(得分:3)

您还可以像下面这样一个返回div,并使用Javascript的内置模板文字:

const tifs = {1: 'Joe', 2: 'Jane'};

return(

        <div>
            {Object.keys(tifOptions).map((key)=>(
                <p>{paragraphs[`${key}`]}</p>
            ))}
        </div>
    )

答案 2 :(得分:2)

您可以使用map函数

{Object.keys(tifs).map(key => (
    <option value={key}>{tifs[key]}</option>
))}

答案 3 :(得分:1)

您可以按以下更紧凑的方式使用它:

var tifs = {1: 'Joe', 2: 'Jane'};
...

return (
   <select id="tif" name="tif" onChange={this.handleChange}>  
      { Object.entries(tifs).map((t,k) => <option key={k} value={t[0]}>{t[1]}</option>) }          
   </select>
)

答案 4 :(得分:1)

当我将 Object.entriesmap 一起使用时,我使用 Array Destructuring 如下所示并直接调用它们。

Object.entries(tifs).map(([key, value]) => (
    <div key={key}>{value}</div>
));

答案 5 :(得分:0)

const tifOptions = [];

for (const [key, value] of Object.entries(tifs)) {
    tifOptions.push(<option value={key} key={key}>{value}</option>);
}

return (
   <select id="tif" name="tif" onChange={this.handleChange}>  
      { tifOptions }          
   </select>
)

答案 6 :(得分:-3)

我强烈建议您使用数组而不是对象,如果您正在做反应,这是我使用它的语法。

const rooms = this.state.array.map((e, i) =>(<div key={i}>{e}</div>))

要使用该元素,只需将{rooms}放入jsx。

其中e =数组的元素,i =元素的索引。阅读更多here。 如果您正在寻找itteration,这就是实现它的方法。