NextTick क्या है या यह VueJs में क्या करता है


107

मैंने डॉक्स पढ़ा, लेकिन मैं इसे समझ नहीं पाया। मुझे पता है कि डेटा, कंप्यूटेड, वॉच, मेथड्स क्या करते हैं लेकिन nextTick()वुज़ू में इसका क्या उपयोग है?


18
समझने के लिए महत्वपूर्ण अवधारणा यह है कि DOM को एसिंक्रोनस रूप से अपडेट किया गया है । जब आप Vue में कोई मान बदलते हैं, तो परिवर्तन तुरंत DOM को प्रदान नहीं किया जाता है। इसके बजाय, Vue एक DOM अपडेट को कॉपी करता है और फिर, टाइमर पर, DOM को अपडेट करता है। आम तौर पर, यह इतनी तेज़ी से होता है कि इससे कोई फ़र्क नहीं पड़ता है, लेकिन, कई बार, आपको Vue के रेंडर करने के बाद प्रदान किए गए DOM को अपडेट करना होगा, जिसे आप तुरंत एक विधि में नहीं कर सकते क्योंकि अपडेट नहीं हुआ है अभी तक। उन मामलों में, आप उपयोग करेंगे nextTickयहां दस्तावेज दिया गया है
बर्थ

ऊपर दिए गए https://Backoverflow.com/q/47634258/9979046 में @Bert ने जो कहा है , उसे लागू करते हुए, NextTick () यूनिट टेस्ट में इस्तेमाल किया जाएगा, जब आपको यह जांचने की आवश्यकता है कि क्या DOM (HTML) में कोई तत्व मौजूद है, उदाहरण के लिए, अगर आपको Axios रिक्वेस्ट पर कुछ जानकारी मिलती है।
ऑस्कर एलेंकर

जवाबों:


141

अगली बार आपको डेटा बदलने के बाद कुछ करने की अनुमति देता है और 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 के लिए स्रोत कोड की जांच करें ।


4
एक बात मुझे समझ में नहीं आती है जब आप कहते हैं, "डेटा को अपडेट करें" क्या आप पूर्व के साथ किए गए अपडेट का this.name = 'foo'उल्लेख कर रहे हैं : या क्या आप पृष्ठ में HTML तत्वों के इंजेक्शन का उल्लेख कर रहे हैं?
हिदर

मैं इस प्रश्न के इतिहास में कहीं भी नहीं देखता, जहाँ वह कहता है कि "डेटा को अपडेट करता है" ... वह कहता है कि "डेटा के आधार पर Vue अपडेट डोम"। जिसका अर्थ है कि जब आप this.name = 'foo'vue के माध्यम से डेटा सेट करते हैं तो टेम्पलेट और फ़ंक्शन के आधार पर डेटा में किए गए परिवर्तनों को प्रतिबिंबित करने के लिए दस्तावेज़ ऑब्जेक्ट मॉडल को अपडेट करता है।
ADJenks

24

सामग्री से लिया गया है द्वारा Adrià Fontcuberta

Vue प्रलेखन कहते हैं:

Vue.nextTick ([कॉलबैक, संदर्भ])

अगले DOM अपडेट चक्र के बाद निष्पादित किए जाने वाले कॉलबैक को हटाएं। DOM अपडेट के इंतजार के लिए कुछ डेटा बदलने के तुरंत बाद इसका उपयोग करें।

हम्म ..., अगर यह पहली बार में डराने वाला लगता है, तो चिंता न करें मैं इसे जितना संभव हो उतना सरल रूप में समझाने की कोशिश करूंगा। लेकिन पहले 2 चीजें हैं जो आपको पता होनी चाहिए:

  1. इसका उपयोग असामान्य है। उन रजत जादू कार्डों में से एक की तरह। मैंने कई Vueऐप्स लिखे हैं और एक या दो बार अगली बार () में चला गया है।

  2. एक बार कुछ वास्तविक उपयोग के मामलों को देखने के बाद यह समझना आसान है। आपके विचार प्राप्त करने के बाद, डर दूर हो जाएगा, और आपके बेल्ट के नीचे एक आसान उपकरण होगा।

