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, changeSettingyönteme buradaki MainTablebileşende başvurulduğu için ortaya çıkıyor :
"<button @click='changeSetting(index)'> Info </button>" +
Ancak changeSettingyöntem MainTablebileş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 changeSettingtanımı MainTablebileşene taşımak mı?
Bu kadar basit görünüyor ama işte size tavsiye ettiğim şey.
Muhtemelen MainTablebileş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.
changeSettingiçinMainTablebileşen.