You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSX内联条件渲染能否省略闭合标签?需每3个方块插入指定div

问题

是否可以使用不带闭合标签的JSX内联条件渲染?需求为每3个方块插入<div className="board-row">。

提供的代码如下:

const gridSquares = squares.map((reference, square) => {
  return (
    <React.Fragment>
      {square % 3 == 0 && square % 3 !== squares.length && (
        <div className="board-row">
      )}
      <Square
        key={square}
        value={squares[square]}
        onSquareClick={() => handleClick(square)}
      />
    </React.Fragment>
  );
});

return (
  <div>
    <div className="status">{status}</div>
    {gridSquares}
  </div>
);

运行后出现语法错误:

./src/App.js
Syntax error: C:/Code/Tutorial/src/App.js: Expected corresponding JSX closing tag for <div> (57:4)

  55 |       <Square key={square} value={squares[square]} onSquareClick={() => handleClick(square)} />
  56 | 
> 57 |     </React.Fragment>
     |     ^
  58 |     
  59 |   });

解决方案

不行,JSX强制要求所有标签必须闭合,单独渲染开标签会破坏语法结构,导致编译器无法找到对应的闭合标签,直接抛出语法错误。

要实现每3个方块包裹在board-row容器里,正确思路是先将squares数组按3个元素一组拆分,再嵌套渲染分组后的内容:

方法一:循环拆分数组

// 拆分数组为每3个元素一组
const groupedSquares = [];
for (let i = 0; i < squares.length; i += 3) {
  groupedSquares.push(squares.slice(i, i + 3));
}

// 渲染分组内容
const gridSquares = groupedSquares.map((row, rowIndex) => (
  <div key={rowIndex} className="board-row">
    {row.map((value, squareIndex) => {
      const actualIndex = rowIndex * 3 + squareIndex;
      return (
        <Square
          key={actualIndex}
          value={value}
          onSquareClick={() => handleClick(actualIndex)}
        />
      );
    })}
  </div>
));

return (
  <div>
    <div className="status">{status}</div>
    {gridSquares}
  </div>
);

方法二:简洁数组方法拆分

// 用Array.from快速分组
const groupedSquares = Array.from({ length: Math.ceil(squares.length / 3) }, (_, i) =>
  squares.slice(i * 3, i * 3 + 3)
);

// 渲染分组内容
const gridSquares = groupedSquares.map((row, rowIdx) => (
  <div className="board-row" key={rowIdx}>
    {row.map((val, colIdx) => {
      const idx = rowIdx * 3 + colIdx;
      return <Square key={idx} value={val} onSquareClick={() => handleClick(idx)} />;
    })}
  </div>
));

return (
  <div>
    <div className="status">{status}</div>
    {gridSquares}
  </div>
);

这样既保证了JSX语法的正确性,又完美实现了每3个方块一组的布局需求。

内容的提问来源于stack exchange,提问作者coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:34:57