चलो इसके लिए चलते हैं, फिर।

$ नेक्स्ट को समझना

हम प्रोग्रामर हैं, हम नहीं हैं? हम अपने प्रिय विभाजन का उपयोग करेंगे और .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'
}

2
बस "आपके" स्पष्टीकरण के शीर्ष पर मूल लेखक और लिंक जोड़ें।
रेनन सिडले

1
क्या अद्भुत व्याख्या है! आपके समय और प्रयास के लिए बहुत बहुत धन्यवाद।
मूआथ अलहदाद

16

अगला टिक मूल रूप से आपको कुछ कोड चलाने की अनुमति देता है, क्योंकि जब आपने रिएक्टिव प्रॉपर्टी (डेटा) में कुछ बदलाव किए हैं, तब वाउ ने घटक को फिर से प्रदान किया है।

// 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 अपडेट के इंतजार के लिए कुछ डेटा बदलने के तुरंत बाद इसका उपयोग करें।

इसके बारे में और अधिक पढ़ें, यहाँ


2
इसे कैसे अपडेट करें? यह वही है जो मैं नहीं करता हूं। अगर मैं vm.msg को अपडेट करता हूं, तो डोम पहले से ही अपडेट है क्योंकि एक नया टेक्स्ट '' हैलो 'है .. तो मैं इसे फिर से कैसे अपडेट कर सकता हूं? क्या आप एक उदाहरण के साथ
एफडेल

ठीक है, मैं उत्तर को संपादित करूँगा और इसे आगे समझाने की कोशिश करूँगा।
दक्ष मिगलानी

जब आप कई अपडेट्स करते हैं, तो आप इसे स्थितियों में उपयोग कर सकते हैं, लेकिन आप स्पष्ट रूप से अलग-अलग डोम साइकल पर एक-दूसरे को प्रस्तुत करना चाहते हैं
दक्ष मिगलानी

यह आपको प्रति से अधिक DOM अपडेट करने की अनुमति देने के लिए नहीं है, लेकिन इसके द्वारा कुछ भी करने के लिए (जैसा कि यह अपडेट है, इसके बारे में जानकारी पढ़ें, आदि) Vue द्वारा किए गए परिवर्तनों से प्रभावित / संशोधित होने के बाद (क्योंकि आपने एक प्रतिक्रियाशील संपत्ति मान को बदल दिया है) , आदि)।
zenw0lf

यह सरल बनाने के लिए एक उदाहरण था।
दक्ष मिगलानी

7

अगले और सेटटाउट का उपयोग करने के बीच के अंतर के बारे में प्राणशात का उत्तर देने के लिए, और अधिक स्पष्ट, मैंने उनकी पहेली को यहाँ छोड़ दिया है

mounted() {    
  this.one = "One";
 
  setTimeout(() => {
    this.two = "Two"
  }, 0);
  
  //this.$nextTick(()=>{
  //this.two = "Two"
  //})}

आप फ़िडेल में देख सकते हैं कि जब सेटटाइम ओट का उपयोग किया जाता है, तो परिवर्तन को स्वीकार करने से पहले घटक माउंट हो जाने पर प्रारंभिक डेटा बहुत संक्षेप में चमकता है। जबकि नेक्स्टटीक का उपयोग करते समय, ब्राउजर को रेंडर करने से पहले डेटा को हाईजैक कर लिया जाता है, बदल दिया जाता है। इसलिए, ब्राउज़र पुराने के किसी भी ज्ञान के बिना अपडेट किए गए डेटा को दिखाता है। आशा है कि एक झपट्टा में दो अवधारणाओं को साफ करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.