मुसीबत
[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; ड्र है कि घटक सिर्फ कुछ का प्रतिपादन करने के लिए जिम्मेदार है - कोई तर्क नहीं)। स्मार्ट / कंटेनर तत्व तर्क के लिए जिम्मेदार है - आपके प्रश्न में दिए गए उदाहरण में रूट घटक स्मार्ट / कंटेनर घटक होगा। इस आर्किटेक्चर के साथ आप बातचीत करने के लिए पुए के माता-पिता-बाल संचार विधियों का उपयोग कर सकते हैं। आप प्रॉप्स के 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
।