I was reading the react docs, there's this example which I think was really bizzare: challenge_2 MyInput.js
import { useEffect, useRef } from 'react';
export default function MyInput({ shouldFocus, value, onChange }) {
const ref = useRef(null);
// TODO: call focus() only if shouldFocus is true.
useEffect(() => {
ref.current.focus();
}, []);
return (
<input
ref={ref}
value={value}
onChange={onChange}
/>
);
}
App.js
import { useState } from 'react';
import MyInput from './MyInput.js';
export default function Form() {
const [show, setShow] = useState(false);
const [firstName, setFirstName] = useState('Taylor');
const [lastName, setLastName] = useState('Swift');
const [upper, setUpper] = useState(false);
const name = firstName + ' ' + lastName;
return (
<>
<button onClick={() => setShow(s => !s)}>{show ? 'Hide' : 'Show'} form</button>
<br />
<hr />
{show && (
<>
<label>
Enter your first name:
<MyInput
value={firstName}
onChange={e => setFirstName(e.target.value)}
shouldFocus={true}
/>
</label>
<label>
Enter your last name:
<MyInput
value={lastName}
onChange={e => setLastName(e.target.value)}
shouldFocus={false}
/>
</label>
<p>Hello, <b>{upper ? name.toUpperCase() : name}</b></p>
</>
)}
</>
);
}
In this challenge, the <MyInput> was called twice in App.js, to render 2 input doms, which was refed in the implementation of <MyInput>.
The thing is, when running this code, only the last input will be focused, I thought refs were independent between components, so I was expecting both inputs will be focused. Could someone please explain why this happen?