У меня есть этот хук, который вызывает действие redux при монтировании. Так что я предполагаю, что это нужно выполнить один раз. Но это не так.
useCategories.js
const useCategories = () => {
/*
Hook to call redux methods that will fetch the categories
of the exercises. Store it in redux store.
RETURN: loading, error, data
*/
const mainCategories = useSelector(state => state.categories.specialities);
const loading = useSelector(state => state.categories.loading);
const error = useSelector(state => state.categories.error);
const dispatch = useDispatch();
const onInitExercises = useCallback(
() => dispatch(actions.fetchCategories()),
[dispatch]
);
useEffect(() => {
console.log("[useCategories] --> UseEffect");
onInitExercises();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [onInitExercises]);
const data = { specialities: [] };
if (mainCategories) {
console.log("Inside If mainCategories");
for (let key in mainCategories) {
data["specialities"].push(mainCategories[key]);
}
}
console.log("[useCategories] --> Before Return");
return [loading, error, data];
};
export default useCategories;
И теперь я использую его в другом компоненте
Боковая панель
import React, { useState, useEffect, useRef } from "react";
import useCategories from "../hookFetchCategories/useCategories";
const SideBarFilters = props => {
const [orderForm, setOrderForm] = useState({})
// Hook to fetch categories from DB
const [loading, error, categoriesData] = useCategories();
// Function to update form after categories are fetched
const updateSpecialitiesData = useRef((formElementKey, data) => {
console.log("Inside Update");
// code to update orderForm with data fetched in useCategories()
setOrderForm(orderFormUpdated);
});
useEffect(() => {
if (!loading && categoriesData && categoriesData["specialities"].length) {
console.log("Inside IF");
updateSpecialitiesData("specialities", categoriesData["specialities"]);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [loading, updateSpecialitiesData]);
// --- Rest of the component
}
Когда я запускаю приложение, в консоли DEV у меня есть журналы консоли
[useCategories] --> Before Return
useCategories.js:23 [useCategories] --> UseEffect
useCategories.js:53 [useCategories] --> Before Return
useCategories.js:53 [useCategories] --> Before Return
useCategories.js:42 Inside if mainCategories
useCategories.js:53 [useCategories] --> Before Return
SideBarFilters.js:61 Inside IF
SideBarFilters.js:36 Inside Update
useCategories.js:42 Inside if mainCategories
useCategories.js:53 [useCategories] --> Before Return
1) Я не понимаю, почему перехватчик useCategories не выполняется только один раз?
Это то, что я понимаю в отношении того, как должен вести себя useEffect в useCategories.
2) Если я добавлю в SideBar.js, в ловушку useEffect, зависимость «CategoriesData», начнется бесконечный цикл.