क्या पुर्जों में किसी घटक के प्रारंभिक डेटा को रीसेट करने का एक उचित तरीका है?


93

मेरे पास डेटा शुरू करने के विशिष्ट सेट के साथ एक घटक है:

data: function (){
    return {
        modalBodyDisplay: 'getUserInput', // possible values: 'getUserInput', 'confirmGeocodedValue'
        submitButtonText: 'Lookup', // possible values 'Lookup', 'Yes'
        addressToConfirm: null,
        bestViewedByTheseBounds: null,
        location:{
            name: null,
            address: null,
            position: null
        }
}

यह एक मोडल विंडो के लिए डेटा है, इसलिए जब यह दिखाता है कि मैं चाहता हूं कि यह इस डेटा के साथ शुरू हो। यदि उपयोगकर्ता खिड़की से रद्द करता है तो मैं इसके लिए सभी डेटा रीसेट करना चाहता हूं।

मुझे पता है कि मैं डेटा को रीसेट करने के लिए एक विधि बना सकता हूं और बस मैन्युअल रूप से सभी डेटा गुणों को उनके मूल में सेट कर सकता हूं:

reset: function (){
    this.modalBodyDisplay = 'getUserInput';
    this.submitButtonText = 'Lookup';
    this.addressToConfirm = null;
    this.bestViewedByTheseBounds = null;
    this.location = {
        name: null,
        address: null,
        position: null
    };
}

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

समाधान जो मैंने सोचा था कि प्रारंभिक डेटा गुणों को एक readyविधि में हथियाना होगा और फिर घटकों को रीसेट करने के लिए उस सहेजे गए डेटा का उपयोग करना होगा:

data: function (){
    return {
        modalBodyDisplay: 'getUserInput', 
        submitButtonText: 'Lookup', 
        addressToConfirm: null,
        bestViewedByTheseBounds: null,
        location:{
            name: null,
            address: null,
            position: null
        },
        // new property for holding the initial component configuration
        initialDataConfiguration: null
    }
},
ready: function (){
    // grabbing this here so that we can reset the data when we close the window.
    this.initialDataConfiguration = this.$data;
},
methods:{
    resetWindow: function (){
        // set the data for the component back to the original configuration
        this.$data = this.initialDataConfiguration;
    }
}

लेकिन initialDataConfigurationडेटा के साथ ऑब्जेक्ट बदल रहा है (जो समझ में आता है क्योंकि रीड मेथड में हमारे initialDataConfigurationडेटा फ़ंक्शन का दायरा बढ़ रहा है।

क्या गुंजाइश को विरासत में लिए बिना प्रारंभिक कॉन्फ़िगरेशन डेटा को हथियाने का एक तरीका है?

क्या मैं इसे खत्म कर रहा हूं और ऐसा करने का एक बेहतर / आसान तरीका है?

क्या प्रारंभिक डेटा को हार्डकोड करना एकमात्र विकल्प है?


क्या आप वी-शो या वी-इफ का उपयोग कर रहे हैं?
Rwd

मैं सीएसएस के लिए बूटस्ट्रैप का उपयोग कर रहा हूं, इसलिए मैं इसका उपयोग कर रहा हूं जो कि मोडल में बनाया गया है जो दिखाने और छिपाने के लिए jquery का लाभ उठाता है। तो अनिवार्य रूप से घटक का विंडो भाग हमेशा वहां होता है, बस छिपा हुआ होता है।
क्रिस स्मिट्ज़

जवाबों:


125
  1. घटक के बाहर एक फ़ंक्शन में प्रारंभिक डेटा निकालें
  2. घटक में प्रारंभिक डेटा सेट करने के लिए उस फ़ंक्शन का उपयोग करें
  3. जरूरत पड़ने पर राज्य को रीसेट करने के लिए उस फ़ंक्शन का फिर से उपयोग करें।

// outside of the component:
function initialState (){
  return {
    modalBodyDisplay: 'getUserInput', 
    submitButtonText: 'Lookup', 
    addressToConfirm: null,
    bestViewedByTheseBounds: null,
    location:{
      name: null,
      address: null,
      position: null
    }
  }
}

//inside of the component:
data: function (){
    return initialState();
} 


methods:{
    resetWindow: function (){
        Object.assign(this.$data, initialState());
    }
}


5
यही किया। धन्यवाद! मैंने उत्तर के लिए एक छोटा सा संपादन किया, लेकिन केवल इसलिए कि एक पुट घटक को केवल एक वस्तु के बजाय डेटा के लिए एक फ़ंक्शन की आवश्यकता होती है। आपके उत्तर की अवधारणा निश्चित रूप से काम करती है और सही है, संपादन केवल इस बात का ध्यान रखना है कि कैसे vuejs घटकों को संभालता है।
क्रिस Schmitz

3
आप डेटा प्रॉपर्टी के फंक्शन के बारे में सही हैं, यही कारण है कि मैं मैला था। संपादन के लिए धन्यवाद।
लाइनस बोर्ग

13
अब यह एक त्रुटि देता है:[Vue warn]: Avoid replacing instance root $data. Use nested data properties instead.
संकल्प सिंह

34
@SankalpSingha Vue 2.0 आपको अब ऐसा करने की अनुमति नहीं देता है। आप Object.assignइसके बजाय उपयोग कर सकते हैं । यहाँ काम कर कोड है: codepen.io/CodinCat/pen/ameraP?editors=1010
CodinCat

3
इस समस्या के लिए - [Vue चेतावनी]: उदाहरण के लिए रूट $ डेटा को बदलने से बचें। इसके बजाय नेस्टेड डेटा गुणों का उपयोग करें, इसे आज़माएं। $ data.propName = "new value";
स्टानिस्लाव ओस्टापेंको

33

dataवर्तमान घटक उदाहरण में घटक को रीसेट करने के लिए आप यह कोशिश कर सकते हैं:

Object.assign(this.$data, this.$options.data())

निजी तौर पर मेरे पास सार मोडल घटक है जो संवाद के विभिन्न भागों को भरने के लिए स्लॉट का उपयोग करता है। जब अनुकूलित मोडल उस सार मोडल को लपेटता है तो स्लॉट्स में संदर्भित डेटा मूल घटक दायरे से संबंधित होता है। यहां सार मोडल का विकल्प दिया गया है जो हर बार कस्टमाइज्ड मोडल (ES2015 कोड) दिखाया गया है।

watch: {
    show (value) { // this is prop's watch
      if(value) {
        Object.assign(this.$parent.$data, this.$parent.$options.data())
      }
    }
}

आप निश्चित रूप से अपने मॉडल के कार्यान्वयन को ठीक कर सकते हैं - ऊपर कुछ cancelहुक में भी निष्पादित किया जा सकता है ।

यह ध्यान रखें कि $parentबच्चे से विकल्पों के उत्परिवर्तन की सिफारिश नहीं की जाती है, हालांकि मुझे लगता है कि यह उचित हो सकता है यदि मूल घटक केवल अमूर्त मोडल को अनुकूलित कर रहा है और इससे अधिक कुछ नहीं।


1
यह तकनीक अब एक VueJS चेतावनी देती है; देखें stackoverflow.com/questions/40340561/…
किवी शापिरो

7
सावधानी, यह संदर्भ में नहीं बांधता है data। इसलिए यदि आप thisअपनी dataपद्धति का उपयोग कर रहे हैं, तो आप इस संदर्भ को लागू कर सकते हैं:Object.assign(this.$data, this.$options.data.apply(this))
Ifnot

इन तरीकों बनाम स्थान का लाभ क्या है (लोड)?
कार्लोस

30

सावधानी, Object.assign(this.$data, this.$options.data())संदर्भ को डेटा में बाँधती नहीं है ()।

तो इस का उपयोग करें:

Object.assign(this.$data, this.$options.data.apply(this))

cc यह उत्तर मूल रूप से यहाँ था


3

यदि आप चेतावनियों से परेशान हैं, तो यह एक अलग तरीका है:

const initialData = () => ({})

export default {
  data() {
    return initialData();
  },
  methods: {
    resetData(){
      const data = initialData()
      Object.keys(data).forEach(k => this[k] = data[k])
    }
  }
}

$ डेटा के साथ गड़बड़ करने की कोई जरूरत नहीं है।


2

मुझे एक बाल घटक के अंदर मूल स्थिति में डेटा रीसेट करना था, यही मेरे लिए काम करता है:

माता-पिता घटक, बुला बच्चे के घटक विधि:

     <button @click="$refs.childComponent.clearAllData()">Clear All</button >

     <child-component ref='childComponent></child-component>

बाल घटक:

  1. बाहरी फ़ंक्शन में डेटा को परिभाषित करना,
  2. फ़ंक्शन के बाहर और बाहर डेटा ऑब्जेक्ट असाइन करना
  3. ClearallData () विधि को परिभाषित करना जो मूल घटक द्वारा कॉल किया जाना है

    function initialState() {
       return { 
         someDataParameters : '',
         someMoreDataParameters: ''
              }
      }
    
    export default {
       data() {
        return initialState();
      },
        methods: {
      clearAllData() {
      Object.assign(this.$data, initialState());
    },
    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.