【发布时间】:2018-09-09 07:47:06
【问题描述】:
学习了一点 React,但在我看来,React 本身存在条件渲染错误。
假设我有一个像这样的Foo 组件:
foo.js
import React, { Component } from 'react';
class Foo extends Component {
render() {
const isLoggedIn = this.props.isLoggedIn;
return(
<div>
{ isLoggedIn ? (
<div>one</div><div>two</div>
) : (
<div>one</div><div>two</div><div>three</div>
)}
</div>
);
}
}
export default Foo;
我是这样使用它的:
app.js
import React, { Component } from 'react';
import Foo from './components/foo';
class App extends Component {
render() {
return (
<div>
<Foo isLoggedIn={false} />
</div>
);
}
}
export default App;
这会产生错误:
Syntax error: Adjacent JSX elements must be wrapped in an enclosing tag
请注意上面的 Foo 组件,只返回一个父 div 而不是数组。如果它是一个数组,那么是的,我同意这个错误。
React 文档示例中给出的官方示例是这样的:
render() {
const isLoggedIn = this.state.isLoggedIn;
return (
<div>
{isLoggedIn ? (
<LogoutButton onClick={this.handleLogoutClick} />
) : (
<LoginButton onClick={this.handleLoginClick} />
)}
</div>
);
}
https://reactjs.org/docs/conditional-rendering.html
这对任何人来说都像是 React 中的错误吗?
更新
根据这里给出的答案和 cmets,React 的隐含行为是 render() 函数内部的三元运算符,在幕后带有它自己的 render 调用,就像一个虚拟组件,这意味着一个额外的层的<div> 需要包裹在我的子元素列表中。
Emberjs Foo 组件
我的困惑源于我过去做过一些 Emberjs 开发,并且像这样的组件按预期工作:
<h3>Foo component</h3>
{{#if isLoggedIn}}
<div>one</div><div>two</div>
{{else}}
<div>one</div><div>two</div><div>three</div>
{{/if}}
还是感谢大家的解释。
【问题讨论】:
-
我没有返回一个元素 Shubham 的列表,我返回的是一个包含子元素的单个父 div 节点,根据 React 的文档,这非常好。
-
我猜你正在返回多个元素,可能不是来自渲染,而是在这里的条件渲染
<div>one</div><div>two</div> -
我来自不同的背景,但我不知道 React 中的三元运算符被视为另一个“虚拟组件”,在后台有自己的渲染调用。
-
是的,它们被视为单独的 JSX 元素块。考虑到其他问题解决了您的问题,我将其标记为重复
标签: reactjs