摘要:每一条被记录,都需要捕捉到前一状态和后一状态的快照。然而,在上面的例子中中的异步函数中的回调让这不可能完成因为当触发的时候,回调函数还没有被调用,不知道什么时候回调函数实际上被调用实质上任何在回调函数中进行的状态的改变都是不可追踪的。
上一篇 vuex其实超简单,只需3步
简单介绍了vuex的3步入门,不过为了初学者容易消化,我削减了很多内容,这一节,就是把少掉的内容补上,
如果你没看过上篇,请戳链接过去先看一下再回来,否则,你会觉得本文摸不着头脑.
纯属个人经验,难免有不正确的地方,如有发现,欢迎指正!一、 Getter还是一样,本文针对初学者.
我们先回忆一下上一篇的代码
computed:{ getName(){ return this.$store.state.name } }
这里假设现在逻辑有变,我们最终期望得到的数据(getName),是基于 this.$store.state.name
上经过复杂计算得来的,刚好这个getName要在好多个地方使用,那么我们就得复制好几份.
vuex 给我们提供了 getter,请看代码 (文件位置 /src/store/index.js)
import Vue from "vue" import Vuex from "vuex" Vue.use(Vuex) export default new Vuex.Store({ // 类似 vue 的 data state: { name: "oldName" }, // 类似 vue 的 computed -----------------以下5行为新增 getters:{ getReverseName: state => { return state.name.split("").reverse().join("") } }, // 类似 vue 里的 mothods(同步方法) mutations: { updateName (state) { state.name = "newName" } } })
然后我们可以这样用 文件位置 /src/main.js
computed:{ getName(){ return this.$store.getters.getReverseName } }
事实上, getter 不止单单起到封装的作用,它还跟vue的computed属性一样,会缓存结果数据,
只有当依赖改变的时候,才要重新计算.
细心的你,一定发现我之前代码里 mutations 头上的注释了 类似 vue 里的 mothods(同步方法)
为什么要在 methods 后面备注是同步方法呢? mutation只能是同步的函数,只能是同步的函数,只能是同步的函数!!
请看vuex的解释:
现在想象,我们正在 debug 一个 app 并且观察 devtool 中的 mutation 日志。每一条 mutation 被记录,
devtools 都需要捕捉到前一状态和后一状态的快照。然而,在上面的例子中 mutation 中的异步函数中的回调让这不
可能完成:因为当 mutation 触发的时候,回调函数还没有被调用,devtools 不知道什么时候回调函数实际上被调
用——实质上任何在回调函数中进行的状态的改变都是不可追踪的。
那么如果我们想触发一个异步的操作呢? 答案是: action + $dispatch, 我们继续修改store/index.js下面的代码
文件位置 /src/store/index.js
import Vue from "vue" import Vuex from "vuex" Vue.use(Vuex) export default new Vuex.Store({ // 类似 vue 的 data state: { name: "oldName" }, // 类似 vue 的 computed getters:{ getReverseName: state => { return state.name.split("").reverse().join("") } }, // 类似 vue 里的 mothods(同步方法) mutations: { updateName (state) { state.name = "newName" } }, // 类似 vue 里的 mothods(异步方法) -------- 以下7行为新增 actions: { updateNameAsync ({ commit }) { setTimeout(() => { commit("updateName") }, 1000) } } })
然后我们可以再我们的vue页面里面这样使用
methods: { rename () { this.$store.dispatch("updateNameAsync") } }三、 Module 模块化
当项目越来越大的时候,单个 store 文件,肯定不是我们想要的, 所以就有了模块化.
假设 src/store 目录下有这2个文件
moduleA.js
export default { state: { ... }, getters: { ... }, mutations: { ... }, actions: { ... } }
moduleB.js
export default { state: { ... }, getters: { ... }, mutations: { ... }, actions: { ... } }
那么我们可以把 index.js 改成这样
import moduleA from "./moduleA" import moduleB from "./moduleB" export default new Vuex.Store({ modules: { moduleA, moduleB } })
这样我们就可以很轻松的把一个store拆分成多个.
四、 总结actions 的参数是 store 对象,而 getters 和 mutations 的参数是 state .
actions 和 mutations 还可以传第二个参数,具体看vuex官方文档
getters/mutations/actions 都有对应的map,如: mapGetters , 具体看vuex官方文档
模块内部如果怕有命名冲突的话,可以使用命名空间, 具体看vuex官方文档
vuex 其实跟 vue 非常像,有data(state),methods(mutations,actions),computed(getters),还能模块化.
如果觉得本文对您有用,请给本文的github加个star,万分感谢
另外,github上还有其他一些关于前端的教程和组件,有兴趣的童鞋可以看看,你们的支持就是我最大的动力。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/95129.html
摘要:每一条被记录,都需要捕捉到前一状态和后一状态的快照。然而,在上面的例子中中的异步函数中的回调让这不可能完成因为当触发的时候,回调函数还没有被调用,不知道什么时候回调函数实际上被调用实质上任何在回调函数中进行的状态的改变都是不可追踪的。 前言 之前几个项目中,都多多少少碰到一些组件之间需要通信的地方,而因为种种原因,event bus 的成本反而比vuex还高, 所以技术选型上选用了 v...
摘要:每一条被记录,都需要捕捉到前一状态和后一状态的快照。然而,在上面的例子中中的异步函数中的回调让这不可能完成因为当触发的时候,回调函数还没有被调用,不知道什么时候回调函数实际上被调用实质上任何在回调函数中进行的状态的改变都是不可追踪的。 前言 之前几个项目中,都多多少少碰到一些组件之间需要通信的地方,而因为种种原因,event bus 的成本反而比vuex还高, 所以技术选型上选用了 v...
摘要:前言之前几个项目中都多多少少碰到一些组件之间需要通信的地方而因为种种原因的成本反而比还高所以技术选型上选用了但是不知道为什么团队里的一些新人一听到就开始退缩了因为很难真的很难吗今天我们用简单的步来证明一下有多简单纯属个人经验难免有不正确的地 前言 之前几个项目中,都多多少少碰到一些组件之间需要通信的地方,而因为种种原因,event bus 的成本反而比vuex还高, 所以技术选型上选用...
摘要:前提虽然我们每天都会查看天气,但是如果你能够用限制微信每天早上七点定时为推送天气预报,生活指数。重要其中模块是本项目以及后续项目中很重要的模块,就是因为这个开源项目,我们才能使其与微信产生交互。 showImg(https://segmentfault.com/img/remote/1460000019558841?w=1920&h=1279); 前提 虽然我们每天都会查看天气,但是如...
阅读 3648·2021-10-18 13:34
阅读 2351·2021-08-11 11:15
阅读 1111·2019-08-30 15:44
阅读 654·2019-08-26 10:32
阅读 955·2019-08-26 10:13
阅读 2033·2019-08-23 18:36
阅读 1732·2019-08-23 18:35
阅读 491·2019-08-23 17:10