是否有推荐的 Vue JS 应用程序 API 和 Vuex 设计模式

Posted

技术标签:

【中文标题】是否有推荐的 Vue JS 应用程序 API 和 Vuex 设计模式【英文标题】:Is there a recommened VueJS application API and Vuex design pattern 【发布时间】:2021-07-01 23:00:51 【问题描述】:

我和我的团队正致力于中大型应用的起步阶段。这是一个 Vue 2 客户端呈现的应用程序,带有 asp.net 核心后端。客户端将用于管理数以万计的商品及其状态。该应用程序处于早期阶段,我们一直在考虑可以重新构建现有客户端商店的方法。

由于我们都是新手,而且我们都是自学成才的,我们并不确定在 Vue 应用程序中数据管理的最佳模式是什么。

在 VueJS 应用程序中是否有推荐的数据管理模式?

我们目前的模式是这样的:

        |                  |                                                                      
        |   +-----------+  |                                                                      
        |   |           |  |  +-----------+     +-----------+     +------------+                  
        |   |    API    |---->|           |     |           |     |            |                  
        |   |           |  |  | Router    |---->|  Vuex     |---->| Views/     |                  
        |   +-----------+  |  |           |     |           |<----| Components |                  
        |    ^ |     ^     |  |           |     |           |     |            |                  
        |    | |     |     |  +-----------+     +-----------+     +------------+                  
        |    | |     |     |Vue                        |                                          
        |    | |     |     +---------------------------|-------------------------                 
        |    | |     |                                 |                                          
        |Client|     -----------------------------------                                          
        +----|-|---------------------------------------------                                     
             | |                                                                                  
   +---------|-|------                                                                            
   |Backend  | v                                                                                  
   | +----------+                                                                                 
   | |          |                                                                                 
     | DB       |                                                                                 
     |          |                                                                                 
     |          |                                                                                 
     +----------+                                                                                          

我们有一个包含所有 API 端点的 API 控制器。加载应用程序时,在路由器的 beforeEnter 函数中,我们获取所有数据,然后将其提交到 Vuex 存储。然后当用户使用应用程序(添加/删除/编辑)项目时,存储被修改,然后 Vuex 调用 API 控制器并将数据发送到后端。

根据研究,我们对谁应该调用 API 以及 Vuex 应该存储哪些类型的数据提出了一些意见。一些博客和课程说 Vuex 是管理 API 的方式,但受人尊敬的 Vue 社区成员之间的论坛讨论却另有说法。然而,主要问题是 Vue 从 2018/19 年开始快速、不断变化的环境文章和讨论并不真正适用于今天的 Vue。

我们目前的想法不是从路由器提交到 Vuex,而是将数据从路由器传递到视图,然后将视图提交到存储。视图/组件也会调用帖子而不是 Vuex。这将限制商店的责任。

我们还研究了使用 Nuxt.js 的可能性,但他们的文档没有提供关于商店/API 管理的严格指导。

【问题讨论】:

【参考方案1】:

TL;DR:一般来说,在构建大型 Vue.js 应用程序(或 SPA 应用程序)时,您需要混合多种东西。

没有固定的推荐模式可以做到这一点。正确答案总是 - 视情况而定

以下是一些有帮助的指南:

图层

一般来说,有两种方式——横向分层和纵向分层。通过水平分层,系统被划分为像这样的层

App Level Component
  <-- Multiple Views (pages)
        <-- Business Logic Components
           <-- Re-usable lower order components
           and API (Fetch/XHR/Websockets)

通常,业务逻辑组件是一次性使用的 API 层模块。这些基本上是一堆包含各种 API 调用并对其响应进行规范化的模块。

这看起来很干净,但很快就会因为组件太多而变得笨拙,因为所有东西都在平面文件夹中。

除了 API 层,通常其他层(按业务行为)垂直拆分为模块,所有相关组件和帮助代码都保存在该模块或相关子模块中。例如,在电子商务软件中 - 分为帐户、订单、付款、目录等。

但是,只有当您真正拥有大型应用程序时,垂直分层才有用,否则,简单的水平分层就足够了。

应用状态

这就是事情变得棘手的地方。随着应用程序的发展,这是一个持续的过程。这里要练习的是什么构成了全局状态本地状态。想象一个带有铃铛图标的应用程序来指示未读消息,并且同一页面在底部某处有一个读取消息的方式(如 Facebook/LinkedIn),其中必须同步和维护状态。

这是全局状态的一个例子,因此它可以在一些***共同祖先甚至更好的外部数据存储中维护,例如 ReduxVuex。两者都一样好。 只有这样的全局和共享状态通常应该建模到显式状态存储中。另一个例子是登录用户的详细信息,可以重新使用

将某些状态列出到存储中的另一个标准是,当您需要时间旅行(撤消和重做)功能或想要为绘图应用、游戏等应用保持本地持久性时。

路由和状态管理

与全局状态一起,路由是应用程序的另一个***关注点。首先总是全局存储,因为路由决策(守卫、预取等)可能会使用存储中的全局数据。因此,您将始终先初始化存储,然后在需要时将其与路由器一起使用。

API 层

将所有 API 代码放在一起,因为它可以快速帮助识别重复项(如果有)。 API 层应尽可能转储,主要处理数据规范化、解析、解码、调整驼峰/蛇形大小写等。API 层不应直接从路由器或全局状态存储访问信息。如果它需要任何东西,它应该由调用者传递给它。

但是,如果您同时使用 GraphQL 和订阅,情况会有所不同。在这种情况下,它会更加了解上下文,因此应该这样设计。

组件设计

明确区分高阶和低阶组件。低阶组件是可重用的,如 Button、Calendar、DatePicker、Dropdown 等。它们不应该了解应用程序及其业务逻辑。就像您拥有可以在任何 Vue.js 应用程序中使用的迷你组件库。

高阶组件是应用程序的主要魔法发生的地方。这些组件将从多个来源(如 router/vuex/api 等)获取数据。这些组件又不是平面的,通常分为自己的层。

应该只允许最顶层的组件访问路由器,并且应该为其子组件提供数据。授权将完全分散在组件层次结构中。


有几个链接可以进一步帮助您:

What is the best Vue-Router practice for very large web applications?

Contemporary Front-end Architectures

【讨论】:

【参考方案2】:

我认为来自vuex website 的this 图像很好地解释了vuex 的每个元素的关注。操作调用 API,然后是一个突变以提交接收到的响应以更新应用程序的状态。 Vue 组件通过 getter 读取状态。当一个动作提交状态更新时,getter 会更新它们的值,并且您的组件会呈现更新的数据。如果您的 vue 组件需要 API 中的一些数据进行渲染,您可以从导航守卫中调度一个或多个操作,例如 beforeEnterbeforeRouteEnter 以加载或更新应用程序状态

【讨论】:

以上是关于是否有推荐的 Vue JS 应用程序 API 和 Vuex 设计模式的主要内容,如果未能解决你的问题,请参考以下文章

iView —— 基于 Vue.js 的 UI 组件库|软件推荐

推荐25+个优秀的Vue.js框架

Vue.js 快速入门

vue中Axios的封装和API接口的管理

最新文章推荐:使用 Vue.js 和 Bluemix 创建模块化的单页应用程序

HighChart.js 数据源推荐