感谢您提供的任何帮助。有人知道如何使用Vue.js中的$emit方法将数据向上发送到全局方法吗?我在Vue.js的一个非常基本的例子中没有遇到任何问题。然而,一旦使用Vue CLI和更高级的文件夹结构设置了我的项目,我的方法似乎无法正确注册。
在我的Register.vue
组件中,我注册了一个新用户,这样做后,我想向上发送新用户以更新我的全局范围:
this.$emit("login-user", newUser);
我的组件注册如下:
<Register msg="Otherwise, go ahead and register here:" :login-user="loginNewUser"/>
其中:login-user
引用全局方法:loginNewUser()
。
loginNewUser()
方法在main.js
:中设置如下
new Vue({
router,
store,
render: h => h(App),
methods: {
loginNewUser(user) {
console.log(user);
}
}
}).$mount("#app");
我的方法放错地方了吗?使用Vue CLIcreate
项目层次结构时,如何将数据从组件向上发送到全局范围?这种方法以前是有效的,但我的应用程序设置略有不同,我可能忽略了一些非常重要的东西。
更多信息
如果您愿意,可以在以下位置查看此项目的完整回购:https://github.com/twknab/viaRV_vue_cli_project
在
src/components/Register.vue
中,第76行是我尝试对main.js
和第17行的loginNewUser()
方法进行$emit
调用的地方,我收到错误消息:
[Vue warn]:属性或方法"loginNewUser"未在实例上定义,但在渲染过程中被引用。通过初始化该属性,确保该属性在数据选项中是被动的,或者对于基于类的组件是被动的。
非常感谢您抽出时间阅读。
显示警告是因为loginNewUser
在Home
组件中被引用:
<Register msg="Otherwise, go ahead and register here:" @login-user="loginNewUser"/>
但是,loginNewUser
不是在Home
组件中定义的,而是在组件层次结构中的三级main.js
文件中定义的:main.js > App.vue > Home.vue
new Vue({
router,
store,
render: h => h(App),
methods: {
loginNewUser(user) {
// existing code here
}
}
}).$mount("#app");
解决方案#1
要解决这个问题,您必须将事件处理程序从main.js
传递到Home
组件,这涉及3个步骤。
首先,通过从修改main.js
中的render
函数,将事件处理程序传递给App.vue
render: h => h(App)
到此:
render: function(createElement) {
return createElement(App, {
on: {
loginNewUser: this.loginNewUser
}
})
}
h
是createElement
的一个更广义的版本,所以基本上,它们是相同的。
createElement
接受几个参数,我们将使用second
参数是将CCD_ 28处理程序传递给渲染组件的数据对象。
第二个,在App
组件中,定义loginNewUser
并将引用传递给router-view
。
export default {
name: "App",
methods: {
loginNewUser() {
this.$emit('loginNewUser');
}
}
}
<router-view @login-new-user="loginNewUser"></router-view>
第三,在Home.vue
组件中定义loginNewUser
。
export default {
name: "home",
components: {
Login,
Register
},
methods: {
loginNewUser() {
this.$emit('loginNewUser');
}
}
};
最后在当前代码中,不要忘记将:login-user
更改为@login-user
。
解决方案#2
如果您正在使用或计划使用Vuex
,而不是从上到下传递事件处理程序,则可以使用actions
,您可以在组件中的任何位置调用它。