【问题标题】:Rending multiple elements from database array using .map in a React Component?在 React 组件中使用 .map 从数据库数组中渲染多个元素?
【发布时间】:2016-06-20 02:16:59
【问题描述】:

我正在学习 React,但遇到了渲染多个元素的问题。

问题是我正在从 Firebase 检索一个数组,它需要为数组中的每个项目返回一个新的 div 和 svg。我知道 React 只会渲染 1 个元素,所以我需要将我的内容放在一个包装器中,我已经这样做了。我还创建了一个变量,它使用 .map() 循环遍历数组并为我创建这些元素。

我不明白的是,为什么它没有为数组中的每个项目返回一个新的 div 和 svg?相反,它只创建 1 个 div 和 svg?该数组包含文件夹名称列表。

任何帮助将不胜感激。

class SidebarPrivateFolders extends React.Component {
  constructor(props) {
    super(props)
  }

  render() {

    let list = this.props.data.map((currentObj) => {
      return (
        <div>
          <svg className="sidebar-icon">
            <use xlinkHref={currentObj.xlinkHref}></use>
          </svg>
          <div className="public-folders">{currentObj.name}</div>
        </div>
      );
    });

    return (
      <div className="sidebar-section">
        <div className="sidebar-section-wrapper">
          {list}
        </div>
      </div>
    );
  }
}

Console.log(this.props.data) 返回以下截图。

【问题讨论】:

  • 可以发this.props.data的样本数据
  • 确实如此......数据是一个只有一个元素的数组......也许你想要data[0].name[0].map(fn)

标签: javascript arrays reactjs


【解决方案1】:

在您的输出中.. currentObj.name 是一个 array.. 因此,如果您希望为 name 数组中的每个元素创建 div,您还必须对其进行循环。

你可以这样做:

class SidebarPrivateFolders extends React.Component {
  constructor(props) {
    super(props)
  }

  render() {

    let list = this.props.data.map((currentObj) => {
return currentObj.name[0].map((innerArray,i) => { 
      return (
        <div key={i}>
          <svg className="sidebar-icon">
            <use xlinkHref={currentObj.xlinkHref}></use>
          </svg>
          <div className="public-folders">{currentObj.innerArray[i]}</div>
        </div>
      );
    });
    });

    return (
      <div className="sidebar-section">
        <div className="sidebar-section-wrapper">
          {list}
        </div>
      </div>
    );
   }

P.S这是未经测试的解决方案。您可能会遇到语法错误

【讨论】:

  • 根据@azium 评论,您可能想尝试currentObj.name[0].map 而不是currentObj.name.map,请参阅已编辑的答案
  • 编辑:我不得不将名称更改为 [innerArray] 并且它没有正确显示。谢谢您的帮助!我在一个 Array 中有一个 Array 并且需要正确地循环它是有道理的。原文:这个答案有点工作。进步,但并不完全有。它使用文件夹图标呈现 9 个不同的 div,但是每个文件夹的名称都显示在第一个 div 中。
  • 是的...[name] 应该是内部数组,正如我在 OP trhat 中所说,它未经测试..快乐编码!!!
【解决方案2】:

EDIT v2:您的数据输入的组织方式很有趣,如果您从更高级别创建此输入,重新组织它的组成方式可能会很有效,但是,从数据数组中解构项目可以更容易地调用后续功能:

// Take out the name array and xlinkHref from data
let {xlinkHref, name} = this.props.data[0];
let list = name[0].map((name, i) => {
  return (
    <div key={'sidebar_'+i}>
      <svg className="sidebar-icon">
        <use xlinkHref={xlinkHref}></use>
      </svg>
      <div className="public-folders">{name}</div>
    </div>
  );
});

没有数据样本的原始响应:

React 内部 diffing 算法的一部分要求生成的对象列表使用唯一的“key”属性进行标识。您需要将此属性添加到每个迭代器的包装 Div。

因此,在 Map 函数中,您可以跟踪地图索引的参数,并使用该参数将列表的键分开。

Dynamic Children 部分对此有很好的解释:https://facebook.github.io/react/docs/multiple-components.html

您的代码可能如下所示:

class SidebarPrivateFolders extends React.Component {
  constructor(props) {
    super(props)
  }

  render() {

    let list = this.props.data.map((currentObj, i) => {
      return (
        <div key={'sidebarlist_'+i}>
          <svg className="sidebar-icon">
            <use xlinkHref={currentObj.xlinkHref}></use>
          </svg>
          <div className="public-folders">{currentObj.name}</div>
        </div>
      );
    });

    return (
      <div className="sidebar-section">
        <div className="sidebar-section-wrapper">
          {list}
        </div>
      </div>
    );
  }
}

如果这能解决您的问题,请告诉我。

【讨论】:

  • 嗯,我好像收到“无法读取未定义的属性 0”
  • 哦,我看错了 Data 对象,它是一个数组。你是如何创建这些数据的?为了准确起见,我会编辑我的帖子,抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
相关资源
最近更新 更多