Просто хотел добавить ответ, который постоянно работает с useState. Хитрость заключается в том, чтобы использовать постоянно меняющееся значение вместо логического и предпринимать действия при изменении значения:
function Parent() {
const [signal, setSignal] = useState()
const onClick = () => setSignal(Date.now()) // trigger the child to save
return (
<div>
<Child signal={signal} />
<button onClick={onClick}>Save</button>
</div>
}
}
function Child({signal}) {
// send the data whenever signal changes
useEffect(() => {
if (signal != null) {
sendData()
}
}, [signal])
return <div>...</div>
}