VueJS получает доступ к компонентам из экземпляра

Я ищу способ получить доступ к методу моего компонента из моего экземпляра

<button id="live" class="ui primary button" v-on:click.prevent="live">
    Live Text
</button>

который находится непосредственно внутри моего #app, и чтобы заставить его запускать метод live из моего компонента Live.vue, я нашел тонны документации до версии 2.x о broadcast и dispatch, но после часа попыток заставить его работать с использованием $emit я уже не знаю что делаю..

<template>
  <div v-if="loaded">
    Live
  </div>
</template>

<script>
export default {
  data: function () {
    return {
      loading: false,
      loaded: false,
    }
  },
  methods: {
    load: function (event) {
      console.log('loading..')
      this.loaded = !this.loaded
    }
  },
  mounted: function () {
    // this.$on('liveClick', function (msg) {
    //   console.log(msg)
    // })
  },
  name: 'Live',
  props: {
    'id': Number,
    'key': String
  }
}
</script>

и init.js (это структура на основе laravel)

window.App = new Vue({
   el: '#app',
   methods: {
     live: function (event) {
       this.$emit('liveClick', 'msg')
     }
   }
})

Я уже сделал «обходной путь» с Vuex, но мне не нужно усложнять кривую обучения только для того, чтобы заставить это работать.

jsfiddle: https://jsfiddle.net/c4s44qgy/1/


person dev    schedule 04.01.2017    source источник
comment
Я думаю, что смогу вам помочь, но не могли бы вы объяснить это лучше? ‹button id=live class=ui основная кнопка v-on:click.prevent=live› Live () ‹/button› Какая функция может быть внутри кнопки?   -  person Marek Urbanowicz    schedule 04.01.2017
comment
также вы должны определить loaded в начале. Вы используете его, но он не определен. Вы должны определить его как ложное. Кроме того, вы не должны использовать v-if в корневом div в шаблоне.   -  person Marek Urbanowicz    schedule 04.01.2017
comment
Я определил его, просто не скопировал вставленный код и написал его, чтобы пропустить его части, не связанные с вопросом. Что касается того, что он должен делать, это довольно понятно. Когда вы нажмете кнопку, он покажет div с надписью «Live» в том месте, где я разместил теги компонентов — это текст внутри, а не функция, которую я вставил в скобки. Я сделаю его более читабельным как можно скорее.   -  person dev    schedule 04.01.2017
comment
не могли бы вы создать быстрый jsfiddle? Я помогу тебе тогда.   -  person Marek Urbanowicz    schedule 04.01.2017
comment
для меня похоже, что вы пытаетесь использовать однофайловые компоненты без веб-пакета. Пожалуйста, создайте jsfiddle, и я помогу вам   -  person Marek Urbanowicz    schedule 04.01.2017
comment
Он использует веб-пакет, у него есть серверная часть Laravel, которая является частью структуры. Я просто использую Vue для некоторых интерфейсных вещей, таких как вставка простых компонентов, я не могу охватить всю структуру, но в основном это часть vue jsfiddle.net/c4s44qgy/1   -  person dev    schedule 04.01.2017


Ответы (1)


Вы можете найти фиксированную скрипку здесь: https://jsfiddle.net/gr9c6h64/

По сути, когда вы хотите передать данные компонентам из основного экземпляра Vue, вы должны использовать реквизиты в этом компоненте, как я сделал в скрипке: props: { loaded: String }, а затем передать значение от родителя, используя :loaded='isLoaded'

Я не думаю, что это именно то, что вы хотите сделать, но похоже, что это то, с чем у вас проблемы. Надеюсь, поможет!

person Marek Urbanowicz    schedule 04.01.2017
comment
Проблема в том, что я не могу манипулировать реквизитом компонента изнутри компонента, потому что реквизит перезаписывается при повторном рендеринге компонента. Вот почему я искал способ получить доступ к данным или методам компонента извне. Это хороший обходной путь, но я не могу заставить его работать таким образом. - person dev; 04.01.2017
comment
Я думаю, ты ошибаешься. проверьте это: jsfiddle.net/gr9c6h64/2 Просто добавил ввод с v-моделью, чтобы показать вам эти данные сохраняются. Повторный рендеринг не выбрасывает данные. Это не обходной путь, это то, как это должно быть сделано. Пожалуйста, объясните, что еще вам нужно - person Marek Urbanowicz; 04.01.2017
comment
Думаю, я понял, ты прав. Это, вероятно, сделало бы работу. Но позже это станет очень грязным (одна вещь, которую я никогда не рассматривал, прежде чем пойти по этому пути), и я, вероятно, все еще буду использовать реализацию Vuex, которую я уже сделал. Приятно знать, что это можно сделать с помощью реквизита. - person dev; 04.01.2017