Sorun
[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>)
Hata, changeSetting
yönteme buradaki MainTable
bileşende başvurulduğu için ortaya çıkıyor :
"<button @click='changeSetting(index)'> Info </button>" +
Ancak changeSetting
yöntem MainTable
bileşende tanımlanmamıştır . Burada kök bileşende tanımlanmaktadır:
var app = new Vue({
el: "#settings",
data: data,
methods: {
changeSetting: function(index) {
data.settingsSelected = data.settings[index];
}
}
});
Hatırlanması gereken şey, özelliklerin ve yöntemlerin yalnızca tanımlandıkları kapsamda referans alınabileceğidir.
Üst şablondaki her şey, üst kapsamda derlenir; alt şablondaki her şey alt kapsamda derlenir.
Vue'nun belgelerinde bileşen derleme kapsamı hakkında daha fazla bilgi edinebilirsiniz .
Bu konuda ne yapabilirim?
Şimdiye kadar, şeyleri doğru kapsamda tanımlamak hakkında çok fazla konuşma yapıldı, bu yüzden düzeltme sadece changeSetting
tanımı MainTable
bileşene taşımak mı?
Bu kadar basit görünüyor ama işte size tavsiye ettiğim şey.
Muhtemelen MainTable
bileşeninizin aptal / sunumsal bir bileşen olmasını istersiniz . ( Burada ne olduğunu bilmiyorsanız okuyacağınız bir şey var ama bir tl; dr, bileşenin sadece bir şeyi işlemekten sorumlu olmasıdır - mantık yok). Akıllı / kapsayıcı öğesi, mantıktan sorumludur - sorunuzda verilen örnekte, kök bileşen akıllı / kapsayıcı bileşeni olacaktır. Bu mimari ile, bileşenlerin etkileşime girmesi için Vue'nun ebeveyn-çocuk iletişim yöntemlerini kullanabilirsiniz. Verileri propsMainTable
aracılığıyla iletirsiniz ve etkinlikler aracılığıyla kullanıcı eylemlerini üst öğesinden yayınlarsınız . Şunun gibi görünebilir:MainTable
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) {
},
},
}),
Yukarıdakiler, size ne yapmanız gerektiği konusunda iyi bir fikir vermek ve sorununuzu çözmek için hızlı bir başlangıç yapmak için yeterli olmalıdır.
changeSetting
içinMainTable
bileşen.