问题
[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
通过props传递数据,并MainTable
通过events向其父对象发送用户操作。它可能看起来像这样:
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
组件。