Допустим, у меня есть основной экземпляр Vue, имеющий дочерние компоненты. Есть ли способ полностью вызвать метод, принадлежащий одному из этих компонентов, вне экземпляра Vue?
Вот пример:
var vm = new Vue({
el: '#app',
components: {
'my-component': {
template: '#my-template',
data: function() {
return {
count: 1,
};
},
methods: {
increaseCount: function() {
this.count++;
}
}
},
}
});
$('#external-button').click(function()
{
vm['my-component'].increaseCount(); // This doesn't work
});
<script src="http://vuejs.org/js/vue.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="app">
<my-component></my-component>
<br>
<button id="external-button">External Button</button>
</div>
<template id="my-template">
<div style="border: 1px solid; padding: 5px;">
<p>A counter: {{ count }}</p>
<button @click="increaseCount">Internal Button</button>
</div>
</template>
Поэтому, когда я нажимаю внутреннюю кнопку, increaseCount()
метод привязывается к событию click, поэтому он вызывается. Нет способа привязать событие к внешней кнопке, чье событие щелчка я слушаю с помощью jQuery, поэтому мне понадобится другой способ вызова increaseCount
.
РЕДАКТИРОВАТЬ
Кажется, это работает:
vm.$children[0].increaseCount();
Однако это не очень хорошее решение, потому что я ссылаюсь на компонент по его индексу в массиве дочерних элементов, и для многих компонентов это вряд ли останется постоянным, а код будет менее читаемым.
javascript
vue.js
harryg
источник
источник
Ответы:
В конце концов я выбрал директиву Vue
ref
. Это позволяет ссылаться на компонент от родителя для прямого доступа.Например
Зарегистрировать компонент на моем родительском экземпляре:
Визуализируйте компонент в template / html со ссылкой:
Теперь в другом месте я могу получить доступ к компоненту извне
Посмотрите эту скрипку для примера: https://jsfiddle.net/xmqgnbu3/1/
(старый пример с использованием Vue 1: https://jsfiddle.net/6v7y6msr/ )
источник
vm
из-за того, как он охватывает модули. Вы можете сделать что-то, какwindow.app = vm
у васmain.js
. Источник: forum.vuejs.org/t/how-to-access-vue-from-chrome-console/3606С Vue2 это относится:
// в методе компонента A
// в созданном хуке компонента B
Смотрите здесь для Vue документы. А вот более подробно о том, как точно настроить эту шину событий.
Если вам нужна дополнительная информация о том, когда использовать свойства, события и / или централизованное управление состоянием, см. Эту статью .
источник
bus
переменная, вы можете пойти дальше и внедрить шину в свой компонент, используя реквизиты . Я относительно новичок в Vue, поэтому я не могу заверить вас, что это идиоматично.Вы можете использовать систему событий Vue
и
Вот скрипка: http://jsfiddle.net/hfalucas/wc1gg5v4/59/
источник
Немного другая (более простая) версия принятого ответа:
Зарегистрируйте компонент в родительском экземпляре:
Визуализируйте компонент в template / html со ссылкой:
Доступ к методу компонента:
источник
Вы можете установить ref для дочерних компонентов, тогда в parent можно вызывать через $ refs:
Добавьте ссылку на дочерний компонент:
Добавить событие клика к родителю:
источник
Скажем, у вас есть
child_method()
дочерний компонент:Теперь вы хотите выполнить
child_method
из родительского компонента:Если вы хотите выполнить метод родительского компонента из дочернего компонента:
this.$parent.name_of_method()
ПРИМЕЧАНИЕ. Не рекомендуется обращаться к дочернему и родительскому компоненту, как это.
Вместо этого, в качестве лучшей практики, используйте Props & Events для общения между родителями и детьми.
Если вам нужна связь между компонентами, обязательно используйте vuex или шину событий
Пожалуйста, прочитайте эту очень полезную статью
источник
Это простой способ доступа к методам компонента из другого компонента.
источник
Вот простой
источник
Я не уверен, что это правильный путь, но этот работает для меня.
Сначала импортируйте компонент, который содержит метод, который вы хотите вызвать в вашем компоненте.
а затем вызвать любой метод MyCompenent
источник
doSomething
используете какую-либо вещь из данных, этот метод бесполезен.Я использовал очень простое решение. Я включил элемент HTML, который вызывает метод, в мой компонент Vue, который я выбираю, используя Vanilla JS, и я запускаю щелчок!
В компонент Vue я включил что-то вроде следующего:
Что я использую, используя Vanilla JS:
источник