React.js在render中调用递归函数

时间:2016-03-04 13:21:26

标签: javascript recursion reactjs jsx

尝试使用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方法接收一个对应于树的“级别”的数组。我的目标是'打印'这个级别的每个元素(所以我使用map迭代数组),但也打印当前元素的任何可能的子级别,所以我试图递归调用函数,传递'sons'的当前元素作为递归调用的新数组参数。

出于某种原因,请致电:

  

{self.printTree(category.sons_array)}

给了我:未捕获的SyntaxError:http://127.0.0.1/gims-webapp/components/NavBar.js:意外的令牌(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>

2 个答案:

答案 0 :(得分:2)

如果您将代码粘贴到babel repl,您会看到示例中的错误位置 - 它位于level.map(...)内,因为您应该只返回一个 react节点map方法(但您有<li > + 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>
   );
 })

答案 1 :(得分: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>

这是几个根节点。