【发布时间】:2022-12-22 07:59:52
【问题描述】:
因此,我最近开始使用 useRecoilStateLoadable 通过反冲来使用我的 API 端点,它工作得很好,但我遇到的一个问题是在我的数据表上,我希望它在用户选择例如第 2 页或搜索某些内容时执行另一个 API 调用,目前这是我的原子和选择器的样子:
const entriesPerPage : EntriesPerPage = {defaultValue: 10};
export const filterScorecard = atom<ScorecardSearchRequest>({
key: 'filterScorecard',
default: {
Draw: 2,
PageNumber: 1,
PageSize: entriesPerPage.defaultValue!,
SortColumnNames: [],
SortDirections: [],
SearchValue: '',
ConsolidationValues: null,
IsGroupDataManagement: false,
OnlySearchLockedScorecards: null,
ScorecardEndDate: null,
ScorecardTypes: ["43"],
Usernames: null,
}
})
export const allScorecardSelector = selector<ScorecardLicense>({
key: 'allScorecardSelector',
get: async ({get}) => {
const filterScorecardData = get(filterScorecard);
console.log(filterScorecard)
try{
const scorecardSearchResult = await BEEScorecardService.getUserScorecards(filterScorecardData);
return scorecardSearchResult.data;
}catch (error){
console.error(error);
return defaultObject;
}
}
})
export const allScorecardAtom = atom<ScorecardLicense>({
key: 'allScorecardAtom',
default: allScorecardSelector
})
我创建了 filterScorecard 方法来在状态更改时重新触发我的 API,在我的组件中,在 useEffect 中我的代码如下所示:
const [entriesPerPage, setEntriesPerPage] = useState<EntriesPerPage>({ defaultValue: 10 });
const [pageNumber, setPageNumber] = useState<number>(1);
const [searchValue, setSearchValue] = useState<string>('');
const [sortColumnNames, setSortColumnNames] = useState<string[]>([]);
const [sortDirections, setSortDirections] = useState<SortDirections[]>([]);
useEffect(() => {
setFilterScorecard(prevState => ({
...prevState,
pageNumber,
entriesPerPage,
searchValue,
sortColumnNames,
sortDirections
}))
}, [entriesPerPage, pageNumber, searchValue, sortColumnNames, sortDirections]);
但我注意到的是,每次我离开并返回时,API 都会在不应该被触发时被触发,如果我删除使用效果并导航离开并返回,则 API 不会加载并且它显示正确数据,但我无法搜索或转到下一页,因为当然不再调用 filterScorecard 方法。我想弄清楚我需要做什么,以便在状态没有任何变化的情况下不执行 API 调用。
更新
我已经创建了一个代码沙盒来向您展示问题,如果您单击“about”,它会触发 API,但如果您单击“home”,然后再次单击“about”,它仍然会触发 API 请求,这不应该是因为状态没有任何变化。仅当我单击下一页时,它才真正再次调用 API
【问题讨论】:
-
我没有理解你所说的“什么都没有改变时更新状态”的意思。第二个 sn-p 中的
useEffecthook 有什么特别之处?什么是setFilterScorecard?它看起来就像一个useStateupdater 函数的名字。useEffect钩子是否被调用更多的比你想象的要多?您指的是什么 API 调用?您能否编辑帖子以包含您正在使用的所有相关代码并在使用时遇到问题?见minimal reproducible example。 -
你是什么意思“每次你离开并回来”?你能给个例子吗?
-
@DrewReese 我已经在代码沙箱中添加了我遇到的问题
-
@g0rb 我添加了一个问题的代码沙箱
-
从我看到的useRecoilStateLoadable 的代码和文档来看,代码似乎符合我的预期。导航到
"/about"和About组件安装并运行效果。向后导航,About卸载,再次导航至"/about" andAbout` 挂载并运行效果。单击下一步按钮时我看到相同的行为,效果运行。不可否认,虽然我不熟悉后坐力。你是说应该缓存一些东西,比如getAllSelectorfetch的 GET 请求响应值?
标签: reactjs react-hooks recoiljs