25

I have a code in react that looks something like this:

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>

My question is: How to return an empty element until the users state is returned? I tried to return (null) as suggested in some places, but the browser raise this error:

Uncaught TypeError: Cannot read property 'style' of null

I am aware of the option to return (<div></div>), but I am not sure that this is the best practice in this case.

Thnaks!

8
  • @Rajesh throws the same error as (null) Commented Jul 26, 2017 at 9:07
  • 1
    The React docs say you should be able to return null, so it's strange this isn't working. Commented Jul 26, 2017 at 9:08
  • 2
    Returning null works just fine. Please update your question with a runnable minimal reproducible example using Stack Snippets (the [<>] toolbar button) demonstrating the problem with doing that. Stack Snippets support React, including JSX; here's how to do one. Commented Jul 26, 2017 at 9:08
  • My apologies. Rushed to comment. Are you manipulating the style of this component anywhere else Commented Jul 26, 2017 at 9:09
  • 1
    @Rajesh: It'll be something along those lines, yeah. :-) Until they update, we can't answer the question properly. Commented Jul 26, 2017 at 9:11

7 Answers 7

34

Just in case anyone want another approach:

Since React v16.2 you can use Fragments allowing to add an empty JSX tag like this:

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

Example extracted from official docs.

So in your case, returning a Fragment without any childs, works.

  return <></>;
Sign up to request clarification or add additional context in comments.

3 Comments

Know how I can add an attribute to the empty tag? i.e., add a key if it's in a loop ?
To add a prop (attribute) to a Fragment just use the "long version" of it: <React.Fragment key="...">...<React.Fragment>
Returning an empty fragment will return the following linter error github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/…. Use return null; instead stackoverflow.com/a/42083262/201648
11

I think just add { null } not null, in your section to show empty component.

Have you tried it already ?

Comments

10

You need to wrap it in a React.Fragment tag.

<React.Fragment></React.Fragment>

1 Comment

Please consider adding some form of explanation or more detail to your answer. Code only answers are typically discouraged.
7

Ok so as Facebook says :

Since React's release, people have been using work arounds to "render nothing". Usually this means returning an empty or . Some people even got clever and started returning to avoid extraneous DOM nodes. We finally provided a "blessed" solution that allows developers to write meaningful code. Returning null is an explicit indication to React that you do not want anything rendered. Behind the scenes we make this work with a element, though in the future we hope to not put anything in the document. In the mean time, elements do not affect layout in any way, so you can feel safe using null today!

Comments

1

use the react Fragment <></>. One of its advantages is that it does not create additional Dom nodes into rendered component (such as an empty div tag).

You can use ternary condition to make your code more readable.

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

or oven simpler syntax would be

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

3 Comments

This won't work. return is a statement, whereas the ternary operator wants an expression. You should return the whole ternary expression and remove the returns from the inside
you should try it . Please check conditionnal rendering in react official page reactjs.org/docs/conditional-rendering.html. Just instead of "if else" , I used ternary condition
The difference is that if and else take statements whereas the ternary takes an expression
0

I think you should add ternary operators like:

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

1 Comment

This approach won't work. The return keyword is a statement, while the ternary operator expects an expression To fix this, you need to return the entire ternary expression directly and remove the return keywords from inside it. return this.state.users ? null : <div>We have user</div>; @zach rightly commented the same in the previous answer.
0

One thing I did using React.useState was to initialize an empty JSX.Element object like so

const [jsxObject, setJsxObject] = React.useState(<></>);

Then, in whatever function you want to return a JSX.Element

setJsxObject(<h1>whatever inside</h1>);

Render it in the component

{jsxObject}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.