Problema
[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>)
El error se produce porque aquí changeSettingse hace referencia al método en el MainTablecomponente:
"<button @click='changeSetting(index)'> Info </button>" +
Sin embargo, el changeSettingmétodo no está definido en el MainTablecomponente. Aquí se define en el componente raíz:
var app = new Vue({
el: "#settings",
data: data,
methods: {
changeSetting: function(index) {
data.settingsSelected = data.settings[index];
}
}
});
Lo que debe recordarse es que las propiedades y los métodos solo pueden ser referenciados en el ámbito donde están definidos.
Todo en la plantilla principal se compila en el ámbito principal; todo en la plantilla secundaria se compila en el ámbito secundario.
Puede leer más sobre el alcance de la compilación de componentes en la documentación de Vue .
¿Qué puedo hacer al respecto?
Hasta ahora se ha hablado mucho sobre definir las cosas en el alcance correcto, por lo que la solución es solo mover la changeSettingdefinición al MainTablecomponente.
Parece así de simple, pero esto es lo que recomiendo.
Probablemente desee que su MainTablecomponente sea un componente tonto / de presentación. ( Aquí hay algo para leer si no sabe qué es, pero un tl; dr es que el componente es solo responsable de renderizar algo, sin lógica). El elemento inteligente / contenedor es responsable de la lógica; en el ejemplo dado en su pregunta, el componente raíz sería el componente inteligente / contenedor. Con esta arquitectura, puede utilizar los métodos de comunicación entre padres e hijos de Vue para que los componentes interactúen. Usted pasa los datos a MainTabletravés de accesorios y emite acciones de usuario desde MainTablesu padre a través de eventos . Podría verse algo como esto:
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) {
},
},
}),
Lo anterior debería ser suficiente para darle una buena idea de qué hacer y comenzar a resolver su problema.
changeSettingalMainTablecomponente.