React-在减速器中缓存数据



摘要

更新减速器内的缓存是否好?我的意思是,可以在我的前端的每个部分(组件、屏幕、钩子、助手…)更新缓存吗?还是应该将这种行为委托给系统的特定部分?

引言

在我的应用程序中,每个用户都有一个字段"totalFollowers";。

我将每个用户的数据存储在React Context的状态中。为了根据以前的状态执行复杂而纯粹的更新,我使用了一个reducer。

此外,我实现了内存中的LRU缓存,只是为了避免不必要的DB请求并提高用户体验/性能。在这个缓存中,我存储了一些数据,这些数据也包含在我谈到的React Context中。。。因此,双方的数据必须相等。

当当前用户跟随某个特定用户时,我正在更新该用户的totalFollowers字段,在我的reducer中,我有以下内容:

export default (otherUsers, action) => {   
switch (action.type) {
case "follow-user": {
const { userId, isFollowing } = action;
const prevUserData = otherUsers.get(userId);
return new Map([
...otherUsers,
[
userId,
{
...prevUserData,
totalFollowers: prevUserData.totalFollowers + (isFollowing ? 1 : -1)
]
]
);
}
...
}
}

问题

正如我之前所说的。。。我的缓存有一些数据,这些数据也包括在上下文中(使用了我描述的reducer);totalFollowers";是其中一个数据。

如果我的reducer允许我以本机/原子方式访问状态,我认为更新它内部的缓存是个好主意。但是,我读到减速器的唯一目的是更新状态。。。我担心,因为我更新减速器内缓存的想法可能是一种反模式(避免纯功能内的副作用)

你觉得怎么样?是";正确的";在减速器内执行缓存更新?

import { usersCache } from "../../services/firebase/api/users"
export default (otherUsers, action) => {   
switch (action.type) {
case "follow-user": {
const { userId, isFollowing } = action;
const prevUserData = otherUsers.get(userId);
const newTotalFollowers = prevUserData.totalFollowers + (isFollowing ? 1 : -1);
usersCache.updateUser(userId, { totalFollowers: newTotalFollowers }); // merge update
return new Map([
...otherUsers,
[
userId,
{
...prevUserData,
totalFollowers: newTotalFollowers
]
]
);
}
...
}
}

Cache和reducer是两种不同的东西。

减速器

只有当你想构建一个迷你状态机时,你才会选择使用reducer。但即使这样做也有其自身的问题,通常对状态的任何属性的每次更新都应该触发更新。因此,reducer与否主要取决于您正在构建的逻辑是否真的在一组相关属性中压缩(或扭曲)。

缓存

我觉得你比我更了解缓存,所以我跳过这部分。您使用缓存来确保在满足相同条件的情况下可以快速返回内容,还需要确保您至少有两个以上的条件。否则就是浪费。

上下文

你也提到了上下文,但上下文也不同。它确保你可以分享价值。但棘手的是,每当上下文值因状态变化而发生变化时,它都会呈现其下的所有子项

两美分

通常情况下,您会认为缓存是reducer(或上下文)的一个很好的补充。然而,这里的好处是缓存,例如,它可以节省跳过计算的时间。

但不要在渲染上下赌注。即使从内存中提取,连接到reductor或上下文的值仍然会更改!这意味着您仍然可以使用缓存进行100%的重新渲染。

我想说的是,缓存是一个与React无关的概念。如果你应用它,你只会得到它自己的好处,但不会期望其他好处。

相关内容

  • 没有找到相关文章

最新更新