I have set of inputs that needs to be filled out completely. I should disable the submit button when its not complete. Its working fine until I decided to erase and fill it out again. It never disables. What would be the proper and correct way to do this? Is there a better way to do this?
<div className="App">
<InputCode
length={6}
label="Code Label"
loading={loading}
onComplete={(code) => {
setCodes(code);
setLoading(true);
setTimeout(() => setLoading(false), 10000);
}}
/>
<br />
<button disabled={codes?.length < 6 || !codes}>Submit</button>
</div>
Advertisement
Answer
To do that, you would instead get disabled state from your child:
- Adding a new state to your parent component:
const [disabled, setDisabled] = useState(true);
- Pass it down to your child component:
<InputCode
length={6}
label="Code Label"
loading={loading}
onComplete={(code) => {
setLoading(true);
setTimeout(() => setLoading(false), 10000);
}}
setDisabled={setDisabled}
/>
- Set the status of your button base on that state:
<button disabled={disabled}>Submit</button>
- Import setDisabled ot your child component and add useEffect like this:
useEffect(() => {
if (code.some((num) => num === "")) {
setDisabled(true);
} else {
setDisabled(false);
}
}, [code, setDisabled]);