【问题标题】:Looping through an array in ReactJs在 ReactJs 中循环遍历数组
【发布时间】:2015-09-11 08:16:56
【问题描述】:

我正在尝试遍历数组并在元素内呈现数据。我正在使用 ReactJs。

我的数据数组:

var data = [{
      type: "Academic",
      time: "2015 - 2016",
      title: " MSc Software Engineering",
      place: "University of Oxford",
      description: "Lorem impsum",
      gallery: [
        {url: "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash2/v/t1.0-1/p160x160/10923196_10204583699694173_6145976884213630323_n.jpg?oh=bd235908314ecf0ab5afa8d3f92f5abf&oe=567B51F9&__gda__=1450897067_285c7c8c720c0f130453b37e9ff9b2f8"}
      ]
    }

数据应该被推送到的数组:

var events = []

循环:

for (var i = 0; i < data.length; i++) {
      var directions;
      if (data[i] % 2 == 0) {
        directions = "direction-r";
      } else {
        directions = "direction-l"
      }
      events.push(
        <li>
          <TimelineEvent type={data[i].type}
            time = {data[i].time}
            title = {data[i].title}
            place = {data[i].place}
            description = {data[i].description}
            direction = {directions}/>
        </li>
      )
    }

渲染后的数据应该是什么样子:

<li>
  <TimelineEvent
     type = "Academic"
     time = "2015 - 2016"
     title = "MSc Software Engineering",
     place = "University of Oxford",
     description = "Lorem ipsum"
     direction = "direction-r" />
</li>
<li>
  <TimelineEvent
     type = "Academic"
     time = "2015 - 2016"
     title = "MSc Software Engineering",
     place = "University of Oxford",
     description = "Lorem ipsum"
     direction = "direction-l" />
</li>

对于偶数和奇数元素,“方向”必须是“r”或“l”。

我收到错误:

TypeError: Cannot read property 'type' of undefined
   at Timeline.render (/Users/hilarl/Desktop/client/build/webpack:/src/components/ProfilePage/Layout/Main/Main.js:102:41)
   at [object Object].ReactCompositeComponentMixin._renderValidatedComponentWithoutOwnerOrContext (/Users/hilarl/Desktop/client/node_modules/react-dom/node_modules/react/lib/ReactCompositeComponent.js:546:34)
   at [object Object].ReactCompositeComponentMixin._renderValidatedComponent (/Users/hilarl/Desktop/client/node_modules/react-dom/node_modules/react/lib/ReactCompositeComponent.js:566:32)
   at [object Object].wrapper [as _renderValidatedComponent] (/Users/hilarl/Desktop/client/node_modules/react-dom/node_modules/react/lib/ReactPerf.js:66:21)
   at [object Object].ReactCompositeComponentMixin.mountComponent (/Users/hilarl/Desktop/client/node_modules/react-dom/node_modules/react/lib/ReactCompositeComponent.js:181:32)
   at [object Object].wrapper [as mountComponent] (/Users/hilarl/Desktop/client/node_modules/react-dom/node_modules/react/lib/ReactPerf.js:66:21)
   at Object.ReactReconciler.mountComponent (/Users/hilarl/Desktop/client/node_modules/react-dom/node_modules/react/lib/ReactReconciler.js:37:35)
   at ReactDOMComponent.ReactMultiChild.Mixin.mountChildren (/Users/hilarl/Desktop/client/node_modules/react-dom/node_modules/react/lib/ReactMultiChild.js:207:44)
   at ReactDOMComponent.Mixin._createContentMarkup (/Users/hilarl/Desktop/client/node_modules/react-dom/node_modules/react/lib/ReactDOMComponent.js:541:32)
   at ReactDOMComponent.Mixin.mountComponent (/Users/hilarl/Desktop/client/node_modules/react-dom/node_modules/react/lib/ReactDOMComponent.js:438:27)

我并不是真正的 JS 专业人士,所以我可能做得不对。知道这里有什么问题吗?非常感谢

【问题讨论】:

    标签: javascript arrays loops for-loop reactjs


    【解决方案1】:

    不妨试试:

    for (var i = 0; i < data.length; i++) {
          var directions;
          if (data[i] % 2 == 0) {
            directions = "direction-r";
          } else {
            directions = "direction-l"
          }
          events.push(
            <li>
              <TimelineEvent type={data[i].type}
                time = {data[i].time}
                title = {data[i].title}
                place = {data[i].place}
                description = {data[i].description}
                direction = {directions}/>
            </li>
          )
        } 
    

    你也可以使用forEach而不是for循环

    【讨论】:

    • 谢谢,这似乎有效。但部分: if (data[i] % 2 == 0) {方向 = "direction-r"; } else { direction = "direction-l" } 似乎没有任何影响。是不是应该这样?
    • @kostbone 上面的答案将修复该部分
    【解决方案2】:

    还有一件事,您可能应该更改以下代码行

    if (data[i] % 2 == 0)
    

    应该是if (i % 2 == 0),因为data[i]会从data数组返回对象

    【讨论】:

      【解决方案3】:

      已经回答了,但是如果你想尝尝一些功能代码:

      var events = data.map(function (datum, index) {
          var directions = 'direction-'; 
          directions += index % 2 === 0 ? 'r' : 'l';
          return (
               <li>
                   <TimelineEvent 
                       type={datum.type}
                       time={datum.time}
                       title={datum.title}
                       place={datum.place}
                       description={datum.description}
                       direction={directions} 
                    >
                       { datum.gallery.map(function (link) {
                           return (
                               <a href="#">
                                 <img 
                                     className="timelineGalleryImage" 
                                     src={link.url} />
                               </a>
                           );
                       } }
                   <TimelineEvent />
              </li>
          );
      })
      

      【讨论】:

      • 感谢 gcedo,使用这种方法,代码看起来更清晰。我收到错误:TypeError:无法读取未定义的属性“地图”。而且,您是否可以解释我如何遍历画廊:[] 为每个事件?我正在尝试将其显示为
      • 第一个错误是因为数据未定义,在此之前检查。我已经更新了答案,我试图了解您想要实现的目标。
      猜你喜欢
      • 1970-01-01
      • 2021-04-26
      • 2014-06-04
      • 1970-01-01
      • 2019-07-10
      • 2012-05-24
      • 2016-05-25
      相关资源
      最近更新 更多