实现一个vuex插件
pvuex
初始化: Store声明、install实现,vuex.js:
let Vue;
// 定义install方法 完成赋值与注册
function install(_Vue) {
Vue = _Vue;
Vue.mixin({
beforeCreate() {
if (this.$options.store) {
Vue.prototype.$store = this.$options.store;
}
}
});
}
// 定义sotre类,管理响应式状态 state
class Store {
constructor(options = {}) {
this._vm = new Vue({
data: {
$$state:options.state
}
});
}
get state() {
return this._vm._data.$$state
}
set state(v) {
return v
}
}
function install(_Vue) {
Vue = _Vue;
Vue.mixin({
beforeCreate() {
if (this.$options.store) {
Vue.prototype.$store = this.$options.store;
}
}
});
}
export default { Store, install };
实现 commit
:根据用户传入type获取并执行对应 mutation
// class Store...
constructor(options = {}) {
// 保存用户配置的mutations选项
this._mutations = options.mutations || {}
}
commit(type, payload) {
// 获取对应的mutation
const entry = this._mutations[type]
// 传递state给mutation
entry && entry(this.state, payload);
}
实现 actions
:根据用户传入type获取并执行对应 action
constructor(options = {}) {
this._actions = options.actions || {}
const store = this
const {commit, action} = store
// 将上下文指定为sotre实例
this.commit = this.commit.bind(this)
this.dispatch = this.dispatch.bind(this)
}
dispatch(type, payload) {
// 获取对应的action
const entry = this._actions[type]
return entry && entry(this, payload);
}
实现 getters
, 并利用computed属性缓存.
// class Store标签:yyds,Vue,const,state,干货,._,vuex,options,store From: https://blog.51cto.com/u_11365839/6118680
const store = this
const computed = {}
Object.keys(this._getters).forEach(key => {
computed[key] = function(){
store._getters[key](store.state)
}
Object.defineProperty(this.getters, key, {
get(){
return store._vm[key]
},
set(v){
console.log(v)
}
})
});
this._vm = new Vue({
data: {
$$state:options.state
},
computed
});