当前位置: 首页 > Web前端 > vue.js

vuex的store是如何挂载到各个组件里面的

时间:2023-03-31 23:47:55 vue.js

为什么我们可以直接在组件中通过this.$store.xx直接操作vuex。我们每次使用vuex,都需要从'vue'中导入vue;从'vuex'导入Vuex;Vue.use(Vuex);Vue.use会执行Vuex对象中的install方法functioninstall(_Vue){//防止重复调用installif(Vue&&_Vue===Vue){console.error('[vuex]alreadyinstalled.Vue.use(Vuex)应该只调用一次。');返回;}Vue=_Vue;applyMixin(Vue);}install方法中调用了applyMixin方法functionapplyMixin(Vue){//获取vue的版本varversion=Number(Vue.version.split('.')[0]);if(version>=2){Vue.mixin({beforeCreate:vuexInit});}else{//处理低于vue2的版本//覆盖init并注入vuexinit过程//以实现1.x向后兼容性。var_init=Vue.原型._init;Vue.prototype._init=function(options){if(options===void0)options={};选项.init=选项.init?[vuexInit].concat(options.init):vuexInit;_init.call(这个,选项);};在applyMixin方法中,首先获取Vue的版本号,2以下的版本通过重写Vue的原型方法_init来达到目的。对于vue2.x版本,使用全局mix-in机制,使用全局mix-in,会影响后面创建的每一个Vue实例。vuexInit方法会在实例生命周期beforeCreate中执行。/***Vuex初始化钩子,注入到每个实例的钩子列表中*Vuexinit钩子,注入到每个实例的初始化钩子列表中。*/functionvuexInit(){//这里的this指向Vue实例varoptions=this.$选项;//存储注入if(options.store){this.$store=typeof选项。商店==='功能'?选项。商店():选项。店铺;}elseif(options.parent&&options.parent.$store){this.$store=options.parent.$store;}}//=================newVue({router,store,//在/store/index.js文件中暴露:来自newVuex.Store的对象渲染:h=>h(App),}).$mount('#app');当我们执行newVue时,里面的参数会合并到$options中。此时options.store存在,实例的$store指向Store实例对象。在子组件中,$store属性也会指向父组件的$store属性。也就是说,在每个实例中,this.$store都会指向我们从/store/index.js中的newVuex.Store实例化的对象。以上就是为什么我们可以在组件中的this.$store中指向Vuex的Store实例对象。