Multiple calls to state updater from useState in component causes multiple re-renders Multiple calls to state updater from useState in component causes multiple re-renders reactjs reactjs

Multiple calls to state updater from useState in component causes multiple re-renders


You could combine the loading state and data state into one state object and then you could do one setState call and there will only be one render.

Note: Unlike the setState in class components, the setState returned from useState doesn't merge objects with existing state, it replaces the object entirely. If you want to do a merge, you would need to read the previous state and merge it with the new values yourself. Refer to the docs.

I wouldn't worry too much about calling renders excessively until you have determined you have a performance problem. Rendering (in the React context) and committing the virtual DOM updates to the real DOM are different matters. The rendering here is referring to generating virtual DOMs, and not about updating the browser DOM. React may batch the setState calls and update the browser DOM with the final new state.

const {useState, useEffect} = React;function App() {  const [userRequest, setUserRequest] = useState({    loading: false,    user: null,  });  useEffect(() => {    // Note that this replaces the entire object and deletes user key!    setUserRequest({ loading: true });    fetch('https://randomuser.me/api/')      .then(results => results.json())      .then(data => {        setUserRequest({          loading: false,          user: data.results[0],        });      });  }, []);  const { loading, user } = userRequest;  return (    <div>      {loading && 'Loading...'}      {user && user.name.first}    </div>  );}ReactDOM.render(<App />, document.querySelector('#app'));
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script><script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script><div id="app"></div>