Katakanlah saya memiliki instance Vue utama yang memiliki komponen anak. Apakah ada cara memanggil metode milik salah satu komponen ini dari luar instance Vue sepenuhnya?
Berikut ini sebuah contoh:
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>
Jadi ketika saya mengklik tombol internal, increaseCount()
metode ini terikat ke event klik sehingga dipanggil. Tidak ada cara untuk mengikat acara ke tombol eksternal, yang acara kliknya saya dengarkan dengan jQuery, jadi saya perlu cara lain untuk menelepon increaseCount
.
EDIT
Tampaknya ini berfungsi:
vm.$children[0].increaseCount();
Namun, ini bukan solusi yang baik karena saya mereferensikan komponen dengan indeksnya di array anak-anak, dan dengan banyak komponen ini tidak mungkin tetap konstan dan kode kurang dapat dibaca.
javascript
vue.js
harryg
sumber
sumber
Jawaban:
Pada akhirnya saya memilih untuk menggunakan arahan Vue
ref
. Ini memungkinkan komponen untuk dirujuk dari induk untuk akses langsung.Misalnya
Minta kompenen terdaftar di perusahaan induk saya:
Render komponen dalam template / html dengan referensi:
Sekarang, di tempat lain saya dapat mengakses komponen secara eksternal
Lihat biola ini untuk contoh: https://jsfiddle.net/xmqgnbu3/1/
(contoh lama menggunakan Vue 1: https://jsfiddle.net/6v7y6msr/ )
sumber
vm
karena cara itu meringkas modul. Anda dapat melakukan sesuatu sepertiwindow.app = vm
di blog Andamain.js
. Sumber: forum.vuejs.org/t/how-to-access-vue-from-chrome-console/3606Sejak Vue2 ini berlaku:
// dalam metode komponen A
// di kait komponen B yang dibuat
Lihat di sini untuk dokumentasi Vue. Dan di sini lebih detail tentang bagaimana mengatur bus acara ini.
Jika Anda ingin info lebih lanjut tentang kapan menggunakan properti, acara, dan / atau manajemen negara terpusat lihat artikel ini .
sumber
bus
variabel global , Anda dapat melangkah lebih jauh dan menyuntikkan bus ke komponen Anda menggunakan alat peraga . Saya relatif baru untuk menjawab, jadi saya tidak dapat meyakinkan Anda bahwa ini idiom.Anda dapat menggunakan sistem acara Vue
dan
Ini biola: http://jsfiddle.net/hfalucas/wc1gg5v4/59/
sumber
Versi yang sedikit berbeda (lebih sederhana) dari jawaban yang diterima:
Minta komponen terdaftar pada instance induk:
Render komponen dalam template / html dengan referensi:
Akses metode komponen:
sumber
Anda dapat mengatur referensi untuk komponen anak, lalu di induk dapat menelepon melalui $ referensi:
Tambahkan referensi ke komponen anak:
Tambahkan acara klik ke induk:
sumber
Katakanlah Anda memiliki
child_method()
komponen anak:Sekarang Anda ingin menjalankan
child_method
komponen dari induk:Jika Anda ingin menjalankan metode komponen induk dari komponen turunan:
this.$parent.name_of_method()
CATATAN: Tidak disarankan untuk mengakses komponen anak dan orang tua seperti ini.
Alih-alih sebagai praktik terbaik gunakan Alat Peraga & Acara untuk komunikasi orang tua-anak.
Jika Anda ingin komunikasi antar komponen pasti menggunakan vuex atau event bus
Silakan baca artikel yang sangat membantu ini
sumber
Ini adalah cara sederhana untuk mengakses metode komponen dari komponen lain
sumber
Ini yang sederhana
sumber
Saya tidak yakin apakah ini cara yang benar tetapi ini bekerja untuk saya.
Pertama-tama impor komponen yang berisi metode yang ingin Anda panggil di komponen Anda
dan kemudian memanggil metode MyCompenent
sumber
doSomething
menggunakan sesuatu dari data, metode ini tidak berguna.Saya telah menggunakan solusi yang sangat sederhana. Saya telah memasukkan elemen HTML, yang memanggil metode, dalam Komponen Vue yang saya pilih, menggunakan Vanilla JS, dan saya memicu klik!
Dalam Komponen Vue, saya telah memasukkan sesuatu seperti berikut:
Yang saya gunakan menggunakan Vanilla JS:
sumber