var MainTable = Vue.extend({
template: "<ul>" +
"<li v-for='(set,index) in settings'>" +
"{{index}}) " +
"{{set.title}}" +
"<button @click='changeSetting(index)'> Info </button>" +
"</li>" +
"</ul>",
data: function() {
return data;
}
});
Vue.component("main-table", MainTable);
data.settingsSelected = {};
var app = new Vue({
el: "#settings",
data: data,
methods: {
changeSetting: function(index) {
data.settingsSelected = data.settings[index];
}
}
});
使用上面的代码,单击按钮时会出现以下错误。
[Vue warn]:属性或方法"changeSetting"未在实例上定义,但在渲染期间引用。
<MainTable>
)
答案
问题
[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];
}
}
});
需要记住的是,属性和方法只能在它们定义的范围内引用。
Everything in the parent template is compiled in parent scope; everything in the child template is compiled in child scope.
您可以在 Vue 中阅读有关组件编译范围的更多信息文档。
我能做什么呢?
到目前为止,已经有很多关于在正确范围内定义事物的讨论,因此解决方法只是移动changeSetting
定义为MainTable
成分?
看起来很简单,但这就是我的推荐。
你可能想要你的MainTable
组件成为哑/演示组件。 这里如果您不知道它是什么,那么可以阅读它,但是 tl;dr 是组件只负责渲染某些内容 - 没有逻辑)。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) {
// Handle changeSetting
},
},
}),
上述内容应该足以让您很好地了解该怎么做并开始解决您的问题。