未启用Redux的组件中react-query为何查找dispatch且不发起请求?
我正在开发一个从服务器获取登录用户信息的组件,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

