2

在下面的示例中,我尝试使用 React 和 Redux Toolkit 创建一个简单的登录/身份验证组件。

const Login = () => {
    const dispatch = useDispatch();
    const [login, { isLoading }] = useLoginMutation();
    const [loginData, setLoginData] = useState({
        email: '',
        password: '',
    });

    const loginHandler = async () => {
        try {
            const result = await login({
                email: loginData.email,
                password: loginData.password,
            }).unwrap();

            const { token, userId } = result;

            const { data } = await dispatch(
                backendApi.endpoints.getUser.initiate({ token, userId })
            );

            dispatch(
                setCredentials({
                    user: {
                        email: data.user.email,
                        id: data.user.id,
                        name: data.user.name,
                        type: data.user.type,
                    },
                    token,
                })
            );
        } catch (err) {
            console.log(err);
        }
    };

    return (
        <Space>
            {isLoading ? (
                <SpinnerIcon />
            ) : (
                // setLoginData and loginHandler are set and used here
                // Standard React code: Input onChange -> setLoginData / Submit button onClick -> loginHandler
                // (nothing special, code shortened for the sake of readability)
                <FormWithEmailPasswordInputsAndButton />
            )}
        </Space>
    );
};

这工作正常,问题是:

我想利用查询结果对象isLoading上的属性,getUser以便在<SpinnerIcon />完成两个请求之前,组件都是可见的。

实际上,该spinnerIcon组件仅在loginAPI 调用期间显示,因为我没有使用 React Hooks 来调用getUser查询,因此我没有该组件的其余部分可用的isLoading属性。getUser

但是,如果我想使用 React Hooks 进行调用,我需要login事先获得突变的结果。

const [getUser, { isLoading: isUserLoading }] = useGetUserQuery(resultFromLoginMutation);

我不知道该怎么做。一个接一个,这样我就可以利用这两个isLoading属性。

4

1 回答 1

3

您可以使用skipTokenskip选项:


const [login, { isLoading, data: resultFromLoginMutation, isSuccess }] = useLoginMutation();
const [getUser, { isLoading: isUserLoading }] = useGetUserQuery(resultFromLoginMutation, { skip: !isSuccess });

或者

const [login, { isLoading, data: resultFromLoginMutation }] = useLoginMutation();
const [getUser, { isLoading: isUserLoading }] = useGetUserQuery(resultFromLoginMutation ?? skipToken);
于 2021-06-24T21:44:30.017 回答