RTK查询:你能安全地变异useQuery数据吗



我正在与RTK Toolkit集成,在教程中他们给出了这个例子:

export const PostsList = () => {
const {
data: posts = [],
isLoading,
isSuccess,
isError,
error
} = useGetPostsQuery()
const sortedPosts = useMemo(() => {
const sortedPosts = posts.slice()
// Sort posts in descending chronological order
sortedPosts.sort((a, b) => b.date.localeCompare(a.date))
return sortedPosts
}, [posts])

他们用解释

我们不能直接调用posts.sort(),因为Array.sort()会对现有数组进行变异,所以我们需要先复制它。

我的问题是它有多准确?改变data是否真的会改变缓存中的值,从而影响对useGetPostsQuery的其他调用?还是只是建议根据最佳实践进行复制?

编辑:我发布这个问题有点太早了。我只是尝试直接反转它,结果得到一个错误:Uncaught TypeError: 0 is read-only。如果有人知道它是如何运作的,我仍然想了解幕后发生了什么。

它就像从Redux存储中获得的每个值一样,是对存储中值的直接引用。因此,如果你能对数组进行排序,它也会对存储进行排序,但Redux无法注意到这种突变,因此你的UI不会立即在其他地方更新,随着时间的推移,你会遇到奇怪的不一致。

也就是说,正如您所注意到的,RTK使用immerimmer自动冻结减速器之外的值,因此您不会意外地对它们进行变异。

最新更新