使用react +钩子,我如何在异步redux调度后正确地调用/使用“navigate()”?

vnzz0bqm  于 2022-11-12  发布在  React
关注(0)|答案(1)|浏览(125)

当在**“dispatch(saveItem(item))"上使用“await”**时,它不应该有任何效果,
同时,如果我不使用“await”,两个函数将同时运行,结果是保存的项目,而不是组件重新渲染。
尽管redux存储中的状态发生了变化,但视图并没有发生变化,使用await时,实际上是等待分派完成,然后运行导航。
我的主要问题是如何在redux派遣后正确导航?

import { useEffect, useRef, useState } from 'react';
import { useDispatch } from 'react-redux';
import { useNavigate, useParams } from 'react-router-dom';
import { useForm } from '../hooks/useForm';
import { getById } from '../services/itemService';
import { saveItem } from '../store/actions/itemActions';

export function ItemEdit() {
    const dispatch = useDispatch();
    const navigate = useNavigate();
    const [item, handleChange, setItem] = useForm(null);
    const itemId = useParams().id;

    useEffect(async () => {
        await loadItem();
    }, []);

    const loadItem = async () => {
        try {
            const item = await getById(itemId)
            setItem(item);
        } catch(err) {
            setErrMsg(err.name + ': ' + err.message);
        }
    };

    const onSaveItem = async (ev) => {
        ev.preventDefault();
        await dispatch(saveItem(item));
        navigate('/item')
    }

    return (
        <form onSubmit={onSaveItem}>
            <button>Save</button>
        </form>
    );
}
8ulbf1ek

8ulbf1ek1#

您可以尝试以下方法:

dispatch(saveItem(item))
   .unwrap()
   .then(() => navigate('/item'))
   .catch(error => 'handle error')

对我有用。

相关问题