如何在反应中从渲染函数返回一个空的jsx元素?

Posted

技术标签:

【中文标题】如何在反应中从渲染函数返回一个空的jsx元素?【英文标题】:How to return an empty jsx element from the render function in react? 【发布时间】:2018-01-01 11:58:28 【问题描述】:

我在react 中有一个代码,看起来像这样:

class UserManagement extends React.Component 
    constructor() 
        super();
        this.state = 
            users: undefined,
        ;
    

    componentWillMount() 
        // load the users state with a Promise
        setTimeout(() => 
          this.setState(users: []);
        , 800);
    

    render() 
        if ( this.state.users === undefined ) 
            // until the users state is updated, I want to return an empty element
            return null;
        

        // real site rendering
        return <div>We have users</div>;
    


ReactDOM.render(
  <UserManagement />,
  document.getElementById("root")
);
<div>Will be blank at first while we don't have users, then show "We have users" after 800ms when we have users</div>
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

我的问题是:如何在返回用户状态之前返回一个空元素?我尝试按照某些地方的建议返回(null),但浏览器会出现此错误:

未捕获的类型错误:无法读取 null 的属性“样式”

我知道返回 (&lt;div&gt;&lt;/div&gt;) 的选项,但我不确定这是否是这种情况下的最佳做法。

谢谢!

【问题讨论】:

@Rajesh 抛出与(null)相同的错误 React 文档say you should be able to return null,所以奇怪的是这不起作用。 返回null 工作正常。请使用 Stack Snippets([&lt;&gt;] 工具栏按钮)用 runnable minimal reproducible example 更新您的问题,展示这样做的问题。 Stack Snippets 支持 React,包括 JSX; here's how to do one. 我很抱歉。急忙发表评论。您是否在其他任何地方操作此组件的样式 @Rajesh:会是这样的,是的。 :-) 在他们更新之前,我们无法正确回答问题。 【参考方案1】:

以防万一有人想要另一种方法:

从 React v16.2 开始,您可以使用 Fragments 允许添加一个空的 JSX 标签,如下所示:

  return (
    <>
      <ChildA />
      <ChildB />
      <ChildC />
    </>
  );

从官方文档中提取的示例。

所以在你的情况下,返回一个没有任何孩子的 Fragment 是可行的。

  return <></>;

【讨论】:

【参考方案2】:

我认为只需在您的部分添加 null 而不是null 以显示空组件。

你试过了吗?

【讨论】:

【参考方案3】:

好的,Facebook says:

自从 React 发布以来,人们一直在使用变通方法来“渲染 什么都没有”。通常这意味着返回一个空的 or 。 有些人甚至变得聪明并开始返回以避免 无关的 DOM 节点。我们终于提供了一个“有福”的解决方案 允许开发人员编写有意义的代码。返回 null 是一个 向 React 明确指示您不希望呈现任何内容。 在幕后,我们使用一个元素来完成这项工作,虽然 将来我们希望不要在文档中添加任何内容。平均而言 时间,元素不会以任何方式影响布局,因此您可以 今天使用 null 感觉很安全!

【讨论】:

【参考方案4】:

您需要将其包装在React.Fragment 标记中。

<React.Fragment></React.Fragment>

【讨论】:

请考虑在您的答案中添加某种形式的解释或更详细的信息。通常不鼓励仅使用代码回答。【参考方案5】:

我认为您应该添加三元运算符,例如:

this.state.users? return null : return <div>We have user<\div>

【讨论】:

【参考方案6】:

使用反应片段>。它的优点之一是它不会在渲染的组件中创建额外的 Dom 节点(例如空的 div 标签)。

您可以使用三元条件使您的代码更具可读性。

    render() 
        ( this.state.users === undefined ) ?
            return <></>   
        : return <div>We have users</div>;
    

或者更简单的语法是

    render() 
        ( this.state.users) ?
            return <div>We have users</div>  
        : return <></>;
    

【讨论】:

以上是关于如何在反应中从渲染函数返回一个空的jsx元素?的主要内容,如果未能解决你的问题,请参考以下文章

在渲染函数中调用返回 JSX 元素的函数

如何在反应中从数组中映射出预加载的图像?

如何在反应中从对象映射动态设置 sessionStorage

如何渲染 JSX 元素数组(React 组件)

React jsx babel es6 webpack 如何在渲染中评论(返回(//||/**/))?

在 Helper 函数中渲染 JSX 元素数组