Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用React组件处理递归数组映射?_Javascript_Reactjs_Recursion - Fatal编程技术网

Javascript 如何使用React组件处理递归数组映射?

Javascript 如何使用React组件处理递归数组映射?,javascript,reactjs,recursion,Javascript,Reactjs,Recursion,下面是一个名为index()的示例函数,我使用它从标记文件返回标题索引。正如您所看到的,只有3个级别的标题,它很快就会失控 我尝试了各种递归思想,但最终在createreact-app中编译失败 有没有人能提供一些指导来清理这个问题,甚至可以允许无限/更高级别的嵌套 数组存储在this.state.index中,类似于下面的数组 [ { label: 'Header title', children: [ { label: 'Sub-header

下面是一个名为
index()
的示例函数,我使用它从标记文件返回标题索引。正如您所看到的,只有3个级别的标题,它很快就会失控

我尝试了各种递归思想,但最终在
createreact-app
中编译失败

有没有人能提供一些指导来清理这个问题,甚至可以允许无限/更高级别的嵌套

数组存储在
this.state.index
中,类似于下面的数组

[
  {
    label: 'Header title',
    children: [
      {
        label: 'Sub-header title'
        children: [...]
      }
    ]
  }
]
然后在下面的函数中使用该数据生成
ul
索引

  index() {
    if ( this.state.index === undefined || !this.state.index.length )
      return;
    return (
      <ul className="docs--index">
        {
          this.state.index.map((elm,i=0) => {
            let key = i++;
            let anchor = '#'+elm.label.split(' ').join('_') + '--' + key;
            return (
              <li key={key}>
                <label><AnchorScroll href={anchor}>{elm.label}</AnchorScroll></label>
                <ul>
                  {
                    elm.children.map((child,k=0) => {
                      let key = i+'-'+k++;
                      let anchor = '#'+child.label.split(' ').join('_') + '--' + key;
                      return (
                        <li key={key}>
                          <label><AnchorScroll href={anchor}>{child.label}</AnchorScroll></label>
                            <ul>
                              {
                                child.children.map((grandchild,j=0) => {
                                  let key = i+'-'+k+'-'+j++;
                                  let anchor = '#'+grandchild.label.split(' ').join('_') + '--' + key;
                                  return (
                                    <li key={key}>
                                      <label><AnchorScroll href={anchor}>{grandchild.label}</AnchorScroll></label>
                                    </li>
                                  );
                                })
                              }
                            </ul>
                        </li>
                      );
                    })
                  }
                </ul>
              </li>
            );
          })
        }
      </ul>
    );
  }
index(){
if(this.state.index==未定义的| |!this.state.index.length)
返回;
返回(
    { this.state.index.map((elm,i=0)=>{ 设key=i++; 让anchor='#'+elm.label.split('').join('')+'-'+key; 返回(
  • {elm.label}
      { elm.children.map((child,k=0)=>{ 设key=i+'-'+k++; 让anchor='#'+child.label.split('').join('')+'-'+key; 返回(
    • {child.label}
        { child.children.map((孙子,j=0)=>{ 设key=i+'-'+k+'-'+j++; 让anchor='#'+grant.label.split('').join('')+'-'+key; 返回(
      • {grander.label}
      • ); }) }
    • ); }) }
  • ); }) }
); }

就像我说的,这真是一团糟!一般来说,我对反应和编码是新手,如果这是一个愚蠢的问题,我很抱歉。

我没有好的测试数据,但请尝试一下:

index() {
    if ( this.state.index === undefined || !this.state.index.length ) {
        return null;
    }

    const sections = this.state.index.map(this.handleMap);

    return (
        <ul>
            {sections}
        </ul>
    )

}

handleMap(elm, i) {
    const anchor = '#'+elm.label.split(' ').join('_') + '--' + i;
    return (
        <li key={i}>
            <label><AnchorScroll href={anchor}>{elm.label}</AnchorScroll></label>
            <ul>
                {
                    elm.children.map(this.handleMapChildren)
                }
            </ul>
        </li>
    );
}

handleMapChildren(child, i) {
    let anchor = '#'+child.label.split(' ').join('_') + '--' + i;
    return (
        <li key={i}>
            <label><AnchorScroll href={anchor}>{child.label}</AnchorScroll></label>
            <ul>
                {
                    child.children.map(this.handleMapChildren)
                }
            </ul>
        </li>
    );
}
index(){
if(this.state.index==未定义的| |!this.state.index.length){
返回null;
}
const sections=this.state.index.map(this.handleMap);
返回(
    {sections}
) } handleMap(elm,i){ 常量anchor='#'+elm.label.split('').join('')+'-'+i; 返回(
  • {elm.label}
      { elm.children.map(此为handleMapChildren) }
  • ); } 手把手儿童(儿童,i){ 让anchor='#'+child.label.split('').join('')+'-'+i; 返回(
  • {child.label}
      { child.children.map(this.handleMapChildren) }
  • ); }
    似乎需要对组件进行递归调用。
    例如,组件
    将根据一个条件(存在
    子项
    数组)自身呈现它

    运行示例:

    const数据=[
    {
    标签:'标题',
    儿童:[
    {
    标签:“子标题”,
    儿童:[
    {标签:'3级#1'},
    {
    标签:“第三级#2”,
    儿童:[
    {标签:'级别4'}
    ]
    }
    ]
    }
    ]
    }
    ]
    类项扩展了React.Component{
    render(){
    const{label,children}=this.props;
    返回(
    {label}
    {children&&children.map((项,索引)=>)}
    )
    }
    }
    常量应用=()=>(
    {data.map((项,索引)=>)}
    );
    ReactDOM.render(,document.getElementById('root'))
    
    
    
    看一看,您好,上面相同的示例是否可以下一页,如HeaderTitle是一页,而单击HeaderTitle它将导航到Header#2页,单击此按钮它将导航到下一页。。。在单个页面中,我们只需要传递不同的参数。有可能这样做吗?。如果你知道,你能帮我吗?@user抱歉,我不明白这个问题。我相信这应该作为一个单独的问题与代码示例等问。请检查这里我张贴了我的问题