You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未启用Redux的组件中react-query为何查找dispatch且不发起请求?

问题:React-Query组件未发起请求且出现Redux相关错误

我正在开发一个从服务器获取登录用户信息的组件,Swagger显示服务器代码返回正常,但加载组件后却未发起任何请求。同时遇到createAsyncThunk.ts第681行的错误:

if (!skipDispatch) {
  dispatch(finalAction)
}

此处skipDispatch为undefined,但该组件并未启用或加载Redux,且同一父组件下其他使用react-query的组件可正常运行。

组件代码如下:

import React, { useState, useEffect } from 'react';
import { Loading } from '../Elements/LoadingComponent';
import DynamicTable from '../Elements/DynamicTable';
import { fetchLoggedIn, logoutUser, fetchAllUsers } from '../../network/Attendance';
import { useQuery, useMutation } from 'react-query';

const LoggedInUsers = () => {
    const [visibleUsers, setVisible] = useState([]);
    const [origUsers, setOrigUsers] = useState([]);
    const [isAdmin, setIsAdmin] = useState(false);
    const [errMess, setErrMess] = useState(null);
    //const [API] = useState(`${process.env.REACT_APP_API}/API`);
    const [btnText, setBtnText] = useState("Show All Users");
    const { data: loggedInUsers, isLoading, isError, refetch } = useQuery('loggedInUsers', fetchLoggedIn, {
        refetchInterval: 30000, // Refetch every 30 seconds
        onSuccess: (newData) => {
            var d = JSON.parse(newData)
            setVisible(d.users);

            // Fetch all users here directly and update the state
            if (origUsers.lengh === 0) {
                fetchAllUsers().then(userData => {
                    setOrigUsers(userData);

                }).catch(error => {
                    // Handle error if needed
                });
            }
        }
    });

    const loadAll = () => {
        if (btnText === "Show All Users") {
            setVisible(origUsers)
            setBtnText("Show Logged In")
        }
        else {
            setVisible(loggedInUsers);
            setBtnText("Show All Users");
        }
    };

    const filterUsers = (target, filterKey) => {
        let txt = target.value.toLowerCase();
        if (txt.length > 0) {
            let filteredUsers = origUsers.filter((user) => user.UserName.toLowerCase().startsWith(txt));
            setVisible(filteredUsers);
        }
    };

    const handleLogout = async (rowJSON, button) => {
        await logoutUser(rowJSON.UserName.toLowerCase());

        const newVisible = visibleUsers.filter((user) => user.UserName.toLowerCase() !== rowJSON.UserName.toLowerCase());
        const updatedUsers = origUsers.filter((user) => user.UserName.toLowerCase() !== rowJSON.UserName.toLowerCase());
        setVisible(newVisible);
        setOrigUsers(updatedUsers);
    };

    const buildTableData = () => {
        return [
            {
                colName: "",
                visible: false,
                filterable: false
            },
            {
                colName: "cn",
                displayName: "User",
                filterable: true,
                editable: false,
                required: false,
                visible: true,
                type: "text",
                addable: false,
                defaultVal: null
            },
            {
                colName: "samaccountname",
                displayName: "Account Name",
                editable: false,
                filterable: true,
                required: false,
                visible: true,
                type: "text",
                addable: false,
                defaultVal: null
            },
            {
                colName: "homedirectory",
                displayName: "Home Directory",
                editable: false,
                required: false,
                visible: true,
                type: "text",
                addable: false,
                defaultVal: null
            },
            {
                colName: "lastlogon",
                displayName: "Logon Time",
                editable: false,
                required: false,
                visible: true,
                type: "date",
                addable: false,
                defaultVal: null
            },
            {
                colName: "logoff",
                displayName: "Logoff Time",
                editable: false,
                required: false,
                visible: true,
                type: "date",
                addable: false,
                defaultVal: null
            },
            {
                colName: "loggedOn",
                displayName: "Currently On",
                editable: false,
                required: false,
                visible: true,
                type: "text",
                addable: false,
                defaultVal: null
            },
            {
                colName: "path",
                displayName: "path",
                editable: false,
                required: false,
                visible: true,
                type: "text",
                addable: false,
                defaultVal: null
            }
        ];
    };

    let buttons = [{ onClick: logoutUser, text: "Log Out" }];

    if (isLoading) {
        return <Loading title="Logged In Users" />;
    } else if (errMess) {
        console.log(errMess);
    } else {
        return (
            <div>

                <div className="row">
                    <div className="col-md-6 col-md-offset-3 DataBox">
                        <button text={btnText} onClick={loadAll} />
                        <DynamicTable
                            data={visibleUsers}
                            columns={buildTableData()}
                            filterFn={filterUsers}
                            border="solid 1px black"
                            title="Logged In"
                            allowAddData={false}
                            CustomRowButtons={buttons}
                        />
                    </div>
                </div>
            </div>
        );
    }
};

export default LoggedInUsers;
解决方案
  • 排查网络请求函数的Redux混入:检查fetchLoggedIn、fetchAllUsers等网络请求函数,确认是否误用了Redux Toolkit的createAsyncThunkAPI。即使组件没直接用Redux,若请求函数依赖了Redux的异步工具,就会触发该错误。

  • 确认React-Query全局初始化:验证根组件是否用QueryClientProvider包裹了整个应用。若该组件所在的组件树分支未被正确包裹,useQuery无法正常初始化,会触发异常流程中的Redux相关错误。

  • 修复拼写错误:代码中origUsers.lengh是拼写错误,应改为origUsers.length。这个错误会导致fetchAllUsers永远不执行,同时可能引发状态异常,间接干扰React-Query的执行逻辑。

  • 修正按钮渲染方式:原生<button>组件没有text属性,应改为<button onClick={loadAll}>{btnText}</button>。错误的按钮渲染可能导致组件渲染异常,影响React-Query的生命周期。

  • 完善错误处理逻辑:补充useQuery的isError状态处理,在else if (isError)分支中捕获并处理请求错误,便于排查请求未发起的原因。

内容的提问来源于stack exchange,提问作者Geoff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:14:58