ปัญหา
[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];
}
}
});
สิ่งที่ต้องจำไว้คือคุณสมบัติและวิธีการอ้างอิงได้เฉพาะในขอบเขตที่กำหนดไว้เท่านั้น
ทุกอย่างในเทมเพลตพาเรนต์ถูกคอมไพล์ในขอบเขตหลัก ทุกอย่างในเทมเพลตลูกถูกรวบรวมไว้ในขอบเขตลูก
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับขอบเขตการรวบรวมส่วนประกอบในวูเอกสาร
ฉันจะทำอะไรได้บ้าง?
จนถึงขณะนี้มีการพูดคุยกันมากมายเกี่ยวกับการกำหนดสิ่งต่างๆในขอบเขตที่ถูกต้องดังนั้นการแก้ไขจึงเป็นเพียงการย้ายchangeSetting
คำจำกัดความไปยังMainTable
ส่วนประกอบ?
ดูเหมือนง่าย แต่นี่คือสิ่งที่ฉันแนะนำ
คุณอาจต้องการให้MainTable
ส่วนประกอบของคุณเป็นส่วนประกอบที่โง่ / นำเสนอ ( นี่คือสิ่งที่ต้องอ่านหากคุณไม่รู้ว่ามันคืออะไร แต่เป็น tl; dr คือส่วนประกอบมีหน้าที่เพียงแค่แสดงผลบางสิ่งเท่านั้น - ไม่มีตรรกะ) องค์ประกอบสมาร์ท / คอนเทนเนอร์มีหน้าที่รับผิดชอบตรรกะ - ในตัวอย่างที่ให้ไว้ในคำถามของคุณองค์ประกอบรากจะเป็นส่วนประกอบสมาร์ท / คอนเทนเนอร์ ด้วยสถาปัตยกรรมนี้คุณสามารถใช้วิธีการสื่อสารของผู้ปกครองและเด็กของ 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
ส่วนประกอบ