Как я могу использовать $ emit с Vue.js при настройке проекта Vue CLI?

1

Спасибо за любую помощь, которую вы можете предоставить. Кто-нибудь знает, как можно использовать метод $ 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" не определен в экземпляре, но на него ссылаются во время рендеринга. Убедитесь, что это свойство является реактивным либо в параметре данных, либо для компонентов на основе классов, путем инициализации свойства.

Большое спасибо за ваше время и за чтение.

  • 1
    попробуйте @login-user="loginNewUser" и посмотрите на этот ответ
Теги:
scope
vue.js
vuejs2

1 ответ

1
Лучший ответ

Предупреждение 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 шага.

Сначала передайте обработчик событий в 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.


Решение № 2

Если вы используете Vuex или планируете, вместо передачи вашего обработчика событий сверху вниз, вы можете использовать actions которые вы можете вызывать в любом месте ваших компонентов.

  • 1
    большое спасибо за тщательный и вдумчивый ответ! В итоге я переместил свои глобальные методы в компонент App (не в main.js ) и теперь полностью понимаю, что вы имеете в виду. Сейчас я отправляю из моего компонента Register > Home component`> (повторная отправка) в мое App где хранятся мои методы и глобальные данные. Большое спасибо за то, что помогли мне лучше понять эту концепцию! Я дал бы вам больше +1, если бы я мог за вашу тщательность и детализацию, полностью направил меня к правильному пониманию! Спасибо!
  • 1
    Пожалуйста. Я тоже учусь, делясь, так что это беспроигрышно. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню