如何有条件地添加关闭和启动JSX标记

时间:2016-09-29 15:51:56

标签: reactjs react-jsx

我从来没有弄清楚如何有条件地关闭现有的JSX标记并启动一个新标记而不会在Visual Studio中出现语法错误。这是怎么做到的?在下面的示例中,我想将现有表拆分为两个表。如果删除条件代码,我不会收到任何语法错误。

<table>
    <thead>
        ...
    </thead>

    {true ?
     </table> /* Close first table (Syntax error on this line because of no starting tag) */
     <table>  /* Create a new table by splitting the existing table */
    : null}

    <tbody>
        ...
    </tbody>
</table>

3 个答案:

答案 0 :(得分:2)

我通过创建一个renderTable(rows)方法解决了这个问题,我调用了每个需要在一个单独的表中的行组:

render() {
    let tables = [];
    let tableRows = [];

    this.props.rows.forEach(row => {
        tableRows.push(row);
        if (someCondition()) {
            // end the table after this row
            tables.push(this.renderTable(tableRows));
            tableRows = [];
        }
    });

    if (tableRows.length) {
        tables.push(this.renderTable(tableRows));
    }

    return <div>{tables}</div>;
}

renderTable(rows) {
    return <table>
        <tbody>
        {rows.map ..... }
        </tbody>
    </table>
}

答案 1 :(得分:1)

我找不到解决此问题的方法,所以我只是用if语句手动解决了问题。

if (condition === true) {
    return (<table>...</table> <table>...</table>);
} else {
    return (<table>...</table>);
}

答案 2 :(得分:-1)

你应该关闭大括号{}中的HTML标记,除非它是在大括号内创建的。

示例:

<div>
{</div>} //wrong

<div>
  {1 + 5}
</div> //correct

<div>
  {2+3 === 5 ? <div>hello</div> : <div>world</div>}
</div> //correct

<div>
  {2+3 === 5 ? <div>{6 + 7}</div> : <div>{5 + 5}</div>}
</div> //correct

除此之外,{}只能包含HTML标记的单个节点。如果在{}内有多个HTML节点,则React将抛出错误。

实施例

<div>
 {
  <span>{1+2}</span>
  <span>{1+2}</span>
 }
</div> //will throw an error

<div>
 {
  <span>
   <span>{1+2}</span>
   <span>{1+2}</span>
  </span> 
 } 
</div> //correct

希望有所帮助!!

<强> [更新]

对于你的情况

{
 true //if true, this table will be rendered, else, null will be returned
  ? <table>
  <thead>
    ...
  </thead>
 </table>
 : null
}
<table> //this table will render all the time
 <tbody>
     ...
 </tbody>
</table>