【问题标题】:Rendering React Components from Array of Objects从对象数组渲染 React 组件
【发布时间】:2015-11-16 09:36:06
【问题描述】:

我有一些称为站的数据,它是一个包含对象的数组。

stations : [
  {call:'station one',frequency:'000'},
  {call:'station two',frequency:'001'}
]

我想为每个数组位置渲染一个 ui 组件。到目前为止我可以写

 var stationsArr = []
 for (var i = 0; i < this.data.stations.length; i++) {
     stationsArr.push(
         <div className="station">
             {this.data}
         </div>
     )
 }

然后渲染

render(){
 return (
   {stationsArr}
 )
}

问题是我正在打印所有数据。相反,我只想显示一个像 {this.data.call} 这样的键,但它什么也没打印。

如何遍历这些数据并为数组的每个位置返回一个新的 UI 元素?

【问题讨论】:

  • 我可能错了,但我认为您需要在 render 函数中使用 stationsArr 而不是 stations

标签: javascript reactjs


【解决方案1】:

您可以将站点列表映射到 ReactElements。

使用 React >= 16,可以从同一个组件返回多个元素,而无需额外的 html 元素包装器。从 16.2 开始,有一个 new syntax <> 来创建片段。如果这不起作用或您的 IDE 不支持,您可以改用 &lt;React.Fragment&gt;。在 16.0 和 16.2 之间,您可以使用非常简单的polyfill 进行片段。

试试下面的

// Modern syntax >= React 16.2.0
const Test = ({stations}) => (
  <>
    {stations.map(station => (
      <div key={station.call} className='station'>{station.call}</div>
    ))}
  </>
); 

// Modern syntax < React 16.2.0
// You need to wrap in an extra element like div here

const Test = ({stations}) => (
  <div>
    {stations.map(station => (
      <div className="station" key={station.call}>{station.call}</div>
    ))}
  </div>
); 

// old syntax
var Test = React.createClass({
    render: function() {
        var stationComponents = this.props.stations.map(function(station) {
            return <div className="station" key={station.call}>{station.call}</div>;
        });
        return <div>{stationComponents}</div>;
    }
});
 
var stations = [
  {call:'station one',frequency:'000'},
  {call:'station two',frequency:'001'}
]; 

ReactDOM.render(
  <div>
    <Test stations={stations} />
  </div>,
  document.getElementById('container')
);

不要忘记key 属性!

https://jsfiddle.net/69z2wepo/14377/

【讨论】:

  • @thatgibbyguy:哦,是的!这可能是正确的答案。需要围绕您的子组件进行包装。您的 render 函数必须返回一个元素。
  • 建议每个站元素的关键属性的原因是什么?我要问的是,如果现在不需要它会发生什么变化?
  • @thatgibbyguy 在这种情况下并没有带来太多优势。在更高级的示例中,它允许具有更好的渲染性能,因为 React 可以很容易地知道现有节点是否已移动到站阵列中的另一个位置,从而避免销毁和重新创建现有 dom 节点(并保持 dom 节点挂载) .它在反应文档中:facebook.github.io/react/docs/reconciliation.html#keys
  • 有点题外话,但我不知道如何构造一个查询来问这个。在上面的示例中使用 ES6 语法时,如何从地图中传递索引? IOW,我怎样才能确定我是否在数组的最后一个节点中?我尝试用括号包裹,但似乎并不顺利。
  • @ElHombre stations.map((station,index) =&gt; { }) 适合我
【解决方案2】:

我有一个答案,对于像我这样的新手来说可能不会那么混乱。您可以在组件渲染方法中使用map

render () {
   return (
       <div>
           {stations.map(station => <div key={station}> {station} </div>)} 
       </div>
   );
}

【讨论】:

【解决方案3】:

this.data 大概包含所有数据,因此您需要执行以下操作:

var stations = [];
var stationData = this.data.stations;

for (var i = 0; i < stationData.length; i++) {
    stations.push(
        <div key={stationData[i].call} className="station">
            Call: {stationData[i].call}, Freq: {stationData[i].frequency}
        </div>
    )
}

render() {
  return (
    <div className="stations">{stations}</div>
  )
}

如果你使用 ES6,你也可以使用 map 和箭头函数:

const stations = this.data.stations.map(station =>
    <div key={station.call} className="station">
      Call: {station.call}, Freq: {station.frequency}
    </div>
);

【讨论】:

  • 这在当前的 React 版本中不起作用,你不能返回一个数组。
  • @AftabNaveed 谢谢我已经更新了,渲染应该返回一个元素,但是里面有一个元素数组是有效的
  • 正如@AftabNaveed 所说,如果反应版本return stations; (codepen.io/pawelgrzybek/pen/WZEKWj)
【解决方案4】:

有几种方法可以使用。

const stations = [
  {call:'station one',frequency:'000'},
  {call:'station two',frequency:'001'}
];
const callList = stations.map(({call}) => call)

解决方案一

<p>{callList.join(', ')}</p>

解决方案 2

<ol>    
  { callList && callList.map(item => <li>{item}</li>) }
</ol>

当然还有其他的方法。

【讨论】:

    【解决方案5】:

    这很可能是实现您所寻找的最简单的方法。

    为了在这种情况下使用这个map 函数,我们必须传递一个currentValue(总是必需的)参数,以及一个index(可选)参数。 在下面的例子中,station 是我们的currentValuex 是我们的index

    station 表示迭代时数组中对象的当前值。 x 自动递增;每次映射一个新对象时增加一。

    render () {
        return (
            <div>
                {stations.map((station, x) => (
                    <div key={x}> {station} </div>
                ))}
            </div>
        );
    }
    

    Thomas Valadez 的回答是,虽然它提供了从对象数组渲染组件的最佳/最简单方法,但它未能正确解决在此过程中分配键的方式。

    【讨论】:

      猜你喜欢
      • 2018-11-29
      • 2019-11-15
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多