Saya mencoba menggunakan arahan klik di dalam komponen tetapi sepertinya tidak berhasil. Ketika saya mengklik komponen tak berguna terjadi ketika saya harus mendapatkan 'tes diklik' di konsol. Saya tidak melihat kesalahan di konsol, jadi saya tidak tahu apa yang saya lakukan salah.
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>vuetest</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
Aplikasi
<template>
<div id="app">
<test v-on:click="testFunction"></test>
</div>
</template>
<script>
import Test from './components/Test'
export default {
name: 'app',
methods: {
testFunction: function (event) {
console.log('test clicked')
}
},
components: {
Test
}
}
</script>
Test.vue (komponen)
<template>
<div>
click here
</div>
</template>
<script>
export default {
name: 'test',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>
javascript
vue-component
vuejs2
vue.js
Javier Cárdenas
sumber
sumber
@click.native="testFunction"
Saya pikir
$emit
fungsinya bekerja lebih baik untuk apa yang saya pikir Anda minta. Itu membuat komponen Anda terpisah dari instance Vue sehingga dapat digunakan kembali dalam banyak konteks.Gunakan itu dalam HTML
sumber
@click="$emit('click')"
dan dengan cara itu komponen induk hanya menggunakan yang biasa@click
@click="$emit('click')"
.Ini jawaban @Neps tetapi dengan detail.
Catatan : Jawaban Saurabh lebih cocok jika Anda tidak ingin mengubah komponen Anda atau tidak memiliki akses ke sana.
Mengapa @klik tidak bisa berfungsi?
Komponennya rumit. Satu komponen bisa menjadi pembungkus tombol mewah kecil, dan komponen lain bisa menjadi seluruh tabel dengan sekelompok logika di dalamnya. Vue tidak tahu persis apa yang Anda harapkan saat mengikat
v-model
atau menggunakanv-on
sehingga semua itu harus diproses oleh pembuat komponen.Cara menangani acara klik
Menurut Vue docs ,
$emit
meneruskan acara ke orang tua. Contoh dari dokumen:File utama
Komponen
(
@
adalahv-on
steno )Komponen menangani
click
acara asli dan memancarkan acara induk@enlarge-text="..."
enlarge-text
dapat diganti denganclick
agar terlihat seperti kami menangani acara klik asli:Tapi itu belum semuanya.
$emit
memungkinkan untuk memberikan nilai tertentu dengan suatu peristiwa. Dalam kasus asliclick
, nilainya adalah MouseEvent (acara JS yang tidak ada hubungannya dengan Vue).Vue menyimpan acara itu dalam suatu
$event
variabel. Jadi, yang terbaik adalah memancarkan$event
dengan sebuah acara untuk menciptakan kesan penggunaan acara asli:sumber
Sedikit bertele-tele tetapi ini adalah bagaimana saya melakukannya:
@click="$emit('click', $event)"
sumber
$emit
tetapi tidak ada yang terjadi. Apakah saya perlu melakukan sesuatu sebagai tambahan$emit
? jsfiddle.net/xwvhy6a3Peristiwa asli komponen tidak dapat diakses langsung dari elemen induk. Sebagai gantinya Anda harus mencoba
v-on:click.native="testFunction"
, atau Anda dapat memancarkan suatu peristiwa dariTest
komponen juga. Sepertiv-on:click="$emit('click')"
.sumber
Seperti yang disebutkan oleh Chris Fritz (Vue.js Core Team Emeriti ) di VueCONF US 2019
Dengan Vue 2
Menggunakan
$listeners
:Jadi, jika Anda menggunakan Vue 2 pilihan yang lebih baik untuk menyelesaikan masalah ini adalah dengan menggunakan logika wrapper yang sepenuhnya transparan . Untuk Vue ini menyediakan
$listeners
properti yang berisi objek pendengar yang digunakan pada komponen. Sebagai contoh:dan kemudian kita hanya perlu menambahkan
v-on="$listeners"
ketest
komponen seperti:Test.vue (komponen anak)
Sekarang
<test>
komponennya adalah pembungkus yang sepenuhnya transparan , artinya dapat digunakan persis seperti<div>
elemen normal : semua pendengar akan bekerja, tanpa.native
pengubah.Demo:
Menggunakan
$emit
metode:Kita juga dapat menggunakan
$emit
metode untuk tujuan ini, yang membantu kita mendengarkan peristiwa komponen anak dalam komponen induk. Untuk ini, pertama-tama kita harus memancarkan acara khusus dari komponen anak seperti:Test.vue (komponen anak)
Penting: Selalu gunakan kotak kebab untuk nama acara. Untuk informasi lebih lanjut dan demo pembuatan ulang poin ini, silakan periksa jawaban ini: VueJS meneruskan nilai yang dihitung dari komponen ke induk .
Sekarang, kita hanya perlu mendengarkan acara kustom yang dipancarkan ini di komponen induk seperti:
Aplikasi
Jadi, pada dasarnya alih-alih
v-on:click
atau singkatan@click
kami hanya akan menggunakanv-on:my-event
atau hanya@my-event
.Demo:
Dengan Vue 3
Menggunakan
v-bind="$attrs"
:Vue 3 akan membuat hidup kita lebih mudah dalam banyak hal. Salah satu contoh untuk itu adalah itu akan membantu kita untuk membuat pembungkus transparan yang lebih sederhana dengan konfigurasi yang sangat sedikit hanya dengan menggunakan
v-bind="$attrs"
. Dengan menggunakan ini pada komponen anak tidak hanya pendengar kita akan bekerja langsung dari orang tua tetapi juga atribut lain juga akan berfungsi seperti biasa<div>
saja.Jadi, sehubungan dengan pertanyaan ini, kami tidak perlu memperbarui apa pun di Vue 3 dan kode Anda masih akan berfungsi dengan baik seperti
<div>
elemen root di sini dan itu akan secara otomatis mendengarkan semua acara anak-anak.Demo # 1:
Tetapi untuk komponen yang kompleks dengan elemen bersarang di mana kita perlu menerapkan atribut dan acara ke utama
<input />
alih-alih label induk kita cukup gunakanv-bind="$attrs"
Demo # 2:
sumber
Dari dokumentasi :
Karena keterbatasan dalam JavaScript, Vue tidak dapat mendeteksi perubahan berikut pada array:
Dalam kasus saya, saya menemukan masalah ini ketika bermigrasi dari Angular ke VUE. Perbaikannya cukup mudah, tetapi sangat sulit ditemukan:
sumber