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í changeSetting
se hace referencia al método en el MainTable
componente:
"<button @click='changeSetting(index)'> Info </button>" +
Sin embargo, el changeSetting
método no está definido en el MainTable
componente. 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 changeSetting
definición al MainTable
componente.
Parece así de simple, pero esto es lo que recomiendo.
Probablemente desee que su MainTable
componente 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 MainTable
través de accesorios y emite acciones de usuario desde MainTable
su 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.
changeSetting
alMainTable
componente.