1.安装开发环境安装
vscode,git,nodejs,vue-cli等开发工具的步骤本文就略过了。默认已安装好此依赖。执行Vue init webpack-simple [appname]根据提示构建出一个简单的vue工程,因为只是用来研究vuex的运行机制,尽量简化的工程可以减少不必要的干扰。惯例,npm install
2.引入vuex示例
<template>
<div id="app">
<span>{{ counter }}</span>
<button @click="increment">点击触发mutation</button>
<button @click="incrementAsyc">点击触发action</button>
</div>
</template>
<script>
export default {
name: 'app',
data () {
return {
}
},
computed: {
counter() {
return this.$store.state.count
}
},
methods: {
increment() {
this.$store.commit('increment')
},
incrementAsyc() {
this.$store.dispatch('incrementAsync')
}
},
}
</script>
import Vue from 'vue'
import App from './App.vue'
import vuex from 'vuex'
import storeOption from './store'
Vue.use(vuex)
const store = new vuex.Store(storeOption)
new Vue({
el: '#app',
store,
render: h => h(App)
})
控制台有调试控制按钮以及堆栈信息,局部scope等信息。
然后通过f9,f10,f11等快捷键单步调试或者跳出函数等调试功能即可跟踪整个vuex的运行状态。另外vuex的大部分的初始化工作是在执行Vue.use(vuex)和创建new vuex.Store时完成的,想要了解vuex的初始化过程需要跟踪这两行代码的运行情况。
二、vuex运行的基本原理
上面介绍了vuex的代码运行状态的跟踪方法,有了上面的基本“捕鱼技术”只要有时间,逐行跟踪vuex的代码调用就可以完全弄清楚vuex的运行机理。下面主要从源码角度简单介绍一下
1. vuex的初始化
调用Vue.use安装vue插件时,其实是会调用插件提供出来的install方法。Install函数中主要执行这段逻辑(不考虑vue2以下版本)。
可以看出,是在vue上全局混入(不明白全局混入,请自行百度vue的mixin)了一个初始化生命周期的钩子函数,也就是在初始化会执行vuexInit函数。
如果组件自身的store存在,则$store属性指向自身的store传入的store,否则则去找父亲组件的$store,所以vuex在根组件注入store对象之后,所有组件引用的store对象都来源于根组件。所以只要根组件申明了store属性,其他的组件都可以使用$store.(从代码中看出,还可以配置vuex属性来设置vuex的配置,此处不深入探索)。
2. vuex.Store的构造函数
构造一个Vue对象,其中引用store的state对象,然后获取的state就是这个Vue对象中的?state。如果了解Vue的双向数据绑定的话,这里很简单的用构造vue对象的方式,利用vue的双向数据绑定,将state对象变成响应对象。
这也是vuex的最基本原理。
3. commit和dispatch函数调用
commit函数主要逻辑
而entry是通过registerMutation函数创建出来
commit函数中核心调用,调用_withCommit函数,这个函数是一个装饰函数。
三、总结
1. vuex
2. vuex
3. vuex
vuex是vue的状态管理插件,与Flux和Redux的功能及设计理念都差不多。