Vấn đề
[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>)
Lỗi xảy ra vì changeSetting
phương thức đang được tham chiếu trong MainTable
thành phần ở đây:
"<button @click='changeSetting(index)'> Info </button>" +
Tuy nhiên changeSetting
phương thức không được xác định trong MainTable
thành phần. Nó đang được định nghĩa trong thành phần gốc ở đây:
var app = new Vue({
el: "#settings",
data: data,
methods: {
changeSetting: function(index) {
data.settingsSelected = data.settings[index];
}
}
});
Điều cần nhớ là các thuộc tính và phương thức chỉ có thể được tham chiếu trong phạm vi mà chúng được định nghĩa.
Mọi thứ trong khuôn mẫu cha được biên dịch trong phạm vi cha; mọi thứ trong mẫu con được biên dịch trong phạm vi con.
Bạn có thể đọc thêm về phạm vi biên dịch thành phần trong tài liệu của Vue .
Tôi có thể làm gì với nó?
Từ trước đến nay có rất nhiều người nói về việc xác định mọi thứ trong phạm vi chính xác nên cách khắc phục chỉ là chuyển changeSetting
định nghĩa vào MainTable
thành phần?
Nó có vẻ đơn giản nhưng đây là những gì tôi đề xuất.
Bạn có thể muốn MainTable
thành phần của mình là một thành phần câm / trình bày. ( Đây là một cái gì đó để đọc nếu bạn không biết nó là gì ngoài một tl; dr là thành phần chỉ chịu trách nhiệm hiển thị một cái gì đó - không có logic). Phần tử thông minh / container chịu trách nhiệm về logic - trong ví dụ được đưa ra trong câu hỏi của bạn, thành phần gốc sẽ là thành phần thông minh / container. Với kiến trúc này, bạn có thể sử dụng các phương thức giao tiếp cha-con của Vue để các thành phần tương tác. Bạn chuyển dữ liệu cho MainTable
thông qua đạo cụ và gửi các hành động của người dùng từ MainTable
cho cha mẹ của nó thông qua các sự kiện . Nó có thể trông giống như sau:
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) {
},
},
}),
Trên đây là đủ để cung cấp cho bạn ý tưởng tốt về những gì cần làm và bắt đầu giải quyết vấn đề của bạn.
changeSetting
vàoMainTable
thành phần.