Reactjs 在NextJS中实现本地相似/不相似功能并使其在客户端路由之间持久化
我有一个使用构建的博客前端应用程序,它看起来像这样: 这里的每张卡都是一个名为Reactjs 在NextJS中实现本地相似/不相似功能并使其在客户端路由之间持久化,reactjs,next.js,Reactjs,Next.js,我有一个使用构建的博客前端应用程序,它看起来像这样: 这里的每张卡都是一个名为postReview.jsx的功能组件。如您所见,每个组件都带有一个心形图标。默认情况下,此图标将保持灰色。然而,当点击时,它会变成红色,表示该帖子受到了欢迎。此操作仅在用户登录时发生。如果没有,单击心脏图标将显示登录模式 现在,我只关注如何在客户端导航之间保持“like”,即不与db/服务器进行任何交互 现在,单击图标,可以切换颜色。然而,当你离开的时候,比如说,点击一个帖子标题,然后点击后退按钮返回到这个页面,它
postReview.jsx
的功能组件。如您所见,每个组件都带有一个心形图标。默认情况下,此图标将保持灰色。然而,当点击时,它会变成红色,表示该帖子受到了欢迎。此操作仅在用户登录时发生。如果没有,单击心脏图标将显示登录模式
现在,我只关注如何在客户端导航之间保持“like”,即不与db/服务器进行任何交互
现在,单击图标,可以切换颜色。然而,当你离开的时候,比如说,点击一个帖子标题,然后点击后退按钮返回到这个页面,它就无法持久存在。实现此功能的推荐方法是什么
整个代码库可在我的回购协议中找到:
有关组件(postReview.jsx
)的代码位于:
该站点位于
我知道我可以使用Redux,但不知道如何防止每次重新渲染时重置值,即使在使用Redux时也是如此
更好地说明问题
访问博客页面;组件的多个实例(postReview
)首次呈现:
likedBy
prop对象接收post“likers”数组userInfo.userID
从Redux存储中检索登录的用户IDlikedBy.readers
数组查找userInfo.userID
读卡器
数组中,post是喜欢的,则将喜欢的
设置为错误
以将心形图标变为红色,并将post的ID
推到喜欢的post
redux存储区读卡器
数组中不存在用户ID,请将喜欢的
保留为继承
以将其保留为灰色,并从喜欢的帖子
redux存储中删除帖子的ID
liked
设置为error
可将心脏图标变为红色id
推到likedPosts
redux存储区liked
设置为inherit
可将心脏图标变为红色likedPosts
redux存储中删除帖子的id
back
按钮返回博客页面
此时,组件(postReview
)将重新呈现,并且redux存储将根据原始likedBy
prop对象重置。当然,这意味着自第一次渲染以来的所有更改都将消失。这就是我需要帮助的地方。您将如何处理这样一种情况,即像喜欢和不喜欢这样的用户交互必须在客户端导航中持久化,并在重新呈现中得到尊重?我看到两种方法:
1) 简单:通过使用本地存储,您可以编写类似的数组
likes: [likedPostId1, likedPostId2, ...]
然后在PostReview中检查当前卡id是否包含在数组中
let isLiked = likes.includes(currentPostId);
2) 右图:通过使用Redux,方法相同,但您将在Redux中存储likes数组并用于页面导航。
了解SPA中导航的工作原理对于简单的SPA实施至关重要:
4. If user ID exists in readers array, post is liked, set liked to error to turn the heart icon red and push post's id to the likedPosts redux store.
5. If user ID doesn't exist in readers array, leave liked to inherit to leave it gray and remove post's id from the likedPosts redux store.
你应该把它包起来。和#5。作为redux商店中的一个操作
const mapDispatchToProps = (dispatch) => {
return {
onUpdateLikedPosts: (data) => dispatch(actions.updateLikedPostsAction(data))
};
};
并且,在安装PostReview组件时执行该函数
const componentDidMount() {
this.props.onUpdateLikedPosts(data)
}
我看到的唯一问题是,每次组件重新渲染时,LocalStorage/Redux数据都会被重置。因此,组件第一次渲染时,它会接收likes数组(喜欢帖子的人的数组)作为道具。然后我将这个数组添加到LocalStorage或Redux存储中,以供将来参考。当我喜欢/不喜欢帖子时,存储的数组会更新。现在我导航到另一页。然后当我点击“后退”返回到上一个。页面中,PostReview组件重新呈现,初始赋值再次发生。这将撤消我上次在那里时可能进行的任何更新。@学习者,如果我希望在页面重新加载或页面刷新时保持持久性,我通常使用redux persist()。我的问题不在于页面刷新,因为在这种情况下,服务器调用将确保在浏览器中显示正确的数据。这里,我指的是没有中间服务器请求的客户端路由。