【问题标题】:How to correctly wrap few TD tags for JSXTransformer?如何正确包装 JSXTransformer 的几个 TD 标签?
【发布时间】:2014-09-21 23:41:17
【问题描述】:

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

<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>);
})}

我试过这个。但是使用 &lt;div&gt; 封闭标签它不能正常工作。

在这里回答: Uncaught Error: Invariant Violation: findComponentRoot(..., ...$110): Unable to find element. This probably means the DOM was unexpectedly mutated

<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 不允许我这样做。

【问题讨论】:

  • 在我的情况下,我有一个根元素,我正在返回但仍然收到此错误。正在使用 javascript cmets 来评论代码。 JSX 对 cme​​ts 有不同的语法。即使我认为该代码已被注释,但事实并非如此。 // /**/ 在 JavaScript 中工作。在 JSX 中,您使用 {/**/}{//}。这些将适用于任何类之外的代码,带有类函数和普通函数。在课堂上没有其他任何地方。这是无处写的。 eslint 抛出神秘错误 - Adjacent XJS elements must be wrapped in an enclosing tagwesbos.com/react-jsx-comments

标签: reactjs react-jsx


【解决方案1】:

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

相邻的 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>
<>;

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

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

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

【讨论】:

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

    随着 React 16 的发布,there is a new component called Fragment。 如果想要返回元素/组件的集合而不必将它们包装在封闭元素中,您可以使用Fragment,如下所示:

    import { Component, Fragment } from 'react';
    
    class Foo extends Component {
    
      render() {
        return (
          <Fragment>
            <div>Hello</div
            <div>Stack</div>
            <div>Overflow</div>
          </Fragment>
        );
      }
    }
    

    【讨论】:

      【解决方案3】:

      你会怎么做

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

      【讨论】:

        【解决方案4】:

        所以你有一对&lt;td&gt; 元素,你想从.map 返回。最简单的方法是将它们包装在一个数组中。

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

        不要忘记第一个 &lt;/td&gt; 后面的逗号。

        【讨论】:

          猜你喜欢
          相关资源
          最近更新 更多
          热门标签