采取一个简单的组件:
function MyComponent({ children }) {
return children;
}
这有效:
ReactDOM.render(<MyComponent><span>Hello</span></MyComponent>, document.getElementById('stage'));
但这没有(我删除了<span/>
):
ReactDOM.render(<MyComponent>Hello</MyComponent>, document.getElementById('stage'));
因为React试图在字符串上调用render
:
Uncaught TypeError: inst.render is not a function
另一方面,这很好用:
ReactDOM.render(<p>Hello</p>, document.getElementById('stage'));
如何使<MyComponent/>
表现得像<p/>
?
答案 0 :(得分:3)
如果您使用的是React 16.2或更高版本,则可以使用React片段执行此操作:
const MyComponent = ({children}) => <>{children}</>
如果您的编辑器不支持片段语法,这也可以工作:
const MyComponent = ({children}) =>
<React.Fragment>{children}</React.Fragment>
请记住,您仍在创作&amp;就React而言,返回一个组件(MyComponent类型) - 它只是不创建一个额外的DOM标记。这是一个混合包:
上升:您仍会在React调试工具中看到<MyComponent>
标记。
缺点:如果您正在使用Typescript或Flow,您的转换器可能会抱怨,因为MyComponent的返回类型仍然是React元素(React.ReactElement)。
答案 1 :(得分:2)
差异是<p>
是一个html元素,而MyComponent
是一个React组件。
React组件需要呈现/返回 单个组件或单个html元素。
'Hello'
既不是。
答案 2 :(得分:1)
您至少需要一个顶级HTML元素。你的组件实际上不能只输出一个字符串,这不是React的工作方式。
最简单的解决方案是简单地让你的MyComponent
以span或div包装它的输出。
function MyComponent({ children }) {
return <span>{ children }</span>;
}
答案 3 :(得分:1)
目前,在组件的渲染中,您只能返回一个节点;如果 你有一个要返回的div列表,你必须包装你的组件 在div,span或任何其他组件中。
您返回的内容不是根节点。您正在返回一个react组件,它返回一个字符串,它应该返回一个HTML元素。
您可以传递已经包含HTML元素的字符串(就像您在示例中所做的那样),也可以将字符串包装在&#34; MyComponent&#34;中的HTML元素中。像这样
function MyComponent({ children }) {
return <span>{ children }</span>;
}
答案 4 :(得分:0)
React可以呈现React组件(类)或HTML标签(字符串)。任何HTML标记按惯例都是小写的,其中Component是大写的。每个React组件都必须只呈现一个Tag(或null)。回答你的问题:你做不到。
在上面的示例中,您将使用children
属性呈现给定的内容,这将在内部呈现标记或无效的字符串。