【发布时间】:2021-06-21 15:52:08
【问题描述】:
我的代码:看起来像
//GLOBAL STATE INITIALIZATION
const page = useSelector((state) => state.users.meta.page);
const perPage = useSelector((state) => state.users.meta.perPage);
const order = useSelector((state) => state.users.meta.order);
const dir = useSelector((state) => state.users.meta.dir);
const search = useSelector((state) => state.users.meta.search);
// FUNCTIONS
const fetchData = useCallback(
(
pageNumber = page,
pageSize = perPage,
columnOrder = order,
colDir = dir,
query = search
) => {
dispatch(
listUser(pageNumber, pageSize, columnOrder, colDir, searchColArr, query)
);
},
[searchColArr, dispatch]
);
//throwing warning above for missing dependencies
useEffect(() => {
dispatch(resetState(function () {}));
fetchData();
}, [dispatch, fetchData]);
在这里,如果我添加缺少的依赖项并将[searchColArr, dispatch] 替换为[page, perPage, order, dir, searchColArr, search, dispatch],那么程序将在无限循环上运行。因为,它会在 listUser 操作上调度
dispatch(
userActions.USER_LIST_SUCCESS({
list: data.data,
meta: data.meta,
})
);
而这个USER_LIST_SUCCESS 会将redux 状态更新为:
USER_LIST_SUCCESS: (state, action) => {
state.list = action.payload.list;
state.meta = action.payload.meta;
state.isLoading = false;
},
一旦这个元状态被更新,page, perPage, order, dir, search 也将被更新,如果我将它们添加为依赖项,它会再次 fetchData 并在获取数据时更新元状态并以这种方式形成无限循环。
这种情况的最佳解决方案是什么?还是eslint-disable-line react-hooks/exhaustive-deps 是唯一的选择?
更新: 列表用户
import user from "../../services/userService";
export const listUser =
(page, perPage, order, dir, searchCol, search) => async (dispatch) => {
try {
dispatch(
userActions.SET_IS_LOADING({
isLoading: true,
})
);
const { data } = await user.listUser(
page,
perPage,
order,
dir,
searchCol,
search
);
dispatch(
userActions.USER_LIST_SUCCESS({
list: data.data,
meta: data.meta,
})
);
} catch (error) {
toastify.error(error.response.data.message);
dispatch(
userActions.USER_LIST_FAIL({
errors:
error.response && error.response.data.errors
? error.response.data.errors
: error.response.data,
})
);
}
};
user.listUser
export async function listUser(
page,
perPage,
order,
dir,
searchColArr,
search
) {
let searchCol = JSON.stringify(searchColArr);
return httpClient.get(apiEndpoint, {
params: {
page,
perPage,
order,
dir,
searchCol,
search,
},
});
}
更新2
const handlePageChange = (pageNumber) => {
fetchData(pageNumber);
};
const handlePageLengthChange = (pageSize) => {
fetchData(null, pageSize);
};
const handleSort = (newOrder, newDir) => {
fetchData(null, null, newOrder, newDir);
};
【问题讨论】:
-
你能详细说明一下
listUser函数吗 -
我已经更新了,请你看看告诉我。
-
任何帮助.......
标签: reactjs