Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vue.js 从vuex操作访问$root实例_Vue.js_Vuex - Fatal编程技术网

Vue.js 从vuex操作访问$root实例

Vue.js 从vuex操作访问$root实例,vue.js,vuex,Vue.js,Vuex,我有一个加载程序组件,它将根据 created() { this.$root.$on('show-loading', (vars) => { this.loading = vars; console.log('loader executed'); }); }, 当前,我可以通过this.$root.$emit('show-load',true)从vue组件执行显示加载 但是,我现在正在尝试从vuex模块文件执行代码。我犯了一个错误 Type

我有一个加载程序组件,它将根据

created() {
    this.$root.$on('show-loading', (vars) => {
        this.loading = vars;
        console.log('loader executed');
    });
},
当前,我可以通过
this.$root.$emit('show-load',true)从vue组件执行
显示加载

但是,我现在正在尝试从vuex模块文件执行代码。我犯了一个错误

TypeError:“\u此.$root未定义”


有人知道从vuex访问根实例的正确方法吗?

不要将事件处理程序放在vuex存储中。他们不属于那里,也永远不会像预期的那样工作。在存储中有getter(从存储中获取值的方法)、transformation(同步设置器)、actions(异步设置器)和state(数据)

侦听器属于Vue实例,例如组件。除此之外,我还建议避免像瘟疫一样使用
this.$root
this.$parent
。在代码中包含这些内容通常意味着您在实际组件文件之外更改组件,这会导致神奇的行为,即在您不希望更改的地方更改内容

在您的情况下,您想做的事情可以更容易地通过单个存储突变或操作来完成

在您的商店中创建一个突变

const突变={
显示加载(状态、数据){
state.loading=数据;
}
};
现在,在您的组件中只需使用
this.$store.commit('showLoading',true)。不需要事件总线。没有在根组件中神奇地出现的事件。只有一个同步设置器


如果需要全局事件处理,可以使用总线

const$bus=new Vue();
Vue.prototype.$bus=$bus;
在组件中,您可以使用
this.$bus.$on(…)
侦听事件,或使用
this.$bus.$emit(…)
发出事件。如果您需要完全在Vue之外进行操作,可以使用以下模式在组件之外创建事件侦听器

$bus.$on('show-load',(vars)=>{
//做点什么
});

从技术上讲,它甚至允许您使用
导入存储从“../path/to/store”
store.commit(…)

加载存储。如果事件旨在在根目录中设置变量,您可以使用Vuex状态,并从根组件绑定到它。这将使根与Vuex模块解耦。哦,很抱歉,我没有包括,但没有。事件没有设置根变量<代码>此。加载
是组件级数据。您仍然可以使用Vuex状态进行加载。谢谢您,先生。我会尝试一下你的方法,并给你我的反馈