在 JSX 中返回多个元素
Posted
技术标签:
【中文标题】在 JSX 中返回多个元素【英文标题】:Returning multiple elements in JSX 【发布时间】:2018-11-06 23:51:35 【问题描述】:如果用户未登录,我会尝试返回两个链接。像这样:
<Nav>
if(this.state.user)
<NavItem onClick=this.logout>Log out</NavItem>
else
<NavItem onClick=this.login>Log in</NavItem>
<NavItem onClick=this.register>Register</NavItem>
</Nav>
我知道我可以用三元运算符做到这一点:
<Nav>
this.state.user ?
<NavItem onClick=this.logout>Log out</NavItem>
:
<NavItem onClick=this.login>Log in</NavItem>
</Nav>
问题是我想渲染两个 NavItem。我看到我可以用一个函数来做到这一点,但是当我尝试在这样的函数中做到这一点时:
myFunction()
return(
<NavItem onClick=this.login>Zaloguj się</NavItem>
<NavItem onClick=this.login>Zaloguj się</NavItem>
)
它告诉我第二个元素无法访问并中断。那么我怎样才能返回两个元素呢?字符串化代码没有帮助
【问题讨论】:
jsx 需要一个包装元素或一个数组。因此,请尝试将它们放入数组...[React.Fragment
【参考方案1】:
如果您使用的是 React v16.2.0 及更高版本,则可以使用更短的 Fragments 版本
<>
<NavItem onClick=this.login>Zaloguj się</NavItem>
<NavItem onClick=this.login>Zaloguj się</NavItem>
</>
如果你使用低于 React v16 的版本,你只能在 jsx
中返回一个元素,所以你必须将你的元素包装在一个中:
<div>
<NavItem onClick=this.login>Zaloguj się</NavItem>
<NavItem onClick=this.login>Zaloguj się</NavItem>
</div>
如果你使用 React v16 和 abose,你可以使用 Fragments
import React, Fragment from 'react';
...
...
<Fragment>
<NavItem onClick=this.login>Zaloguj się</NavItem>
<NavItem onClick=this.login>Zaloguj się</NavItem>
<Fragment/>
您还可以返回元素数组as announced here:
return [
<NavItem key="1" onClick=this.login>Zaloguj się</NavItem>,
<NavItem key="2" onClick=this.login>Zaloguj się</NavItem>
];
根据您的环境,您可能无法使用所有这些解决方案:support for fragments
【讨论】:
请提及<React.Fragment>
,我会选择最好的,因为这个答案包含了大多数方法
只想指出返回元素数组需要键! (正如您共享的链接中所述)
@Tanckom key
属性在示例中。你说的是这个吗?
@KevinAmiranoff 我知道,但只是想指出它,否则它不会起作用(我花了 10 分钟才弄明白)【参考方案2】:
您可以在 ReactJS 中使用 Fragment,它在 React 16 中可用。
它可以让您对子列表进行分组,而无需添加额外的节点 DOM。
您可以像下面这样导入片段,
import React, Fragment from 'react';
To render:
<Fragment>
<ChildA />
<ChildB />
<ChildC />
</Fragment>
通过使用 Fragment,可以避免渲染 div 等额外的 html 元素。
更多信息,您可以参考https://reactjs.org/docs/fragments.html
【讨论】:
【参考方案3】:您需要将其包裹在某些东西上,例如 <div>
或 <React.Fragment>
(v16):
<React.Fragment>
<NavItem onClick=this.login>Log in</NavItem>
<NavItem onClick=this.register>Register</NavItem>
</React.Fragment>
您必须使用三元运算符而不是 if
语句来直接渲染 JSX 中的元素。
【讨论】:
【参考方案4】:在最新的 react 版本中,您可以将它们包装在一个空片段中:
<>
<NavItem onClick=this.login>Zaloguj się</NavItem>
<NavItem onClick=this.login>Zaloguj się</NavItem>
</>
【讨论】:
以上是关于在 JSX 中返回多个元素的主要内容,如果未能解决你的问题,请参考以下文章
映射元素中的 JSX 映射元素,相邻的 JSX 元素必须包含在封闭标记中
JSX 元素类型错误:将类型添加到从 .map 函数返回的对象
在 React 中,如何将 JSX 与返回更多 JSX 的 JS 函数一起返回?