2017-06-27 10 views
6

मेरे मूल vue घटक में मेरे पास user ऑब्जेक्ट है।VueJS पैरेंट डेटा को बदले बिना प्रोप संपादित करने का सही तरीका

अगर मैं एक आधार के रूप में एक बच्चे के घटक है कि उपयोगकर्ता वस्तु पारित:

<child :user="user"></child> 

और मेरे बच्चे घटक में मैं अद्यतन user.name, यह माता-पिता के साथ-साथ अपडेट कर दिया जाएगा।

मैं मूल घटक में मौजूद उपयोगकर्ता ऑब्जेक्ट में दिखाई देने वाले परिवर्तनों के बिना बाल घटक में उपयोगकर्ता ऑब्जेक्ट को संपादित करना चाहता हूं।

क्या ऑब्जेक्ट को क्लोन करने से इसे प्राप्त करने का कोई बेहतर तरीका है: JSON.parse(JSON.stringify(obj))?

उत्तर

11

आपको JSON ऑब्जेक्ट का उपयोग करने की आवश्यकता नहीं है।

const child = { 
    props:["user"], 
    data(){ 
    return { 
     localUser: Object.assign({}, this.user) 
    } 
    } 
} 

localUser उपयोग (या जो भी आप इसे कॉल करना चाहते हैं) अपने बच्चे के अंदर।

संपादित

मैं इस सवाल का एक बेला एक और जवाब के लिए बनाई गई संशोधित किया था इसके बाद के संस्करण की अवधारणा और @ user3743266 पूछा

मैं पकड़ के लिए इस के साथ अपने आप आ रहा हूँ प्रदर्शित करने के लिए, और मैं मुझे यह बहुत उपयोगी लगता है। आपका उदाहरण अच्छी तरह से काम करता है। बच्चे में, आपने डेटा में तत्व बनाया है जो प्रोप की प्रतिलिपि लेता है, और बच्चे प्रतिलिपि के साथ काम करता है। दिलचस्प और उपयोगी, लेकिन ... यह मुझे स्पष्ट नहीं है जब स्थानीय प्रति अभिभावक को संशोधित करता है तो स्थानीय प्रति अपडेट हो जाती है। मैंने आपके पहेली को संशोधित किया, v-ifs को हटा दिया ताकि सबकुछ दिखाई दे, और संपादन घटक को डुप्लिकेट कर रहा हो। यदि आप एक घटक में नाम संशोधित करते हैं, तो दूसरा अनाथ है और इसमें कोई परिवर्तन नहीं होता है?

वर्तमान घटक इस तरह दिखता है:

Vue.component('edit-user', { 
    template: ` 
    <div> 
    <input type="text" v-model="localUser.name"> 
    <button @click="$emit('save', localUser)">Save</button> 
    <button @click="$emit('cancel')">Cancel</button> 
    </div> 
    `, 
    props: ['user'], 
    data() { 
    return { 
     localUser: Object.assign({}, this.user) 
    } 
    } 
}) 

क्योंकि मैं उपयोग करने के लिए एक स्थानीय कॉपी उपयोगकर्ता की डिजाइन निर्णय लिया, @ user3743266 सही है, तो घटक अपने आप अपडेट नहीं किया गया है। संपत्तिuser अपडेट किया गया है, लेकिन localUser नहीं है। इस मामले में, यदि जब भी संपत्ति बदल जाती है तो आप स्वचालित रूप से स्थानीय डेटा अपडेट करना चाहते थे, आपको एक वॉचर की आवश्यकता होगी।

Vue.component('edit-user', { 
    template: ` 
    <div> 
    <input type="text" v-model="localUser.name"> 
    <button @click="$emit('save', localUser)">Save</button> 
    <button @click="$emit('cancel')">Cancel</button> 
    </div> 
    `, 
    props: ['user'], 
    data() { 
    return { 
     localUser: Object.assign({}, this.user) 
    } 
    }, 
    watch:{ 
    user(newUser){ 
     this.localUser = Object.assign({}, newUser) 
    } 
    } 
}) 

यहां अद्यतन fiddle है।

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

watch:{ 
    user(newUser){ 
     if (condition) 
     this.localUser = Object.assign({}, newUser) 
    } 
    } 

जैसा कि मैंने कहीं और कहा, कई बार जब आप वस्तुओं गुण परिवर्तनशील होने का लाभ लेने के लिए चाहते हो सकता है कर रहे हैं, लेकिन वहां भी इस तरह बार जहां अधिक नियंत्रण चाहते हो सकता है कर रहे हैं।

+0

@ user3743266 कुछ स्पष्टीकरण जोड़ा गया। – Bert

+1

बहुत अच्छा है। यह बहुत दिलचस्प रहा है धन्यवाद। वू मेरी दादी चट्टानों। मुझे लगता है कि इवान आप वास्तव में 30 रॉकेट वैज्ञानिकों की एक टीम है। – bbsimonbb

+1

क्या आप वाकई हैं? मैं यह धागा कहूंगा, और आपके उत्तर में बहुत मूल्य होगा। इस तरह के प्रश्न वू का उपयोग करने वाले हर किसी के लिए संभावित रूप से प्रासंगिक हैं। इसे छोड़ दो, और यह एक लंबा और आश्चर्यजनक जीवन हो सकता है। – bbsimonbb

