Вы должны сделать следующее.
- Создать контекст для предоставления информации о родительской инициализации дочерним компонентам.
const ParentInitializeContext = React.createContext(false);
Создайте логическую переменную состояния
isInitialized
в родительском компоненте и установите для нее значение
true
, когда родительский компонент будет инициализирован.Вы также должны предоставить
isInitialized
для контекста:
function App(props) {
const [isInitialized, setIsInitialized] = useState(false);
useEffect(() => {
//here you retreive a crucial piece of data and then call setIsInitialized(true);
}, []);
return (
<ParentInitializeContext.Provider value={isInitialized}>
{props.children}
</ParentInitializeContext.Provider>
);
}
Создать собственный хук для вызова функций при инициализации родительского компонента:
function useEffectWhenParentInitialized(fn, inputs = []) {
const isParentInitialized = useContext(ParentInitializeContext);
useEffect(() => {
if (isParentInitialized) {
fn();
}
}, [...inputs, isParentInitialized]);
}
Измените
useEffect
перехватывать дочерние компоненты на
useEffectWhenParentInitialized
.
Полный пример можно посмотреть здесь: https://codesandbox.io/s/5volk3o2ol