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 changeSettingmetode ini direferensikan dalam MainTablekomponen di sini:
"<button @click='changeSetting(index)'> Info </button>" +
Namun changeSettingmetode ini tidak ditentukan dalam MainTablekomponen. 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 changeSettingdefinisi ke dalam MainTablekomponen?
Tampaknya sesederhana itu tetapi inilah yang saya rekomendasikan.
Anda mungkin ingin MainTablekomponen 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 MainTablemelalui props dan mengirimkan tindakan pengguna dari MainTableke 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.
changeSettingkeMainTablekomponen.