-
Notifications
You must be signed in to change notification settings - Fork 49.9k
Description
It seems that the default value in functional React component gets updated after render.
React version: 17.0.1
Steps To Reproduce
I created a question on StackOverflow: https://stackoverflow.com/questions/66286856/why-default-value-in-functional-react-component-gets-updated-after-render, but also repeat it here:
const MyComponent = () => {
// Initialise data with a random value:
const [data, setData] = React.useState(
() => {
const data = _.sampleSize(_.range(5), 3)
// Print data on initialisation:
console.log('init data in default:', data)
return data
}
)
React.useEffect(() => {
// Print data after the component is rendered:
console.log('init data after render:', data)
})
return (
<div>{data}</div>
);
};
The output in console is:
[Log] init data in default: – [0, 3, 1] (3)
[Log] init data after render: – [2, 1, 3] (3)
My understanding is that before the component is rendered, the function under useState is called. The value returned by the function is assigned to data, and the data values is used to render the component on the screen. The function under useState is called only once and we never call setData, so the value should be the same. Maybe I miss something?
Link to code example:
https://codesandbox.io/s/jovial-glade-9jm75?file=/src/App.js
The current behavior
The output in console before and after render is different.
The expected behavior
The output in console before and after render should be the same.