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>)
Der Fehler tritt auf, weil hier changeSettingin der MainTableKomponente auf die Methode verwiesen wird :
"<button @click='changeSetting(index)'> Info </button>" +
Die changeSettingMethode ist jedoch nicht in der MainTableKomponente definiert . Es wird hier in der Root-Komponente definiert:
var app = new Vue({
el: "#settings",
data: data,
methods: {
changeSetting: function(index) {
data.settingsSelected = data.settings[index];
}
}
});
Zu beachten ist, dass Eigenschaften und Methoden nur in dem Bereich referenziert werden können, in dem sie definiert sind.
Alles in der übergeordneten Vorlage wird im übergeordneten Bereich kompiliert. Alles in der untergeordneten Vorlage wird im untergeordneten Bereich kompiliert.
Weitere Informationen zum Kompilierungsbereich von Komponenten finden Sie in der Dokumentation von Vue .
Was kann ich tun?
Bisher wurde viel darüber gesprochen, Dinge im richtigen Bereich zu definieren, sodass die Korrektur nur darin besteht, die changeSettingDefinition in die MainTableKomponente zu verschieben.
Es scheint so einfach, aber hier ist, was ich empfehle.
Sie möchten wahrscheinlich, dass Ihre MainTableKomponente eine dumme / präsentative Komponente ist. ( Hier ist etwas zu lesen, wenn Sie nicht wissen, was es ist, aber ein tl; dr ist, dass die Komponente nur für das Rendern von etwas verantwortlich ist - keine Logik). Das Smart / Container-Element ist für die Logik verantwortlich. In dem in Ihrer Frage angegebenen Beispiel wäre die Stammkomponente die Smart / Container-Komponente. Mit dieser Architektur können Sie die Eltern-Kind-Kommunikationsmethoden von Vue verwenden, damit die Komponenten interagieren. Sie geben die Daten MainTableüber Requisiten weiter und senden Benutzeraktionen MainTableüber Ereignisse an das übergeordnete Element . Es könnte ungefähr so aussehen:
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) {
// Handle changeSetting
},
},
}),
Das oben Genannte sollte ausreichen, um Ihnen eine gute Vorstellung davon zu geben, was zu tun ist, und um die Lösung Ihres Problems zu starten.
changeSettingzurMainTableKomponente hinzufügen .