Problème
[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>)
L'erreur se produit parce que le changeSetting
est référencée dans la méthode MainTable
composant ici :
"<button @click='changeSetting(index)'> Info </button>" +
Toutefois, le changeSetting
n'est pas définie dans la méthode MainTable
composant. Il est défini ici dans le composant Root :
var app = new Vue({
el: "#settings",
data: data,
methods: {
changeSetting: function(index) {
data.settingsSelected = data.settings[index];
}
}
});
Ce qu'il faut retenir, c'est que les propriétés et les méthodes ne peuvent être référencées que dans la portée où elles sont définies.
Tout ce qui se trouve dans le modèle parent est compilé dans la portée parent ; tout ce qui se trouve dans le modèle enfant est compilé dans la portée enfant.
Vous pouvez en savoir plus sur la portée de la compilation des composants dans le manuel de Vue. documentation .
Qu'est-ce que je peux faire ?
Jusqu'à présent, il a été beaucoup question de définir les choses dans le bon champ d'application. changeSetting
dans le MainTable
composant ?
Cela semble si simple, mais voici ce que je recommande.
Vous voudriez probablement que votre MainTable
pour être un composant muet/de présentation. ( Ici est à lire si vous ne savez pas ce que c'est, mais en résumé, le composant est juste responsable du rendu - pas de logique). L'élément smart/container est responsable de la logique - dans l'exemple donné dans votre question, le composant Root serait le composant smart/container. Avec cette architecture, vous pouvez utiliser les méthodes de communication parent-enfant de Vue pour faire interagir les composants. Vous transmettez les données pour MainTable
via accessoires et émettent des actions utilisateur à partir de MainTable
à son parent via événements . Cela pourrait ressembler à quelque chose comme ceci :
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
},
},
}),
Ce qui précède devrait suffire à vous donner une bonne idée de ce qu'il faut faire et à lancer la résolution de votre problème.
0 votes
Votre composant n'a pas accès aux méthodes définies sur votre Vue. Vous devez ajouter la méthode
changeSetting
à laMainTable
composant.