Let's suppose I have two components i.e. "Parent" which contains two state variables and a child "Child" to which these two variables are passed.
export default function Parent() {
const [a, setA] = React.useState(1);
const [b, setB] = React.useState(2);
const inc = () => {
setA(a 1);
setB(b 1);
}
return (
<div>
<Child a={a} b={b} />
<button onClick={inc}>Inc</button>
</div>
);
}
export function Child({ a, b }) {
console.log(a, b);
const [inA, setInA] = React.useState(a || -1);
const [inB, setInB] = React.useState(b || -1);
return (
<div>
<div>{inA}</div>
<div>{inB}</div>
</div>
);
}
My understanding was that as soon as the props passed on to Child
are changed it will re-render and hence both inA
and inB
will get newer defaults but it does not happen. Why is that?
Relevant Stackblitz link.
CodePudding user response:
My understanding was that as soon as the props passed on to Child are changed it will re-render and hence both inA and inB will get newer defaults
Yes, it will re-render but inA
& inB
don't reinitialize with new props. Note that the first argument you pass to useState
is only used once for the first initialization of the state. After that, your useState will keep the current state across the re-renders and will update it when you call setInA
or setInB