Problem
[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>)
Błąd występuje, ponieważ changeSetting
w MainTable
komponencie występuje odwołanie do metody :
"<button @click='changeSetting(index)'> Info </button>" +
Jednak changeSetting
metoda nie jest zdefiniowana w MainTable
komponencie. Jest definiowany w głównym komponencie tutaj:
var app = new Vue({
el: "#settings",
data: data,
methods: {
changeSetting: function(index) {
data.settingsSelected = data.settings[index];
}
}
});
Należy pamiętać, że do właściwości i metod można się odwoływać tylko w zakresie, w którym zostały zdefiniowane.
Wszystko w szablonie nadrzędnym jest kompilowane w zakresie nadrzędnym; wszystko w szablonie podrzędnym jest kompilowane w zakresie podrzędnym.
Możesz przeczytać więcej o zakresie kompilacji komponentów w dokumentacji Vue .
Co mogę z tym zrobić?
Jak dotąd dużo się mówiło o definiowaniu rzeczy we właściwym zakresie, więc rozwiązaniem jest po prostu przeniesienie changeSetting
definicji do MainTable
komponentu?
Wydaje się to takie proste, ale oto co polecam.
Prawdopodobnie chciałbyś, aby Twój MainTable
komponent był elementem głupim / prezentacyjnym. ( Tutaj jest coś do przeczytania, jeśli nie wiesz, co to jest, ale tl; dr mówi, że komponent jest po prostu odpowiedzialny za renderowanie czegoś - bez logiki). Za logikę odpowiada element smart / container - w przykładzie podanym w pytaniu głównym komponentem byłby komponent smart / container. Dzięki tej architekturze możesz używać metod komunikacji rodzic-dziecko Vue do interakcji komponentów. Przekazujesz dane do MainTable
via props i emitujesz akcje użytkownika z MainTable
do jego rodzica poprzez zdarzenia . Może to wyglądać mniej więcej tak:
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) {
},
},
}),
Powyższe informacje powinny wystarczyć, aby zorientować się, co należy zrobić i zacząć rozwiązywać problem.
changeSetting
doMainTable
komponentu.