简单原理实现
 
讲解
 
 
 
 
import Vue from 'vue'
Vue.mixin({
  created () {
      console.log('我是孙悟空')
  }
})
const a = new Vue({
  
})
const b = new Vue({
  
})
 
 

 
代码实现
 
 
- vuex.js
let Vue;
const install = (v) => { 
    Vue = v;
    
    Vue.mixin({
        beforeCreate() {
            if (this.$options && this.$options.store) {
                
                这也解释了为什么使用vuex要先把store放到入口文件main.js里的根Vue实例里
                this.$store = this.$options.store;
            } else {
                
                this.$store = this.$parent && this.$parent.$store;
            }
        },
    })
}
class Store {
    constructor(options) { 
        this.vm = new Vue({
            
            data: {
                state: options.state
            }
        });
        
        let getters = options.getters || {};
        this.getters = {};
        console.log(Object.keys(this.getters))
        Object.keys(getters).forEach(getterName => {
            Object.defineProperty(this.getters, getterName, {
                get: () => {
                    return getters[getterName](this.state);
                }
            })
        })
        
        let mutations = options.mutations || {};
        this.mutations = {};
        Object.keys(mutations).forEach(mutationName => {
            this.mutations[mutationName] = payload => {
                mutations[mutationName](this.state, payload);
            }
        })
        
        let actions = options.actions || {};
        this.actions = {};
        Object.keys(actions).forEach(actionName => {
            this.actions[actionName] = payload => {
                actions[actionName](this.state, payload);
            }
        })
    }
    
    get state() {
        return this.vm.state;
    }
    
    commit(name, payload) {
        this.mutations[name](payload);
    }
    
    dispatch(name, payload) {
        this.actions[name](payload);
    }
}
export default {
    install,
    Store
}
 
- index.js
import Vue from 'vue';
import vuex from './vuex'; 
Vue.use(vuex); 
export default new vuex.Store({
    state: {
        num: 1
    },
    getters: {
        getNum(state) {
            return state.num * 2;
        }
    },
    mutations: { in (state, payload) {
            state.num += payload;
        },
        de(state, payload) {
            state.num -= payload;
        }
    },
    actions: { in (state, payload) {
            setTimeout(() => {
                state.num += payload;
            }, 2000)
        }
    }
})
 
- main.js
import Vue from 'vue';
import App from './App.vue'
import store from './store/index'; 
new Vue({
    store, 
    el: '#app',
    components: {
        App
    },
    template: '<App/>',
})