【问题标题】:Render a Nested Element based on nested Array基于嵌套数组渲染嵌套元素
【发布时间】:2019-05-12 08:24:14
【问题描述】:

我得到了这个嵌套数组,我需要遍历它来创建嵌套容器。 lvl4 应该进入 lvl3lvl3lvl2lvl2 内部 lvl1

const elements = [ 
  { name: 'a-lvl1', innerEl: [ 
    { name: 'a1-lvl2', innerEl: [
      { name: 'a1-lvl3' , innerEl: [ 
        { name: 'a-lvl4', innerEl: [] }
      ] },
      { name: 'a2-lvl3' , innerEl: [ 
        { name: 'a-lvl4', innerEl: [] }
      ] }
    ] },
    { name: 'a2-lvl2', innerEl: [
      { name: 'a-lvl3' , innerEl: [ 
        { name: 'a-lvl4', innerEl: [] }
      ] }
    ] },
    { name: 'a3-lvl2', innerEl: [
      { name: 'a-lvl3' , innerEl: [ 
        { name: 'a-lvl4', innerEl: [] }
      ] }
    ] },
  ] },
  { name: 'b-lvl1', innerEl: [ { }] },
  { name: 'c-lvl1', innerEl: [ { }] }
]

这是当前脚本,它正在运行,但我正在寻找一个更简单的解决方案。

let renderElements = null;

if( elements !== undefined || elements.length != 0 ) {
  renderElements = elements.map( lvl1 => {   
    let lvl2Blocks = null;

    if( lvl1.innerEl !== undefined || lvl1.innerEl.length != 0) {
      lvl2Blocks = lvl1.innerEl.map( lvl2 => {
        let lvl3Blocks = null;

        if( lvl2.innerEl !== undefined || lvl2.innerEl.length != 0) {
          lvl3Blocks = lvl2.innerEl.map( lvl3 => {
            let lvl4Blocks = null;

            lvl4Blocks = lvl3.innerEl.map( lvl4 => {
              return (
                <div name={lvl4.name} selected={null} > 
                  { lvl4.innerEl !== undefined && lvl4Blocks }
                </div>
              )
            });

            return (
              <div name={lvl3.name} selected={null} > 
                { lvl3.innerEl !== undefined && lvl4Blocks }
              </div>
            )
          });
        }

        return (
          <div name={lvl2.name} selected={null} > 
            { lvl2.innerEl !== undefined && lvl3Blocks }
          </div>
        )
      });
    }

    return (
      <div name={lvl1.name} selected={null} > 
        { lvl1.innerEl !== undefined && lvl2Blocks }
      </div>
    )
  });
}

有什么想法吗?谢谢。

【问题讨论】:

    标签: arrays node.js reactjs nested


    【解决方案1】:

    here 所示,我在Codesandbox 中为您创建了一个可行的解决方案

    同样,诀窍是在这里使用递归。因此,使用这个简单的组件,您将能够随心所欲地渲染。

    function ListItem({ item }) {
      let children = null;
      if (item.innerEl && item.innerEl.length) {
        children = (
          <ul>
            {item.innerEl.map(i => (
              <ListItem item={i} key={i.id} />
            ))}
          </ul>
        );
      }
    
      return (
        <li>
          {item.name}
          {children}
        </li>
      );
    }
    

    但请记住,您需要修复数据结构。如果您的数组应该是空的,请不要像这样在其中放置一个空对象:

    { name: 'b-lvl1', innerEl: [ { }] },
    

    应该是这个样子,或者你需要修改ListItem组件来检查第一项是否为空对象

    { name: 'b-lvl1', innerEl: [] },
    

    【讨论】:

    • 太棒了。谢谢!我在上一个帖子中支持您的解决方案。顺便说一下,这些数组不是空的。只是没有时间填写。:)
    • @randomtu 谢谢。啊好吧。然后忽略我对此的陈述;)
    • 你知道在进行递归时有什么方法可以提高性能吗? stackoverflow.com/questions/53843662/…
    • 为了提高性能,如果你不想更新它,你需要在 shouldComponentUpdate 中返回 false。 PureComponent 确实自己实现了一个 shouldComponentUpdate 函数,在该函数中它会在属性和组件状态之间进行影子比较。
    猜你喜欢
    • 2017-10-01
    • 2019-06-16
    • 2021-02-01
    • 2016-06-20
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多