Проблема
[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>)
Помилка виникає, оскільки на changeSetting
метод посилається MainTable
тут компонент:
"<button @click='changeSetting(index)'> Info </button>" +
Однак changeSetting
метод не визначений у MainTable
компоненті. Це визначається в кореневому компоненті тут:
var app = new Vue({
el: "#settings",
data: data,
methods: {
changeSetting: function(index) {
data.settingsSelected = data.settings[index];
}
}
});
Потрібно пам’ятати, що на властивості та методи можна посилатися лише в тій області, де вони визначені.
Все в батьківському шаблоні компілюється у батьківському полі; все у дочірньому шаблоні компілюється у дочірній області.
Ви можете прочитати більше про сферу компіляції компонентів у документації Vue .
Що я можу з цим зробити?
До цього часу було багато розмов про те, щоб визначити речі в правильній області, тому виправлення полягає лише в тому, щоб перенести changeSetting
визначення в MainTable
компонент?
Здається, це просто, але ось що я рекомендую.
Можливо, ви хотіли б, щоб ваш MainTable
компонент був німим / презентаційним компонентом. ( Ось щось потрібно прочитати, якщо ви не знаєте, що це таке, але tl; dr полягає в тому, що компонент просто відповідає за рендеринг чогось - ніякої логіки). Елемент smart / container відповідає за логіку - у прикладі, наведеному у вашому запитанні, кореневим компонентом буде компонент smart / container. За допомогою цієї архітектури ви можете використовувати методи взаємодії батьків-дочірніх компаній Vue для взаємодії компонентів. Ви передаєте дані про MainTable
через реквізит і випускаєте дії користувача від MainTable
свого батька через події . Це може виглядати приблизно так:
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) {
},
},
}),
Вищезазначеного має бути достатньо, щоб дати вам гарне уявлення про те, що робити, і почати вирішення вашої проблеми.
changeSetting
доMainTable
компонента.