我最近开始将东西从jQ迁移到一个更 struct 化的框架VueJS,我喜欢它!

从概念上讲,Vuex对我来说是一种范式转变,但我相信我现在知道这一切,并且完全明白了!但也存在一些小的灰色地带,主要是从实施的Angular 来看.

我觉得这个设计很好,但不知道它是否与Vuex cycle的单向数据流相矛盾.

基本上,从一个动作中返回一个promise(-like)对象是否被认为是良好的实践?我将它们视为异步包装器,具有失败状态等,因此似乎很适合回报promise .相反,变异子只是改变了事物,是存储/模块中的纯 struct .

推荐答案

Vuex中的actions是异步的.让调用函数(操作的发起方)知道操作已完成的唯一方法是返回一个promise ,然后解决它.

下面是一个例子:myAction返回Promise,进行http调用,然后解析或拒绝Promise,所有这些都是异步的

actions: {
    myAction(context, data) {
        return new Promise((resolve, reject) => {
            // Do something here... lets say, a http call using vue-resource
            this.$http("/api/something").then(response => {
                // http success, call the mutator and change something in state
                resolve(response);  // Let the calling function know that http is done. You may send some data back
            }, error => {
                // http failed, let the calling function know that action did not work out
                reject(error);
            })
        })
    }
}

现在,当Vue组件启动myAction时,它将获得这个Promise对象,并且可以知道它是否成功.以下是Vue组件的一些示例代码:

export default {
    mounted: function() {
        // This component just got created. Lets fetch some data here using an action
        this.$store.dispatch("myAction").then(response => {
            console.log("Got some data, now lets show something in this component")
        }, error => {
            console.error("Got nothing from server. Prompt user to check internet connection and try again")
        })
    }
}

正如你在上面看到的,actions返回Promise是非常有益的.否则,动作发起人就无法知道发生了什么,以及什么时候事情足够稳定,可以在用户界面上显示一些东西.

最后一点是关于mutators的——正如你正确指出的,它们是同步的.它们在state中改变内容,通常从actions开始调用.无需将Promisesmutators混合,因为actions处理该部分.

Edit: My views on the Vuex cycle of uni-directional data flow:

如果访问组件中的数据(如this.$store.state["your data key"]),则数据流是单向的.

行动的promise 只是让组件知道行动已经完成.

组件可以从上述示例中的promise resolve函数中获取数据(不是单向的,因此不推荐),也可以直接从$store.state["your data key"]中获取数据,$store.state["your data key"]是单向的,遵循vuex数据生命周期.

以上段落假设,一旦http调用在您的操作中完成,mutator使用Vue.set(state, "your data key", http_data).

Vue.js相关问答推荐

Nuxt.js i18n不提供默认区域设置中的页面而不重定向

如何只提取一次用于无线电组过滤的数据,而不是针对数据库中的每个条目提取数据?

Vuetify 3 改变 Select 的 colored颜色

组合 API | Vue 路由参数没有被监视

超出最大调用堆栈大小 - Vue路由

如何在vue中获取特定类别的产品列表

手动触发对观察到的对象/数组的更新

使用上传组件而不触发 POST 请求

Vue3在'vue-router'中找不到导出'createWebHistory,createRouter'

在 SPA VueJS 中全局声明 mapState 和 mapMutations

如何在 vue 3 脚本设置中使用

单击复选框后,V-model 未更新

VueRouter 未定义

样式化 Vue 插槽

重新加载页面正在 vue 组件中的插槽上闪烁内容

try 通过 Vue.js 中的渲染传递props并观察它们

如何通过 Axios 发送文件到 Laravel

$set 不是函数

Vuetify - 如何进行分页?

使用 CloudFront 部署在 S3 上的 VueJS 应用程序的指定的密钥不存在