2017-01-11 11 views
6

मैं एक घटक बनाना चाहता था जो माउस छवि पर होने पर टेक्स्ट-बॉक्स प्राप्त करता है।VueJS v-if = array [index] काम नहीं कर रहा है

नीचे HTML टेम्पलेट है।

<section class="item-container" v-for="(item, index) in items"> 
    <div class="image-box" @mouseenter="changeStatus(index)"> 
    <img class="image" src="item.link" alt> 
    </div> 
    <div class="text-box" @mouseleave="changeStatus(index)" v-if="show[index]"> 
    <h4>{{ item.name }}</h4> 
    <p>{{ item.content }}</p> 
    </div> 
</section> 

और नीचे app.js

new Vue({ 
    el: '#app', 
    data: { 
    show: [false, false, false], 
    items: [ 
     { 
     name: 'Author 1', 
     content: 'Content 1' 
     }, 
     { 
     name: 'Author 2', 
     content: 'Content 2' 
     }, 
     { 
     name: 'Author 3', 
     content: 'Content 3' 
     } 
    ] 
    }, 
    methods: { 
    changeStatus: function(index) { 
     this.show[index] = !this.show[index]; 
     console.log(this.show); 
     console.log(this.show[index]); // console gets it as expected 
    } 
    } 
}); 

जब मैं कोड ऊपर निष्पादित, मैं प्राप्त कर सकते हैं कि इस शो संपत्ति बदल गया है। हालांकि, वी-अगर अपडेट नहीं किया गया है। क्या हम v-if के लिए सरणी [अनुक्रमणिका] का उपयोग नहीं कर सकते हैं या इसके लिए कोई अन्य कारण है?

+0

क्या आप अलग 'शो' सरणी के बजाय प्रत्येक 'आइटम' पर बुलियन मान रखने का विरोध कर रहे हैं? – mrogers

उत्तर

11

समस्या v-if के बारे में नहीं है, ऐसा इसलिए है क्योंकि वू सीधे सरणी तत्व के परिवर्तनों का पता नहीं लगा सकता है, यह जावास्क्रिप्ट की सीमा में से एक है।

इस प्रकार, Vue कुछ सहायक कार्यों इस के लिए, की तरह Vue.set

बदलें इस this.show[index] = !this.show[index]

Vue.set(this.show, index, !this.show[index])

को तो यह काम करना चाहिए प्रदान करता है।

Vue.set एकमात्र समाधान नहीं है, यदि आप जानना चाहते हैं तो इसे पूरा करने के कई तरीके हैं।

आप जावास्क्रिप्ट सरणी के मूल तरीकों का उपयोग कर सकते हैं, वू इन विधियों पर हुक करेगा ताकि यह परिवर्तनों का पता लगा सके।

यहाँ सरणी पूरी तरह से बदलने के लिए है .splice

this.show.splice(index, 1, !this.show[index])

एक और तरीका है के उपयोग के उदाहरण है। आप ES6 का उपयोग कर रहे हैं, तो आप आसानी से सरणी क्लोन करने के लिए प्रसार ऑपरेटर का उपयोग कर सकते हैं: क्योंकि यह एक नई सरणी

this.show = this.show.map((el, i) => 
    i === index ? !el : el 
) 
+0

यह साफ है, और मैं अभी भी आपके द्वारा सूचीबद्ध अन्य समाधानों को देख रहा हूं लेकिन .. vue.set काम नहीं करता है। - उदाहरण: https://jsfiddle.net/qnq2munr/1/ –

+0

@ robertotomás आप वू 1.0 का उपयोग कर रहे हैं, टेम्पलेट वाक्यविन्यास में कुछ अंतर हैं। विकास के दौरान minified जेएस का भी उपयोग न करें, या आप त्रुटि संदेश नहीं देख सकते हैं। – CodinCat

+1

मैंने कोड अपडेट किया (Vue 2.0 का उपयोग करें) https://jsfiddle.net/qnq2munr/2/ – CodinCat

0

आप एक जे एस वस्तु का उपयोग कर सकते रिटर्न

this.show[index] = !this.show[index] 
this.show = [...this.show] 

.map भी काम करेंगेसरणी के बजाय और एक ही प्रभाव प्राप्त करें। दूसरे शब्दों में, show: [false, false, false],show: {0:false, 1:false, 2:false}, के साथ प्रतिस्थापित करें।

संबंधित मुद्दे