首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Redux的PouchDB CRUD模式

使用Redux的PouchDB CRUD模式
EN

Stack Overflow用户
提问于 2018-11-03 11:49:21
回答 1查看 848关注 0票数 2

我在React中编写了一个电子应用程序,它使用本地PouchDB与远程CouchDB同步。我使用Redux进行状态管理,并希望了解CRUD的最佳实践是什么?

我有一个要求(这就是为什么我不确定要使用的最佳模式)是,当其他人远程更改某些东西时,应用程序需要更新。

考虑到这一点,到目前为止,我已经尝试了两种模式。

  1. 听一听带有变化DB.changes(),它将在每次更改时获取所有数据(使用中间程序节流,但可以使用redux-saga)。这种方法在用户交互和加载到app中的新数据之间产生了明显的长时间翻转,因为用户将进行更新,然后显示“更新成功”消息,并最终显示“数据更新”消息。当然,在这些点上都会分派操作,这会影响UI的呈现并增加不良的用户体验。DB.changes()方法可以返回我在此方法中未指定的已更改文档。 DBChanges =DBChanges.changes(自:'now',live: true,include_docs: false }).on(' change ',change => { // handle change fetchAllDocs().then(setAllDocsInApplication) };
  2. 变化DB.changes(),包括修改后的文档。这些更改可以是远程的,也可以来自应用程序中的用户交互。在每次更改时,查看返回的文档并根据更改应用程序状态。这使得整个循环时间更短,但这感觉很糟糕,因为我正在对获取的数据进行变异。 DBChanges =DBChanges.changes(自:'now',live: true,include_docs: true }).on(' change ',change => { //句柄更改if(change.deleted) handleRemove(change.doc) if(change..doc._rev.split("-") === "1") handleNewDoc(change.doc) handleUpdateDoc(change.doc) };

所以,我想知道的是,使用实时更新的CRUD的最佳模式是什么?

EN

回答 1

Stack Overflow用户

发布于 2018-11-06 16:27:04

我认为答案可以归结为:

您需要从零开始为每个更改构建整个应用程序状态吗?还是可以确定从传入的更改中需要的操作类型?

当用户与应用程序交互时,请考虑您的数据流。您可能会在这个应用程序中这样写:

代码语言:javascript
运行
复制
allDocs → derive initial AppState → render in React

那么,如果用户创建了一个新项,您会发生什么呢?

代码语言:javascript
运行
复制
putDoc → allDocs → derive entire AppState → render in React

还是你:

代码语言:javascript
运行
复制
putDoc → trigger Redux action that modifies AppState → render in React

如果使用后者(我假设是这样的),则更改处理程序的外观基本相同。有传入的更改,问题是:您能从传入的更改中确定所需的Redux操作吗?这一变化给了你:

  • 文档类型(希望您可以将其作为属性)
  • 它是否被删除了?

因此,当您的处理程序中出现更改时,您应该这样做:

代码语言:javascript
运行
复制
changeHandler → trigger Redux action that modifies AppState → render in React

这是备选方案2。

备选方案1如下所示:

代码语言:javascript
运行
复制
changeHandler → allDocs → derive initial AppState → render in React

选项1有一个很大的缺点:如果您的应用程序离线几周,而远程DB得到了许多更改(例如,因为电子应用程序运行在另一台计算机上),则返回联机将导致下载大量更改,而每一项更改都将触发您的fetchAllDocs()调用。

但这感觉很糟糕,因为我正在对获取的数据进行变异。

为什么?您不会修改获取的数据(我假设您指的是初始的allDocs)。最初的allDocs只帮助派生了AppState,您正在使用Redux并做出反应。您可能不会将allDocs中的内容用作您的AppState,对吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53131017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档