我在React中编写了一个电子应用程序,它使用本地PouchDB与远程CouchDB同步。我使用Redux进行状态管理,并希望了解CRUD的最佳实践是什么?
我有一个要求(这就是为什么我不确定要使用的最佳模式)是,当其他人远程更改某些东西时,应用程序需要更新。
考虑到这一点,到目前为止,我已经尝试了两种模式。
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) };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的最佳模式是什么?
发布于 2018-11-06 16:27:04
我认为答案可以归结为:
您需要从零开始为每个更改构建整个应用程序状态吗?还是可以确定从传入的更改中需要的操作类型?
当用户与应用程序交互时,请考虑您的数据流。您可能会在这个应用程序中这样写:
allDocs → derive initial AppState → render in React那么,如果用户创建了一个新项,您会发生什么呢?
putDoc → allDocs → derive entire AppState → render in React还是你:
putDoc → trigger Redux action that modifies AppState → render in React如果使用后者(我假设是这样的),则更改处理程序的外观基本相同。有传入的更改,问题是:您能从传入的更改中确定所需的Redux操作吗?这一变化给了你:
因此,当您的处理程序中出现更改时,您应该这样做:
changeHandler → trigger Redux action that modifies AppState → render in React这是备选方案2。
备选方案1如下所示:
changeHandler → allDocs → derive initial AppState → render in React选项1有一个很大的缺点:如果您的应用程序离线几周,而远程DB得到了许多更改(例如,因为电子应用程序运行在另一台计算机上),则返回联机将导致下载大量更改,而每一项更改都将触发您的fetchAllDocs()调用。
但这感觉很糟糕,因为我正在对获取的数据进行变异。
为什么?您不会修改获取的数据(我假设您指的是初始的allDocs)。最初的allDocs只帮助派生了AppState,您正在使用Redux并做出反应。您可能不会将allDocs中的内容用作您的AppState,对吗?
https://stackoverflow.com/questions/53131017
复制相似问题