0

According to this, बच्चे अपने माता-पिता के डेटा को "नहीं कर सकते" और "नहीं" चाहिए। लेकिन here आप देख सकते हैं कि यदि कोई माता-पिता किसी बच्चे को संपत्ति के रूप में कुछ प्रतिक्रियाशील डेटा पास करता है, तो यह पास-दर-संदर्भ है और माता-पिता बच्चे के परिवर्तन देखता है। शायद यही वह समय है जो आप अधिकतर समय चाहते हैं, नहीं? आप केवल उस डेटा को संशोधित कर रहे हैं जिसे अभिभावक ने स्पष्ट रूप से साझा किया है। यदि आप चाहते हैं कि बच्चे user की एक स्वतंत्र प्रतिलिपि प्राप्त करे, तो आप शायद JSON.parse (JSON.stringify()) के साथ ऐसा कर सकते हैं लेकिन सावधान रहें कि आप वू-इंजेक्शन गुणों को क्रमबद्ध कर देंगे। आप कब करेंगे याद रखें प्रोप प्रतिक्रियाशील हैं, इसलिए माता-पिता स्थानीय परिवर्तनों को मिटाकर किसी भी समय एक नया उपयोगकर्ता भेज सकते हैं?

शायद आपको हमें यह बताना होगा कि आप बच्चे को अपनी प्रतिलिपि क्यों लेना चाहते हैं? बच्चा अपनी प्रतिलिपि के साथ क्या करने जा रहा है? यदि बच्चे का उपयोगकर्ता कुछ व्यवस्थित तरीके से मूल उपयोगकर्ता से लिया गया है (सभी पाठ या कुछ को अपरकेस करना), गणना की गई गुणों पर एक नज़र डालें।

+1

यह नहीं है कि आप अधिकतर समय चाहते हैं, नहीं। यदि संपत्ति मूल्य बदलता है, तो स्थानीय डेटा * को * मिटाया नहीं जाएगा (जब तक कि आप इसे विशेष रूप से ऐसा करने के लिए सेट नहीं करते हैं)। बच्चे के परिवर्तनों में तुरंत बदलाव क्यों नहीं करना चाहिए * तत्काल * माता-पिता में प्रतिबिंबित । किसी के मामले को उनके परिवर्तनों को रद्द करना चाहते हैं पर विचार करें। यदि आप संपत्ति में पारित डेटा में परिवर्तन करते हैं, तो आपको उन सभी परिवर्तनों का समर्थन करने के लिए कुछ अतिरिक्त समाधान के साथ आना होगा। यदि आप पहली बार प्रतिलिपि बनाते हैं और जब आप डेटा उत्सर्जित करते हैं तो केवल माता-पिता में परिवर्तन करते हैं, तो आप किसी भी समय रद्द कर सकते हैं। – Bert

+0

आप कहते हैं कि डेटा मिटाया नहीं जाएगा, लेकिन यह वास्तव में मेरे [jsfiddle] (https://jsfiddle.net/bbsimonbb/32xoy9Lw/7/) में होता है यदि आप किसी संपत्ति के रूप में किसी बच्चे को प्रतिक्रियाशील डेटा पास करते हैं। माता-पिता और बच्चे सच्चाई का एक स्रोत साझा कर रहे हैं? आप अपने पूर्ववत परिदृश्य को कैसे कार्यान्वित करेंगे? – bbsimonbb

+0

मैंने कहा * डेटा *, डेटा गुणों के रूप में, संपत्ति खुद ही नहीं। मैंने आपके [fiddle] को अपडेट किया है (https://jsfiddle.net/32xoy9Lw/10/)। ध्यान दें कि अब, आप बच्चे में किए गए परिवर्तनों से आसानी से रद्द कर सकते हैं क्योंकि जब आप इरादा रखते हैं तो बच्चे केवल तभी उत्सर्जित करता है। यदि आपने सीधे उपयोगकर्ता संपत्ति संपादित की है और आप रद्द करना चाहते हैं, तो आपको मूल स्थिति को सहेजने और इसे पुनर्स्थापित करने जैसी कुछ करना होगा। मैं आपसे सहमत हूं कि यह * सुविधाजनक * है आप ऑब्जेक्ट और सरणी गुणों को म्यूट कर सकते हैं, लेकिन कम * रखरखाव * भी कर सकते हैं। जब आप किसी संपत्ति को बदलते हैं तो आपको सावधान रहना चाहिए। यह आपका डिफ़ॉल्ट नहीं होना चाहिए। – Bert

0

तुम सिर्फ जानकारी आप स्थानीय रूप से संपादन योग्य हो सकता है और इस तरह से आप यह जो डेटा आप संपादन कर रहे के स्पष्ट रखना बनाई गई विधि

data() { 
return { localUserData: {name: '', (...)} 
} 
(...) 
created() { 
    this.localUserData.name = this.user.name; 
} 

में मूल्य लोड करना चाहते हैं के साथ एक डेटा चर हो सकता है। आवश्यकता के आधार पर, यदि उपयोगकर्ता प्रोप बदलता है तो आप स्थानीय डेटा को अपडेट करने के लिए एक वॉचर रखना चाह सकते हैं।

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

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