如何为 JSXTransformer 正确包装几个 TD 标签?

IT技术 reactjs react-jsx
2021-03-25 00:17:06

我有一个包含项目的数组,我想做这样的事情:

<tr>
(until have items in array
<td></td><td></td>)
</tr>

但是如果我这样做,我会收到一个 JSXTransformer 错误:

相邻的 XJS 元素必须包含在封闭标签中

工作版本:

{rows.map(function (rowElement){
    return (<tr key={trKey++}>
        <td className='info' key={td1stKey++}>{rowElement.row[0].value}</td><td key={td2ndKey++}>{rowElement.row[0].count}</td>
        <td className='info' key={td1stKey++}>{rowElement.row[1].value}</td><td key={td2ndKey++}>{rowElement.row[1].count}</td>
        <td className='info' key={td1stKey++}>{rowElement.row[2].value}</td><td key={td2ndKey++}>{rowElement.row[2].count}</td>
        <td className='info' key={td1stKey++}>{rowElement.row[3].value}</td><td key={td2ndKey++}>{rowElement.row[3].count}</td>
        <td className='info' key={td1stKey++}>{rowElement.row[4].value}</td><td key={td2ndKey++}>{rowElement.row[4].count}</td>
                 .......
        </tr>);
})}

我试过这个。但是使用<div>封闭标签它不能正常工作。

在这里回答: 未捕获的错误:不变违规:findComponentRoot(..., ...$110):无法找到元素。这可能意味着 DOM 意外发生了变异

<tbody>
    {rows.map(function (rowElement){
        return (<tr key={trKey++}>
        {rowElement.row.map(function(ball){
            console.log('trKey:'+trKey+' td1stKey'+td1stKey+' ball.value:'+ball.value+' td2ndKey:'+td2ndKey+' ball.count:'+ball.count);
            return(<div key={divKey++}>
                <td className='info' key={td1stKey++}>{ball.value}</td><td key={td2ndKey++}>{ball.count}</td>
            </div>);
        })}
        </tr>);
    })}
</tbody>

请告诉我如何正确包装几个 TD 标签! 我尝试使用指南Dynamic Children,但 JSXTransformer 不允许我这样做。

4个回答

当您返回多个没有包装元素的元素时,通常会出现以下错误

相邻的 XJS 元素必须包含在封闭标签中

喜欢

return (
    <li></li>
    <li></li>
);

这不起作用,因为您有效地返回了两个结果,您只需要返回一个 DOM 节点(有或没有子节点),例如

return (
    <ul>
        <li></li>
        <li></li>
    </ul>
);

// or 

return (<ul>
    {items.map(function (item) {
        return [<li></li>, <li></li>];
    })}
</ul>);

为了让我正确回答您的问题,您能否提供一个 JSFiddle?我试图猜测你想要做什么,这里有一个JSFiddle的工作原理

当使用 div 作为包装器时,它实际上从未渲染到 DOM(不知道为什么)。

<tr data-reactid=".0.0.$1">
    <td class="info" data-reactid=".0.0.$1.$0.0">1</td>
    <td data-reactid=".0.0.$1.$0.1">2</td>
    <td class="info" data-reactid=".0.0.$1.$1.0">1</td>
    <td data-reactid=".0.0.$1.$1.1">2</td>
    <td class="info" data-reactid=".0.0.$1.$2.0">1</td>
    <td data-reactid=".0.0.$1.$2.1">2</td>
    <td class="info" data-reactid=".0.0.$1.$3.0">1</td>
    <td data-reactid=".0.0.$1.$3.1">2</td>
</tr>

编辑:react 16+

从 React 16 开始,您现在可以使用片段。

你现在会这样做

return <>
    <li></li>
    <li></li>
<>;

或者您可以使用<React.Fragment>,<>是 HTML 片段的简写,它基本上只是一个充当容器的临时父元素,一旦它附加到文档中就不再存在。

https://reactjs.org/docs/fragments.html

https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment

"返回 [<li></li>, <li></li>];" 不起作用:从渲染返回它给了我错误“必须返回有效的 ReactComponent。您返回了未定义、数组或其他无效对象。”
2021-05-24 00:17:06
我知道这个错误是什么意思。当您更改数据时,<div>标签将不会按您预期的那样工作。为什么?在上面的链接中回答。我正在寻找其他可以正常工作的封闭标签。
2021-05-30 00:17:06
您当前无法从渲染返回多个元素。它们必须放在单个容器元素中。- github.com/facebook/react/issues/2127github.com/facebook/react/issues/3415
2021-05-30 00:17:06
@CurtisYallop 你的权利,我应该说示例是为了与 map 方法一起使用。基本上你可以有嵌套的元素数组。
2021-06-01 00:17:06
这应该被标记为正确答案。当前标记为正确的答案根本没有帮助我。
2021-06-01 00:17:06

因此,您有几对<td>要从 a 返回元素.map最简单的方法是将它们包装在一个数组中。

<tr>
  {data.map(function(x, i){
    return [
      <td>{x[0]}</td>,
      <td>{x[1]}</td>
    ];
  })}
</tr>

不要忘记第一个后面的逗号</td>

随着 React 16 的发布,有一个名为 Fragment 的新组件如果想要返回元素/组件的集合而不必将它们包装在封闭元素中,您可以使用Fragment类似这样的方法:

import { Component, Fragment } from 'react';

class Foo extends Component {

  render() {
    return (
      <Fragment>
        <div>Hello</div
        <div>Stack</div>
        <div>Overflow</div>
      </Fragment>
    );
  }
}

这是你将如何做到的

<tbody>
    {this.props.rows.map((row, i) =>
      <tr key={i}>
        {row.map((col, j) =>
          <td key={j}>{col}</td>
        )}
      </tr>
    )}
</tbody>