I am learning react-redux
.
I got the following problem:
- I make two async api calls (with
redux-thunk
):
- the first one to fetch country names (in one object, ex:
{countries: [{...}, ...]}
.
- Those country names I use afterwards to make a second api call, to get all the soccer leagues, that are in those countrys (sometimes, there are none, so I get a
null
). In this case, the call is made with each countryName separatly. I make out of the results an array. - This arrays length is 255m out of which I filter out the
null
values and map the leagues names. - After I click on a League's name, a page is rendered (
{Link} from "react-router-dom";
). NOW my problem occurs - When I click, to get back to my home page (
<Link to={"/"} >
), bothuseEffect()
are making an api call again. Why?
Here is the code for my useEffect()
:
const dispatch = useDispatch();
const selectAllCountries = useSelector(state => state.allCountries);
const selectAllLeagues = useSelector(state => state.allLeagues);
useEffect(() => {
dispatch(allCountries());
}, [dispatch]);
useEffect(() => {
if(!_.isEmpty(selectAllCountries.data)) {
selectAllCountries.data.countries.map(el => dispatch(allLeagues(el.name_en)));
}
}, [dispatch, selectAllCountries.data]);
I tried to make a custom hook and put the useEffect()
in there:
const useCountries = getCountries => {useEffect(() => {
dispatch(getCountries());
},[getCountries])}
useCountries(allCountries);
as suggested here: React hooks: dispatch action from useEffect
But it didnt help.
Will be greatful for any help.
ANSWER:
in "./actions/.../allLeagues.js
...
import _ from "lodash";
export const allLeagues = (country) => async (dispatch, getState) => {
if (!_.isEmpty(getState().allLeagues) && !_.isEmpty(getState().allLeagues.data)) {
return Promise.resolve();
} else {
try {
...
}
}
}
Question, that was also helpfull:
Fetching data from store if exists or call API otherwise in React
(take look at answer about getStore()
)