Спасибо за любую помощь, которую вы можете предоставить. Кто-нибудь знает, как можно использовать метод $ emit в Vue.js для отправки данных по цепочке глобальному методу? У меня не было проблем, чтобы заставить это работать на очень простом примере с 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");
Мой метод не в том месте? Как я могу отправить данные из моего компонента в поток, когда я использую иерархию проекта create
Vue CLI? Этот метод работал ранее, однако мое приложение было настроено немного иначе, и я могу пропустить что-то очень важное.
Вы можете увидеть полное репо для этого проекта, если хотите, по адресу: https://github.com/twknab/viaRV_vue_cli_project
В src/components/Register.vue
в строке 76 я пытаюсь выполнить свой вызов $emit
main.js
для main.js
и мой loginNewUser()
в строке 17, в который я получаю сообщение об ошибке:
[Vue warn]: свойство или метод "loginNewUser" не определен в экземпляре, но на него ссылаются во время рендеринга. Убедитесь, что это свойство является реактивным либо в параметре данных, либо для компонентов на основе классов, путем инициализации свойства.
Большое спасибо за ваше время и за чтение.
Предупреждение 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");
Чтобы решить эту проблему, вы должны передать обработчик событий из вашего main.js
в ваш Home
компонент, который включает 3 шага.
Сначала передайте обработчик событий в App.vue
, изменив функцию render
в main.js
из:
render: h => h(App)
к этому:
render: function(createElement) {
return createElement(App, {
on: {
loginNewUser: this.loginNewUser
}
})
}
h
является более обобщенной версиейcreateElement
поэтому в основном они одинаковы.
createElement
принимает несколько аргументов, и мы будем использоватьsecond
аргумент, который является объектом данных для передачиevent
обработчиков оказанной компоненты.
Во-вторых, в вашем компоненте App
определите loginNewUser
и передайте ссылку на представление router-view
.
export default {
name: "App",
methods: {
loginNewUser() {
this.$emit('loginNewUser');
}
}
}
<router-view @login-new-user="loginNewUser"></router-view>
В-третьих, определите loginNewUser
в вашем компоненте Home.vue
.
export default {
name: "home",
components: {
Login,
Register
},
methods: {
loginNewUser() {
this.$emit('loginNewUser');
}
}
};
Наконец, в своем текущем коде не забудьте изменить :login-user
на @login-user
.
Если вы используете Vuex
или планируете, вместо передачи вашего обработчика событий сверху вниз, вы можете использовать actions
которые вы можете вызывать в любом месте ваших компонентов.
App
(не в main.js
) и теперь полностью понимаю, что вы имеете в виду. Сейчас я отправляю из моего компонента Register
> Home
component`> (повторная отправка) в мое App
где хранятся мои методы и глобальные данные. Большое спасибо за то, что помогли мне лучше понять эту концепцию! Я дал бы вам больше +1, если бы я мог за вашу тщательность и детализацию, полностью направил меня к правильному пониманию! Спасибо!
@login-user="loginNewUser"
и посмотрите на этот ответ