【问题标题】:React.js call recursive function in renderReact.js 在渲染中调用递归函数
【发布时间】:2016-06-18 06:05:49
【问题描述】:

尝试使用 React.js 显示分层树视图

我的渲染方法:

render: function(){
  var self= this;
  return(
    <div className="panel panel-flat content-group-lg">
      <div className='panel-body'>
        <div className="tree">
          <ul>
            <li>
              <a href="#">Categorias</a>                  
                { self.printTree(this.state.tree_array) }                        
            </li>  
          </ul>        
        </div>
      </div>
    </div>
  )
}

和我的 printTree 方法:

printTree: function(level){
  console.log(level);
  var self = this;
  var level_length = level.length;

  if(level_length >= 1){
    return(
      <ul>{
        level.map(function(category){
          return (
            <li key={category.fields.name}>
              <a href='#'>{category.fields.name}</a>
            </li>
            {self.printTree(category.sons_array)}
          )         
        })
      }</ul>
    )
  }
}

printTree 方法接收与树的“级别”对应的数组。我的目标是“打印”这个级别的每个元素(所以我使用映射来迭代数组)但也打印当前元素的任何可能的子级别,所以我尝试递归调用函数,传递“儿子”当前元素作为递归调用的新数组参数。

由于某种原因,调用:

{self.printTree(category.sons_array)}

给我:Uncaught SyntaxError: http://127.0.0.1/gims-webapp/components/NavBar.js: Unexpected token (901:84)

我正在使用 JSX,但不知道 JSX 在抱怨什么..

编辑:

我的最终结构应该是这样的:

<div class="tree">
    <ul>
        <li>
            <a href="#">Parent</a>
            <ul>
                <li>
                    <a href="#">Child</a>
                    <ul>
                        <li>
                            <a href="#">Grand Child</a>
                        </li>
                    </ul>
                </li>
                <li>
                    <a href="#">Child</a>
                    <ul>
                        <li><a href="#">Grand Child</a></li>
                        <li>
                            <a href="#">Grand Child</a>
                            <ul>
                                <li>
                                    <a href="#">Great Grand Child</a>
                                </li>
                                <li>
                                    <a href="#">Great Grand Child</a>
                                </li>
                                <li>
                                    <a href="#">Great Grand Child</a>
                                </li>
                            </ul>
                        </li>
                        <li><a href="#">Grand Child</a></li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</div>

【问题讨论】:

  • 你能给出完整的错误吗? (而不是“...”)
  • @Cohars 我发布了相关部分。错误不是那么直观,但无论如何我会编辑它。
  • 我在Unexpected token 之后期待别的东西 :) 好吧,看到不完整的错误令人沮丧

标签: javascript recursion reactjs jsx


【解决方案1】:

JSX requires expects only one Root Node,所以这段代码:

return (
    <li key={category.fields.name}>
        <a href="#">{category.fields.name}</a>
    </li>
    {self.printTree(category.sons_array)}
);

应改为:

return (
    <li key={category.fields.name}>
        <a href="#">{category.fields.name}</a>
        {self.printTree(category.sons_array)}
    </li>
);

或者就像返回:

<li>
 ...
</li>
<ul>
 ...
</ul>

哪些是几个根节点。

【讨论】:

  • 我认为将递归调用放在
  • 中并不能满足我对层次结构的需求。我用所需的结构编辑了我的问题。能适应吗?
  • 别介意...您的解决方案是正确的...可以按照您所说的方式构建结构...非常感谢您的帮助...
  • 现在如果我们想在每行前面显示序列号,如何在递归方法中以递增方式计算index值?
  • 【解决方案2】:

    如果您将代码粘贴到babel repl,您将看到示例中的错误在哪里——它在level.map(...) 内,因为您应该在map 方法中只返回一个反应节点(但你有&lt;li &gt; + self.printTree 那里)。你可以把 self.printTree 放在这个 li 里面:

    level.map(function(category){
      return (
        <li key={category.fields.name}>
          <a href='#'>{category.fields.name}</a>
          {self.printTree(category.sons_array)}
        </li>
       );
     })
    

    【讨论】:

    • @Pavarine 但在你的例子中你有完全相同的 - li&gt;a+ul,其中ulself.printTree的结果
    • 你的权利!!!别介意……结构完全一样!我接受了@Cohars 的回答,因为他比你早了几分钟,但我真的很感谢 Alexandr 的帮助!!
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签