Представьте это действие:
export const myAction = createAsyncThunk(...)
Я отправляю действие в 2 разных компонента React, оба из которых нуждаются в этом действии для заполнения состояния, от которого они зависят:
useEffect(() => {
dispatch(myAction())
}, [dispatch])
Это, конечно, приводит к тому, что преобразователь запускает свой асинхронный код дважды.
Я хочу сделать что-то похожее на takeLeadingRedux Saga с этим преобразователем.
Есть ли способ заставить последующие отправки myAction()игнорироваться, пока работает первая?
Решение проблемы
Пользовательское решение для крючка:
import React, { useCallback, useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { myAction } from './actions';
const useMyActionNonConcurrently = () => {
const dispatch = useDispatch();
const isPerformingMyAction = useSelector(state => state.someSlice.isPerformingMyAction);
const performMyAction = useCallback(
() => {
if (!isPerformingMyAction) {
dispatch(myAction())
// this thunk needs to toggle state.someSlice.isPerformingMyAction while it's running
}
},
[dispatch, isPerformingMyAction]
);
return performMyAction;
};
// Usage in a component (on mount):
const performMyAction = useMyActionNonConcurrently();
useEffect(performMyAction, []);
Комментариев нет:
Отправить комментарий