Masalah
[Vue warn]: Property or method "changeSetting" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option. (found in <MainTable>)
Kesalahan terjadi karena changeSetting
metode ini direferensikan dalam MainTable
komponen di sini:
"<button @click='changeSetting(index)'> Info </button>" +
Namun changeSetting
metode ini tidak ditentukan dalam MainTable
komponen. Ini didefinisikan dalam komponen root di sini:
var app = new Vue({
el: "#settings",
data: data,
methods: {
changeSetting: function(index) {
data.settingsSelected = data.settings[index];
}
}
});
Yang perlu diingat adalah bahwa properti dan metode hanya dapat direferensikan dalam lingkup tempat mereka didefinisikan.
Segala sesuatu di template induk dikompilasi dalam lingkup induk; semua yang ada di templat anak dikompilasi dalam lingkup anak.
Anda dapat membaca lebih lanjut tentang ruang lingkup kompilasi komponen di dokumentasi Vue .
Apa yang dapat saya lakukan?
Sejauh ini sudah banyak pembicaraan tentang pendefinisian hal-hal dalam lingkup yang benar sehingga perbaikannya hanya dengan memindahkan changeSetting
definisi ke dalam MainTable
komponen?
Tampaknya sesederhana itu tetapi inilah yang saya rekomendasikan.
Anda mungkin ingin MainTable
komponen Anda menjadi komponen yang bodoh / presentasi. ( Ini adalah sesuatu untuk dibaca jika Anda tidak tahu apa itu kecuali tl; dr adalah bahwa komponen hanya bertanggung jawab untuk merender sesuatu - tidak ada logika). Elemen smart / container bertanggung jawab atas logika tersebut - dalam contoh yang diberikan dalam pertanyaan Anda, komponen root adalah komponen smart / container. Dengan arsitektur ini Anda dapat menggunakan metode komunikasi orangtua-anak Vue agar komponen dapat berinteraksi. Anda menurunkan data MainTable
melalui props dan mengirimkan tindakan pengguna dari MainTable
ke induknya melalui peristiwa . Ini mungkin terlihat seperti ini:
Vue.component('main-table', {
template: "<ul>" +
"<li v-for='(set, index) in settings'>" +
"{{index}}) " +
"{{set.title}}" +
"<button @click='changeSetting(index)'> Info </button>" +
"</li>" +
"</ul>",
props: ['settings'],
methods: {
changeSetting(value) {
this.$emit('change', value);
},
},
});
var app = new Vue({
el: '#settings',
template: '<main-table :settings="data.settings" @change="changeSetting"></main-table>',
data: data,
methods: {
changeSetting(value) {
},
},
}),
Hal di atas seharusnya cukup untuk memberi Anda gagasan bagus tentang apa yang harus dilakukan dan mulai menyelesaikan masalah Anda.
changeSetting
keMainTable
komponen.