Мне нужна помощь от вас в моем случае в действии вызова редуктора и получения значения редуктора состояния. Новое значение редуктора состояния после действия вызова недоступно в useEffect.
Это моя функция действий:
export const checkItem = () => (dispatch, getState) => {
axios
.get(mainUrl+'/api/cekitem')
.then(res => {
dispatch({
type: ITEM_CHECK,
payload: res.data
})
})
.catch(err =>{
dispatch(returnErrors(err.response.data || 'Terjadi kesalahan', err.response.status || 404))
});
};
И это моя функция редуктора:
export default function(state = initialState, action) {
switch (action.type) {
case ITEM_CHECK:
return {
...state,
items: action.payload.data,
loading: false
};
default:
return state;
}
}
Я пытаюсь вызвать действие в моем файле app.js внутри useEffect.
export const TheItemModule = () => {
const classes = useStyles();
const [itemABC, setItemABC] = useState(false);
const dispatch = useDispatch();
const itemRedux = useSelector(state => state.dashboard.items)
useEffect(() => {
dispatch(checkItem);
if (itemRedux) {
// hope this is called after itemRedux trigered by checkItem
// or some method for manipulated item
// example:
setItems(true)
}
}, [checkItem]);
render() {
return (
{itemABC && <div>Cek ABC & 123</div>}
)
}
}
Примечание. Этот пример упрощен из моего реального случая. Я надеюсь, что этот пример понятен.
Когда checkItem вызывается в useEffect, itemRedux в useEffect больше не срабатывает, поэтому состояние itemABC не обновляется. Может быть, кто-то может помочь мне дать представление. Большое спасибо.
Действие отправки является асинхронным, поэтому селектор не имеет значения при запуске этого кода. Я думаю, вы могли бы создать новый useEffect
, чтобы слушать изменения itemRedux
, например:
export const TheItemModule = () => {
const classes = useStyles();
const [itemABC, setItemABC] = useState(false);
const dispatch = useDispatch();
const itemRedux = useSelector(state => state.dashboard.items)
useEffect(() => {
dispatch(checkItem);
}, [checkItem]);
useEffect(() => {
if (itemRedux) {
// hope this is called after itemRedux trigered by checkItem
// or some method for manipulated item
// example:
setItems(true)
}
}, [itemRedux])
render() {
return (
{itemABC && <div>Cek ABC & 123</div>}
)
}
}
о, так решение простое. useEffect можно вызывать более одного раза. Спасибо, что сэкономили мое время.