在React组件中使用.map从数据库数组中删除多个元素?

时间:2016-06-20 02:17:00

标签: javascript arrays reactjs

我正在学习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)返回以下屏幕截图。

enter image description here

2 个答案:

答案 0 :(得分:0)

编辑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的内部差异算法的一部分要求使用唯一的密钥来识别生成的对象列表&#39;属性。您需要将此属性添加到每个迭代器的包装Div。

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

动态儿童部分对此有一个很好的解释: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>
    );
  }
}

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

答案 1 :(得分:0)

在你的输出中.. 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 这是未经测试的解决方案。您可能会收到语法错误