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 changeSetting
in der MainTable
Komponente auf die Methode verwiesen wird :
"<button @click='changeSetting(index)'> Info </button>" +
Die changeSetting
Methode ist jedoch nicht in der MainTable
Komponente 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 changeSetting
Definition in die MainTable
Komponente zu verschieben.
Es scheint so einfach, aber hier ist, was ich empfehle.
Sie möchten wahrscheinlich, dass Ihre MainTable
Komponente 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.
changeSetting
zurMainTable
Komponente hinzufügen .