当多个 React DOM 组件在没有外部 div 的情况下使用时,JSX 将无法编译

Posted

技术标签:

【中文标题】当多个 React DOM 组件在没有外部 div 的情况下使用时,JSX 将无法编译【英文标题】:when multiple React DOM components are used without outer div then JSX won't compile 【发布时间】:2014-04-12 09:13:34 【问题描述】:

考虑这个无法编译的例子:

/** @jsx React.DOM */

var Hello = React.createClass(
  render: function() 
    return <div>Hello</div>;
  
);

var World = React.createClass(
  render: function() 
    return <div>World</div>;
  
);

var Main = React.createClass(
  render: function() 
    return (
        <Hello />
        <World /> 
    );
  
);

React.renderComponent(<Main />, document.body);

但这些组合中的任何一种都有效:

<div>
 <Hello />
 <World />
</div>

 <Hello />
 //<World />

 //<Hello />
 <World />

想知道多个组件是否应该始终被 div 标签包围。

【问题讨论】:

【参考方案1】:

我认为渲染函数应该只返回一个组件。

来自文档:http://facebook.github.io/react/docs/component-specs.html

render() 方法是必需的。

调用时,它应该检查 this.props 和 this.state 并返回单个子组件

【讨论】:

是的,这是正确的。正如您所指出的,您几乎总是可以将结果包装在 &lt;div&gt; 标记中。 (在未来的某个时候,我们希望摆脱这种限制。) 它的 2016 年,未来的时间还没有到来 2019 年了,时间还没到。【参考方案2】:

有一个简单的方法可以解决这个限制:

var Hello = React.createClass(
  render: function() 
    return <div>Hello</div>;
  
);

var World = React.createClass(
  render: function() 
    return <div>World</div>;
  
);

var HelloWorld = [Hello, World];

var Main = React.createClass(
  render: function() 
    return (
        HelloWorld
    );
  
);

React.renderComponent(<Main />, document.body);

【讨论】:

我收到了A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object. 这曾经在早期版本的 React 中工作。显然,您将无法使用最新版本解决此限制。 :(【参考方案3】:

React 组件只能渲染单个根节点。如果你想 返回多个节点,它们必须包装在一个根中。

在官方 React 网站上指定:React Docs

【讨论】:

以上是关于当多个 React DOM 组件在没有外部 div 的情况下使用时,JSX 将无法编译的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-router-dom,如何从 React 组件外部访问浏览器历史对象?

React - 从子 DOM 元素获取 React 组件?

render()--组件--纯函数

React系列文章:无状态组件生成真实DOM结点

使用JavaScript从组件外部遍历本地DOM

React组件安装使用和生命周期函数