Skip to content

useEffect hook with empty dependency array called twice #111

Description

@paaatrick

First, wonderful library; thanks for your work on it.

If I have a component with a useEffect hook with an empty dependency array I would expect the callback function to be called once. However if the callback function calls a state updating function (i.e. one returned by useState or the dispatch function returned by useReducer) the callback is called twice. Here is an example:

import React, { useEffect, useState } from 'react';
import blessed from 'blessed';
import { render } from 'react-blessed';

const Test = () => {
  const [count, setCount] = useState(0);
  useEffect(() => {
    setCount(count => count + 1);
  }, []);
  return <element>{count}</element>;
};

const screen = blessed.screen({
  autoPadding: true,
  smartCSR: true,
  title: 'test'
});

screen.key(['escape', 'q', 'C-c'], () => {
  return process.exit(0);
});

render(
  <Test />,
  screen
);

I would expect the Test component to render 1, but instead it renders 2. The equivalent example using the react-dom renderer results in 1 being displayed (https://codesandbox.io/s/brave-grass-wik3s?file=/src/App.js).

This is the simplest example I could make to reproduce the problem. The context for this is I wanted to use useEffect to have a component make an HTTP request once on mount and store the results in state, but I kept seeing two HTTP requests being made.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions