मैंने डॉक्स पढ़ा, लेकिन मैं इसे समझ नहीं पाया। मुझे पता है कि डेटा, कंप्यूटेड, वॉच, मेथड्स क्या करते हैं लेकिन nextTick()
वुज़ू में इसका क्या उपयोग है?
मैंने डॉक्स पढ़ा, लेकिन मैं इसे समझ नहीं पाया। मुझे पता है कि डेटा, कंप्यूटेड, वॉच, मेथड्स क्या करते हैं लेकिन nextTick()
वुज़ू में इसका क्या उपयोग है?
जवाबों:
अगली बार आपको डेटा बदलने के बाद कुछ करने की अनुमति देता है और VueJS ने DOM को आपके डेटा परिवर्तन के आधार पर अपडेट किया है, लेकिन इससे पहले कि ब्राउज़र ने पेज पर उन बदलावों का प्रतिपादन किया है।
आम तौर पर, देवता समान व्यवहार को प्राप्त करने के लिए देशी जावास्क्रिप्ट फ़ंक्शन सेटटाइमआउट का उपयोग करते हैं। लेकिन, setTimeout
इससे पहले कि यह आपके कॉलबैक के माध्यम से आपको नियंत्रण वापस दे, ब्राउज़र पर नियंत्रण का उपयोग कर ।
मान लीजिए, आपने कुछ डेटा बदल दिए हैं। Vue डेटा के आधार पर DOM को अपडेट करता है। ध्यान रखें कि DOM परिवर्तन अभी तक ब्राउज़र द्वारा स्क्रीन पर रेंडर नहीं किए गए हैं। यदि आप उपयोग करते हैं nextTick
, तो आपका कॉलबैक अब कॉल किया जाता है। फिर, ब्राउज़र पृष्ठ को अपडेट करता है। यदि आप उपयोग करते हैं setTimeout
, तो आपका कॉलबैक केवल अब कॉल किया जाएगा।
आप निम्न की तरह एक छोटा घटक बनाकर इस व्यवहार की कल्पना कर सकते हैं:
<template>
<div class="hello">
{{ msg }}
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data() {
return {
msg: 'One'
}
},
mounted() {
this.msg = 'Two';
this.$nextTick(() => {
this.msg = 'Three';
});
}
}
</script>
अपना स्थानीय सर्वर चलाएं। आपको दिखाई देने वाला संदेश Three
दिखाई देगा।
अब, अपने के this.$nextTick
साथ बदलेंsetTimeout
setTimeout(() => {
this.msg = 'Three';
}, 0);
ब्राउज़र को पुनः लोड करें। तुम देखोगे Two
, देखने से पहले Three
।
इसे देखने के लिए इस फिडेल को देखें
ऐसा इसलिए, क्योंकि Vue ने DOM को अपडेट किया Two
, ब्राउज़र को कंट्रोल दिया। ब्राउज़र प्रदर्शित किया गया Two
। फिर, अपने कॉलबैक कहा जाता है। Vue ने DOM को अपडेट किया Three
। जिसे ब्राउज़र ने फिर से प्रदर्शित किया।
के साथ nextTick
। Vue ने DOM को udpated किया Two
। आपके कॉलबैक को कॉल किया। Vue ने DOM को अपडेट किया Three
। फिर ब्राउजर को कंट्रोल दिया। और, ब्राउज़र प्रदर्शित Three
।
आशा है कि यह स्पष्ट था।
यह समझने के लिए कि Vue इसे कैसे लागू करता है, आपको इवेंट लूप और माइक्रो - मास्क की अवधारणा को समझने की आवश्यकता है ।
एक बार जब आप उन अवधारणाओं को स्पष्ट (एर) कर लेते हैं, तो nextTick के लिए स्रोत कोड की जांच करें ।
this.name = 'foo'
उल्लेख कर रहे हैं : या क्या आप पृष्ठ में HTML तत्वों के इंजेक्शन का उल्लेख कर रहे हैं?
this.name = 'foo'
vue के माध्यम से डेटा सेट करते हैं तो टेम्पलेट और फ़ंक्शन के आधार पर डेटा में किए गए परिवर्तनों को प्रतिबिंबित करने के लिए दस्तावेज़ ऑब्जेक्ट मॉडल को अपडेट करता है।
सामग्री से लिया गया है द्वारा Adrià Fontcuberta
Vue प्रलेखन कहते हैं:
Vue.nextTick ([कॉलबैक, संदर्भ])
अगले DOM अपडेट चक्र के बाद निष्पादित किए जाने वाले कॉलबैक को हटाएं। DOM अपडेट के इंतजार के लिए कुछ डेटा बदलने के तुरंत बाद इसका उपयोग करें।
हम्म ..., अगर यह पहली बार में डराने वाला लगता है, तो चिंता न करें मैं इसे जितना संभव हो उतना सरल रूप में समझाने की कोशिश करूंगा। लेकिन पहले 2 चीजें हैं जो आपको पता होनी चाहिए:
इसका उपयोग असामान्य है। उन रजत जादू कार्डों में से एक की तरह। मैंने कई Vue
ऐप्स लिखे हैं और एक या दो बार अगली बार () में चला गया है।
एक बार कुछ वास्तविक उपयोग के मामलों को देखने के बाद यह समझना आसान है। आपके विचार प्राप्त करने के बाद, डर दूर हो जाएगा, और आपके बेल्ट के नीचे एक आसान उपकरण होगा।
चलो इसके लिए चलते हैं, फिर।
हम प्रोग्रामर हैं, हम नहीं हैं? हम अपने प्रिय विभाजन का उपयोग करेंगे और .nextTick()
बिट द्वारा विवरण का अनुवाद करने का प्रयास करने के लिए दृष्टिकोण को जीतेंगे। इसके साथ शुरू होता है:
कॉलबैक हटाएं
ठीक है, अब हम जानते हैं कि यह कॉलबैक स्वीकार करता है। तो यह इस तरह दिखता है:
Vue.nextTick(function () {
// do something cool
});
महान। यह कॉलबैक टाल दिया जाता है (यह इसी तरह मिलीनियल्स देरी से कहते हैं) जब तक…
अगले DOM अद्यतन चक्र।
ठीक है। हम जानते हैं कि Vue DOM अपडेट को एसिंक्रोनसली करता है । यह इन अद्यतनों को "संग्रहीत" रखने का एक तरीका है, जब तक कि उन्हें लागू करने की आवश्यकता न हो। यह अपडेट की एक कतार बनाता है और जरूरत पड़ने पर इसे फ्लश करता है। फिर, DOM "पैच" है और इसके नवीनतम संस्करण में अपडेट किया गया है।
क्या?
मुझे फिर से प्रयास करने दें: कल्पना करें कि आपका घटक वास्तव में आवश्यक है और स्मार्ट है जैसे this.potatoAmount = 3.
Vue घटक को फिर से प्रस्तुत नहीं करेगा (और इस प्रकार DOM) स्वचालित रूप से। यह आवश्यक संशोधन को कतारबद्ध करेगा। फिर, अगले "टिक" (एक घड़ी में) के रूप में, कतार को फ्लश किया जाता है, और अपडेट लागू किया जाता है। टाडा!
ठीक है! तो हम जानते हैं कि हम nextTick()
एक कॉलबैक फ़ंक्शन को पास करने के लिए उपयोग कर सकते हैं जो डेटा सेट होने के बाद निष्पादित किया जाता है और DOM ने अपडेट किया है।
जैसा कि मैंने पहले कहा था ... अक्सर ऐसा नहीं है। "डेटा प्रवाह" दृष्टिकोण, जो Vue, React, और Google से दूसरे को चलाता है, जिसका मैं उल्लेख नहीं करूंगा, यह अधिकांश समय अनावश्यक बनाता है। फिर भी, कभी-कभी हमें DOM में कुछ तत्वों के प्रकट / गायब होने / संशोधित होने की प्रतीक्षा करने की आवश्यकता होती है। यह तब होता है जब नेक्स्ट काम आता है।
DOM अपडेट के इंतजार के लिए कुछ डेटा बदलने के तुरंत बाद इसका उपयोग करें।
बिल्कुल सही! यह परिभाषा का अंतिम टुकड़ा है जो Vue डॉक्स ने हमें प्रदान किया है। हमारे कॉलबैक के अंदर, DOM को अपडेट किया गया है ताकि हम इसके "सबसे अपडेटेड" वर्जन के साथ इंटरैक्ट कर सकें।
इसे साबित करो
ठीक है ठीक है। कंसोल देखें, और आप देखेंगे कि हमारे डेटा का मूल्य अगली बार के कॉलबैक में अपडेट किया गया है:
const example = Vue.component('example', {
template: '<p>{{ message }}</p>',
data: function () {
return {
message: 'not updated'
}
},
mounted () {
this.message = 'updated'
console.log(
'outside nextTick callback:', this.$el.textContent
) // => 'not updated'
this.$nextTick(() => {
console.log(
'inside nextTick callback:', this.$el.textContent
) // => 'not updated'
})
}
})
new Vue({
el: '#app',
render: h => h(example)
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.10/vue.js"></script>
<div id="app"></div>
एक उपयोग मामला
आइए इसके लिए कुछ उपयोगी उपयोग के मामले को परिभाषित करने का प्रयास करें nextTick
।
कल्पना करें कि एक घटक के माउंट होने पर आपको कुछ कार्रवाई करने की आवश्यकता है। परंतु! घटक ही नहीं। आपको तब तक प्रतीक्षा करने की भी आवश्यकता है जब तक कि उसके सभी बच्चे डोम में आरोहित और उपलब्ध न हो जाएं। अरे नहीं! हमारे घुड़सवार हुक की गारंटी नहीं है कि पूरे घटक पेड़ प्रदान करता है।
यदि केवल हमारे पास अगले DOM अपडेट चक्र की प्रतीक्षा करने के लिए एक उपकरण था ...
hahaa:
mounted() {
this.$nextTick(() => {
// The whole view is rendered, so I can safely access or query
// the DOM. ¯\_(ツ)_/¯
})
}
संक्षेप में
इसलिए: nextTick
डेटा सेट होने के बाद किसी फ़ंक्शन को निष्पादित करने का एक आरामदायक तरीका है, और DOM को अपडेट किया गया है।
आपको DOM की प्रतीक्षा करने की आवश्यकता है, हो सकता है क्योंकि आपको कुछ परिवर्तन करने की आवश्यकता है या आपको इसके सामान को लोड करने के लिए किसी बाहरी लाइब्रेरी की प्रतीक्षा करने की आवश्यकता है? इसके बाद नेक्स्ट यूज करें।
कुछ लोग अपने यूनिट परीक्षणों में नेक्स्टटीक का भी इस्तेमाल करते हैं ताकि यह सुनिश्चित हो सके कि डेटा अपडेट किया गया है। इस तरह, वे घटक के "अद्यतन संस्करण" का परीक्षण कर सकते हैं।
Vue.nextTick () या vm। $ NextTick ()?
चिंता मत करो। दोनों (लगभग) समान हैं। एक उदाहरण विधि है Vue.nextTick()
, जबकि वैश्विक एपीआई विधि को संदर्भित करता है vm.$nextTick()
। एकमात्र अंतर यह है कि vm.$nextTick
एक संदर्भ को दूसरे पैरामीटर के रूप में स्वीकार नहीं किया जाता है। यह हमेशा this
(उदाहरण के रूप में भी जाना जाता है) के लिए बाध्य है ।
ठंडक का एक आखिरी टुकड़ा
ध्यान दें कि nextTick
एक रिटर्न देता है Promise
, इसलिए हम पूर्ण-कूल के साथ जा सकते हैं async/await
और उदाहरण में सुधार कर सकते हैं :
async mounted () {
this.message = 'updated'
console.log(this.$el.textContent) // 'not updated'
await this.$nextTick()
console.log(this.$el.textContent) // 'updated'
}
अगला टिक मूल रूप से आपको कुछ कोड चलाने की अनुमति देता है, क्योंकि जब आपने रिएक्टिव प्रॉपर्टी (डेटा) में कुछ बदलाव किए हैं, तब वाउ ने घटक को फिर से प्रदान किया है।
// modify data
vm.msg = 'Hello'
// DOM not updated yet
Vue.nextTick(function () {
// this function is called when vue has re-rendered the component.
})
// usage as a promise (2.1.0+, see note below)
Vue.nextTick()
.then(function () {
// this function is called when vue has re-rendered the component.
})
Vue.js प्रलेखन से:
अगले DOM अपडेट चक्र के बाद निष्पादित किए जाने वाले कॉलबैक को हटाएं। DOM अपडेट के इंतजार के लिए कुछ डेटा बदलने के तुरंत बाद इसका उपयोग करें।
इसके बारे में और अधिक पढ़ें, यहाँ ।
अगले और सेटटाउट का उपयोग करने के बीच के अंतर के बारे में प्राणशात का उत्तर देने के लिए, और अधिक स्पष्ट, मैंने उनकी पहेली को यहाँ छोड़ दिया है
mounted() {
this.one = "One";
setTimeout(() => {
this.two = "Two"
}, 0);
//this.$nextTick(()=>{
//this.two = "Two"
//})}
आप फ़िडेल में देख सकते हैं कि जब सेटटाइम ओट का उपयोग किया जाता है, तो परिवर्तन को स्वीकार करने से पहले घटक माउंट हो जाने पर प्रारंभिक डेटा बहुत संक्षेप में चमकता है। जबकि नेक्स्टटीक का उपयोग करते समय, ब्राउजर को रेंडर करने से पहले डेटा को हाईजैक कर लिया जाता है, बदल दिया जाता है। इसलिए, ब्राउज़र पुराने के किसी भी ज्ञान के बिना अपडेट किए गए डेटा को दिखाता है। आशा है कि एक झपट्टा में दो अवधारणाओं को साफ करता है।
nextTick
। यहां दस्तावेज दिया गया है ।