【问题标题】:ES6 - Destructuring and For of Loop only returns first objectES6 - 解构和循环只返回第一个对象
【发布时间】:2018-02-05 05:34:40
【问题描述】:

我有一个通过以下对象循环的反应应用程序:

const topics = [
  {name: 'Mon', color: 'blue', id: 1},
  {name: 'Tue', color: 'red', id: 2},
  {name: 'Wed', color: 'pink', id: 3},
]

我试图在我的功能组件中通过for of loop 解构和循环对象

 export const Data = () => {
       for (let {name, color, id} of topics) {
           console.log(name, color, id) //Only first iteration is outputted
               return (
                <div key={id}>
                    <div>{name}</div>
                    <div>{color}</div>
                </div>  
               )                                               
       }
    }

我只收到1, Mon, blue 我错过了什么?这与returnrender 有关吗?

【问题讨论】:

  • 您的return 循环中有一个return 语句。这将退出函数并因此停止 for 循环。
  • 如何循环并仍将所有数据返回/呈现为 JSX?
  • 我自己并不了解 JSX,但这里有一个想法:Rendering an Array of Data with map() and JSX 我花了 10 秒才找到 Google。
  • 有道理。

标签: javascript reactjs ecmascript-6 destructuring


【解决方案1】:

For of Loop 只返回第一个对象,为什么?

因为您在for...of 正文中使用了return 语句,这会打破循环并返回结果。删除 return 并检查它是否会打印所有值。

检查这个sn-p:

const topics = [
  {name: 'Mon', color: 'blue', id: 1},
  {name: 'Tue', color: 'red', id: 2},
  {name: 'Wed', color: 'pink', id: 3},
]


for (let {name, color, id} of topics) {
   console.log(name, color, id);                       
}

要渲染所有数据使用#array.map而不是for...of循环,这样写:

export const Data = () => (
    <div>
        {
            topics.map( ({ name, color, id }) => {
                return (
                    <div key={id}>
                        <div>{name}</div>
                        <div>{color}</div>
                    </div>  
                )
            })                                               
        }
    </div>
)

【讨论】:

  • 有道理,但是我得到一个错误,无法在 react 上渲染 JSX div,我应该如何重新考虑才能渲染数据?
  • 检查更新的答案,使用 map 而不是 for 循环 :)
  • 非常感谢!!人们在这里很严厉,因为提出问题而被否决?我们都开始在某个地方学习......
  • 正确,不要犹豫,提出问题,忽略不赞成票:)
【解决方案2】:

在您提出的评论中:

我怎样才能循环并仍然将所有数据返回/呈现为 JSX?

你会返回一个包含元素的数组,通常使用Array#map

export const Data = () => {
    return topics.map(({name, color, id}) => (
        <div key={id}>
            <div>{name}</div>
            <div>{color}</div>
        </div>  
    ));
};

旁注:虽然您可以在自己的代码中做任何您喜欢的事情,但 JavaScript 中的压倒性约定是只有构造函数以大写字母开头。所有其他函数都以小写字母开头。

【讨论】:

  • @TJ Crowder,我遵循 react 的约定:“始终以大写字母开头组件名称”reactjs.org/docs/components-and-props.html
  • @NullisTrue:我不确定Data 是一个组件,因为它没有单个顶级元素(除非您使用的是允许数组的 v16),并且它关闭了主题,这意味着它不是独立的。但同样,取决于你。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 2019-02-06
相关资源
最近更新 更多