VueJs 2.0 में भाई घटकों के बीच संचार


112

अवलोकन

Vue.js 2.x में, पदावनतmodel.sync किया जाएगा ।

तो, Vue.js 2.x में भाई के घटकों के बीच संवाद करने का एक उचित तरीका क्या है ?


पृष्ठभूमि

जैसा कि मैं Vue 2.x को समझता हूं, भाई-बहन के संचार के लिए पसंदीदा तरीका एक स्टोर या एक इवेंट बस का उपयोग करना है

इवान के अनुसार (Vue के निर्माता):

यह भी ध्यान देने योग्य है कि "घटकों के बीच डेटा पास करना" आम तौर पर एक बुरा विचार है, क्योंकि अंत में डेटा प्रवाह अनुपयोगी हो जाता है और डीबग करना बहुत कठिन है।

यदि डेटा के एक टुकड़े को कई घटकों द्वारा साझा किया जाना है, तो वैश्विक स्टोर या Vuex को प्राथमिकता दें

[ चर्चा से जुड़ा ]

तथा:

.onceऔर .syncपदावनत हो जाते हैं। प्रॉप्स अब हमेशा वन-वे डाउन होते हैं। पैरेंट स्कोप में साइड इफेक्ट्स का उत्पादन करने के लिए, एक घटक emitको अंतर्निहित बंधन पर निर्भर होने के बजाय स्पष्ट रूप से एक घटना की आवश्यकता होती है ।

तो, इवान का उपयोग करने का सुझाव देता है$emit() और $on()


चिंताओं

मुझे क्या चिंता है:

  • प्रत्येक storeऔर eventएक वैश्विक दृश्यता (मुझे ठीक कर लें मैं गलत हूँ) है;
  • प्रत्येक छोटे संचार के लिए एक नया स्टोर बनाना बहुत ही बेकार है;

मैं जो चाहता हूं, वह भाई-बहन के घटकों के लिए कुछ गुंजाइश events या storesदृश्यता है। (या शायद मुझे उपरोक्त विचार समझ में नहीं आया।)


सवाल

तो, सिबलिंग घटकों के बीच संवाद करने का सही तरीका क्या है?


2
$emitv-modelअनुकरण करने के लिए संयुक्त .sync। मुझे लगता है कि आपको Vuex रास्ता जाना चाहिए
एल्टनकामामी

3
इसलिए मैंने उसी चिंता पर विचार किया है। मेरा समाधान एक प्रसारण चैनल के साथ एक इवेंट एमिटर का उपयोग करना है जो 'स्कोप' के बराबर है - यानी एक बच्चा / माता-पिता और भाई-बहन सेटअप संवाद करने के लिए उसी चैनल का उपयोग करते हैं। मेरे मामले में, मैं रेडियो लाइब्रेरी Radio.uxder.com का उपयोग करता हूं क्योंकि यह कोड और इसकी बुलेटप्रूफ की कुछ पंक्तियां है, लेकिन कई नोड EventEmitter का चयन करेंगे।
Tremendus Apps

जवाबों:


83

Vue 2.0 के साथ, मैं इवेंटहब तंत्र का उपयोग कर रहा हूं जैसा कि प्रलेखन में दिखाया गया है ।

  1. केंद्रीयकृत इवेंट हब को परिभाषित करें।

    const eventHub = new Vue() // Single event hub
    
    // Distribute to components using global mixin
    Vue.mixin({
        data: function () {
            return {
                eventHub: eventHub
            }
        }
    })
  2. अब आपके कंपोनेंट में आप ईवेंट को छोड़ सकते हैं

    this.eventHub.$emit('update', data)
  3. और आपको सुनने के लिए

    this.eventHub.$on('update', data => {
    // do your thing
    })

अद्यतन @alex द्वारा उत्तर को देखें , जो एक सरल समाधान का वर्णन करता है।


3
बस एक सिर: ग्लोबल मिक्सिन्स पर नज़र रखें, और जब भी संभव हो, उनसे बचने की कोशिश करें, जैसा कि इस लिंक vuejs.org/v2/guide/mixins.html#Global-Mixin के अनुसार वे तीसरे पक्ष के घटकों को भी प्रभावित कर सकते हैं।
विनी.ग्रे।

6
एक बहुत ही सरल समाधान का उपयोग करना है जो @Alex ने वर्णित किया है - this.$root.$emit()औरthis.$root.$on()
वेबनेट

5
भविष्य के संदर्भ के लिए, कृपया अपने उत्तर को किसी और के उत्तर के साथ अपडेट न करें (भले ही आपको लगता है कि यह बेहतर है और आप इसे संदर्भित करते हैं)। वैकल्पिक उत्तर से लिंक करें, या यहां तक ​​कि ओपी से दूसरे को स्वीकार करने के लिए कहें यदि आपको लगता है कि उन्हें चाहिए - लेकिन उनके जवाब को अपने आप में कॉपी करना बुरा रूप है और उपयोगकर्ताओं को क्रेडिट देने से हतोत्साहित करता है जहां यह कारण है, क्योंकि वे केवल आपके उत्थान को ही रोक सकते हैं केवल उत्तर दें। उन्हें प्रोत्साहित करने के लिए नेविगेट करने के लिए (और इस तरह upvote) आपके द्वारा उस उत्तर को शामिल न करके जो उत्तर आप संदर्भित कर रहे हैं।
ग्रेडॉक्स

4
मूल्यवान प्रतिक्रिया @GrayedFox के लिए धन्यवाद, तदनुसार मेरे उत्तर को अपडेट किया।
काकोनी

2
कृपया ध्यान दें कि यह समाधान अब Vue 3 में समर्थित नहीं होगा। देखें stackoverflow.com/a/60895076/752916
एलेक्सा

145

आप इसे छोटा भी कर सकते हैं और रूट Vue उदाहरण को ग्लोबल इवेंट हब के रूप में उपयोग कर सकते हैं :

घटक 1:

this.$root.$emit('eventing', data);

घटक 2:

mounted() {
    this.$root.$on('eventing', data => {
        console.log(data);
    });
}

2
यह एक अतिरिक्त ईवेंट हब को परिभाषित करने और किसी भी ईवेंट-उपभोक्ता के साथ संलग्न करने से बेहतर काम करता है।
स्कैड

2
मैं इस समाधान का एक बड़ा प्रशंसक हूं क्योंकि मुझे वास्तव में गुंजाइश होने वाली घटनाएं पसंद नहीं हैं। हालाँकि, मैं हर दिन VueJS के साथ नहीं हूँ इसलिए मुझे उत्सुकता है अगर वहाँ कोई है जो इस दृष्टिकोण के साथ मुद्दों को देखता है।
वेबनेट

2
सभी उत्तरों का सबसे सरल समाधान
विकाश गुप्ता

1
अच्छा, छोटा और लागू करने में आसान, समझने में आसान
nada

1
यदि आप केवल विशेष रूप से प्रत्यक्ष भाई-बहन चाहते हैं, तो $ मूल के बजाय $ माता-पिता का उपयोग करें
मलकेव

47

संचार प्रकार

Vue एप्लिकेशन (या वास्तव में, किसी भी घटक आधारित अनुप्रयोग) को डिज़ाइन करते समय, विभिन्न संचार प्रकार होते हैं जो इस बात पर निर्भर करते हैं कि हम किन चिंताओं से निपट रहे हैं और उनके अपने संचार चैनल हैं।

व्यावसायिक तर्क: आपके ऐप और उसके लक्ष्य के लिए विशिष्ट सभी चीज़ों को संदर्भित करता है।

प्रस्तुति तर्क: कुछ भी जो उपयोगकर्ता के साथ बातचीत करता है या उपयोगकर्ता से बातचीत के परिणामस्वरूप होता है।

ये दो चिंताएं इस प्रकार के संचार से संबंधित हैं:

  • अनुप्रयोग स्थिति
  • अभिभावक-बच्चे
  • बाल-माता-पिता
  • एक माँ की संताने

प्रत्येक प्रकार को सही संचार चैनल का उपयोग करना चाहिए।


संचार कढ़ी

एक चैनल एक ढीला शब्द है जिसका उपयोग मैं एक Vue ऐप के आसपास डेटा का आदान-प्रदान करने के लिए ठोस कार्यान्वयन का उल्लेख करने के लिए करूंगा।

सहारा: अभिभावक-बाल प्रस्तुति तर्क

प्रत्यक्ष अभिभावक-बाल संचार के लिए Vue में सबसे सरल संचार चैनल । यह ज्यादातर प्रस्तुति तर्क से संबंधित डेटा को पारित करने के लिए या पदानुक्रम के नीचे डेटा के एक प्रतिबंधित सेट के लिए उपयोग किया जाना चाहिए।

संदर्भ और तरीके: प्रस्तुति विरोधी पैटर्न

जब एक बच्चे को माता-पिता से एक घटना को संभालने के लिए एक प्रोप का उपयोग करने का कोई मतलब नहीं है, तो बच्चे के घटक को स्थापित करना refऔर उसके तरीकों को कॉल करना ठीक है।

ऐसा मत करो, यह एक विरोधी पैटर्न है। अपने घटक आर्किटेक्चर और डेटा प्रवाह पर पुनर्विचार करें। यदि आप स्वयं को माता-पिता से एक बच्चे के घटक पर एक विधि को कॉल करना चाहते हैं, तो संभवतया यह समय है कि वह राज्य को ऊपर उठाएं या यहां वर्णित अन्य तरीकों पर विचार करें।

घटनाएँ: बाल-अभिभावक प्रस्तुति तर्क

$emitऔर $on। प्रत्यक्ष बाल-अभिभावक संचार के लिए सबसे सरल संचार चैनल। पुन: प्रस्तुति तर्क के लिए उपयोग की जानी चाहिए।

घटना बस

अधिकांश उत्तर ईवेंट बस के लिए अच्छे विकल्प देते हैं, जो दूर के घटकों या वास्तव में कुछ भी उपलब्ध संचार चैनलों में से एक है।

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

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

निम्नलिखित दर्शाता है कि कैसे एक साधारण गलती एक रिसाव की ओर ले जाती है जहां Itemघटक अभी भी ट्रिगर होता है भले ही डोम से हटा दिया गया हो।

destroyedजीवन चक्र हुक में श्रोताओं को हटाने के लिए याद रखें ।

केंद्रीकृत स्टोर (व्यावसायिक तर्क)

Vuex राज्य प्रबंधन के लिए Vue के साथ जाने का तरीका है । यह केवल घटनाओं की तुलना में बहुत अधिक प्रदान करता है और यह पूर्ण पैमाने पर अनुप्रयोग के लिए तैयार है।

और अब आप पूछते हैं :

[S] क्या मैं प्रत्येक छोटी संचार के लिए vuex का स्टोर बनाता हूं?

यह वास्तव में चमकता है जब:

  • अपने व्यापार तर्क से निपटने,
  • बैकएंड के साथ संचार (या किसी भी डेटा दृढ़ता परत, स्थानीय भंडारण की तरह)

इसलिए आपके घटक वास्तव में उन चीज़ों पर ध्यान केंद्रित कर सकते हैं, जो उपयोगकर्ता इंटरफेस को प्रबंधित करने के लिए हैं।

इसका मतलब यह नहीं है कि आप इसे घटक तर्क के लिए उपयोग नहीं कर सकते हैं, लेकिन मैं उस तर्क को केवल आवश्यक वैश्विक UI स्थिति के साथ एक नामांकित Vuex मॉड्यूल के लिए गुंजाइश दूँगा।

वैश्विक राज्य में सब कुछ की एक बड़ी गड़बड़ी से निपटने के लिए, स्टोर को कई नामांकित मॉड्यूल में अलग किया जाना चाहिए।


घटक प्रकार

इन सभी संचारों को ऑर्केस्ट्रा करने और पुन: प्रयोज्य को आसान बनाने के लिए, हमें घटकों को दो अलग-अलग प्रकारों के बारे में सोचना चाहिए।

  • ऐप विशिष्ट कंटेनर
  • जेनेरिक घटक

फिर, इसका मतलब यह नहीं है कि एक जेनेरिक घटक का पुन: उपयोग किया जाना चाहिए या यह कि ऐप विशिष्ट कंटेनर का पुन: उपयोग नहीं किया जा सकता है, लेकिन उनकी अलग-अलग ज़िम्मेदारियाँ हैं।

ऐप विशिष्ट कंटेनर

ये केवल सरल Vue घटक हैं जो अन्य Vue घटकों (जेनेरिक या अन्य ऐप विशिष्ट कंटेनरों) को लपेटते हैं। यह वह जगह है जहां Vuex स्टोर संचार होना चाहिए और इस कंटेनर को अन्य सरल साधनों जैसे प्रॉप्स और ईवेंट श्रोताओं के माध्यम से संवाद करना चाहिए।

इन कंटेनरों में मूल डोम तत्व भी नहीं हो सकते हैं और जेनेरिक घटकों को टेंपलेटिंग और उपयोगकर्ता इंटरैक्शन से निपटने देते हैं।

गुंजाइश किसी भी तरह eventsया storesभाई बहन घटकों के लिए दृश्यता

यह वह जगह है जहाँ स्कूपिंग होता है। अधिकांश घटकों की दुकान के बारे में पता नहीं है और इस घटक (अधिकतर) एक का उपयोग दुकान मॉड्यूल के एक सीमित सेट के साथ namespaced चाहिए gettersऔर actionsप्रदान की साथ लागू Vuex बाध्यकारी सहायकों

जेनेरिक घटक

इन्हें प्रॉपर से अपना डेटा प्राप्त करना चाहिए, अपने स्वयं के स्थानीय डेटा में परिवर्तन करना चाहिए और सरल घटनाओं का उत्सर्जन करना चाहिए। अधिकांश समय, उन्हें पता नहीं होना चाहिए कि एक Vuex स्टोर बिल्कुल मौजूद है।

उन्हें कंटेनर भी कहा जा सकता है क्योंकि उनकी एकमात्र जिम्मेदारी अन्य UI घटकों को भेजने की हो सकती है।


सहोदर संचार

तो, इस सब के बाद, हमें दो भाई घटकों के बीच कैसे संवाद करना चाहिए?

एक उदाहरण के साथ समझना आसान है: कहते हैं कि हमारे पास एक इनपुट बॉक्स है और इसका डेटा ऐप (पेड़ के विभिन्न स्थानों पर भाई-बहनों) के साथ साझा किया जाना चाहिए और बैकएंड के साथ जारी रहना चाहिए।

सबसे खराब स्थिति के साथ शुरू , हमारे घटक प्रस्तुति और व्यापार तर्क मिश्रण होगा ।

// MyInput.vue
<template>
    <div class="my-input">
        <label>Data</label>
        <input type="text"
            :value="value" 
            :input="onChange($event.target.value)">
    </div>
</template>
<script>
    import axios from 'axios';

    export default {
        data() {
            return {
                value: "",
            };
        },
        mounted() {
            this.$root.$on('sync', data => {
                this.value = data.myServerValue;
            });
        },
        methods: {
            onChange(value) {
                this.value = value;
                axios.post('http://example.com/api/update', {
                        myServerValue: value
                    })
                    .then((response) => {
                        this.$root.$emit('update', response.data);
                    });
            }
        }
    }
</script>

इन दोनों चिंताओं को अलग करने के लिए, हमें अपने कंपोनेंट को एक ऐप स्पेसिफिक कंटेनर में लपेटना चाहिए और प्रेजेंटेशन लॉजिक को अपने जेनेरिक इनपुट कंपोनेंट में रखना चाहिए।

हमारे इनपुट घटक अब पुन: प्रयोज्य है और बैकएंड और भाई-बहनों के बारे में नहीं जानते हैं।

// MyInput.vue
// the template is the same as above
<script>
    export default {
        props: {
            initial: {
                type: String,
                default: ""
            }
        },
        data() {
            return {
                value: this.initial,
            };
        },
        methods: {
            onChange(value) {
                this.value = value;
                this.$emit('change', value);
            }
        }
    }
</script>

हमारा ऐप विशिष्ट कंटेनर अब व्यावसायिक तर्क और प्रस्तुति संचार के बीच का सेतु हो सकता है।

// MyAppCard.vue
<template>
    <div class="container">
        <card-body>
            <my-input :initial="serverValue" @change="updateState"></my-input>
            <my-input :initial="otherValue" @change="updateState"></my-input>

        </card-body>
        <card-footer>
            <my-button :disabled="!serverValue || !otherValue"
                       @click="saveState"></my-button>
        </card-footer>
    </div>
</template>
<script>
    import { mapGetters, mapActions } from 'vuex';
    import { NS, ACTIONS, GETTERS } from '@/store/modules/api';
    import { MyButton, MyInput } from './components';

    export default {
        components: {
            MyInput,
            MyButton,
        },
        computed: mapGetters(NS, [
            GETTERS.serverValue,
            GETTERS.otherValue,
        ]),
        methods: mapActions(NS, [
            ACTIONS.updateState,
            ACTIONS.updateState,
        ])
    }
</script>

चूंकि Vuex स्टोर की कार्रवाइयां बैकएंड संचार से संबंधित हैं, इसलिए हमारे कंटेनर को यहां axios और बैकएंड के बारे में जानने की आवश्यकता नहीं है।


3
तरीकों के बारे में टिप्पणी के साथ सहमत " एक ही युग्मन कि सहारा का उपयोग कर "
ghybs

मुझे यह उत्तर पसंद है। लेकिन क्या आप कृपया ईवेंट बस और "सावधान रहें:" पर ध्यान दें? शायद आप कुछ उदाहरण दे सकते हैं, मुझे समझ नहीं आता कि कैसे घटकों को दो बार बाँधा जा सकता है।
vandroid

उदाहरण स्वरूप सत्यापन के लिए आप मूल घटक और भव्य बाल घटक के बीच कैसे संवाद करते हैं। जहां मूल घटक पृष्ठ है, बच्चा रूप है, और भव्य बच्चा इनपुट फॉर्म तत्व है?
लॉर्ड ज़ेड

1
@vandroid मैंने एक सरल उदाहरण बनाया है जो एक लीक दिखाता है जब श्रोताओं को ठीक से नहीं हटाया जाता है, जैसे कि इस धागे में हर उदाहरण।
एमिल बर्जरॉन

@ लॉर्डजेड यह वास्तव में निर्भर करता है, लेकिन आपकी स्थिति की मेरी समझ से, यह एक डिजाइन समस्या की तरह दिखता है। Vue का उपयोग ज्यादातर प्रस्तुति तर्क के लिए किया जाना चाहिए। फॉर्म सत्यापन को वैनिला जेएस एपीआई इंटरफेस की तरह कहीं और किया जाना चाहिए, कि फॉर्म से डेटा के साथ एक वीएक्सएक्स कार्रवाई होगी।
एमिल बर्जरॉन

10

ठीक है, हम v-onघटनाओं का उपयोग करके माता-पिता के माध्यम से भाई-बहनों के बीच संवाद कर सकते हैं।

Parent
 |-List of items //sibling 1 - "List"
 |-Details of selected item //sibling 2 - "Details"

मान लें कि Detailsजब हम कुछ तत्व पर क्लिक करते हैं तो हम अपडेट घटक चाहते हैं List


में Parent:

टेम्पलेट:

<list v-model="listModel"
      v-on:select-item="setSelectedItem" 
></list> 
<details v-model="selectedModel"></details>

यहाँ:

  • v-on:select-itemयह एक घटना है, जिसे Listघटक में कहा जाएगा (नीचे देखें);
  • setSelectedItemयह Parentअद्यतन करने के लिए एक विधि है selectedModel;

जे एस:

//...
data () {
  return {
    listModel: ['a', 'b']
    selectedModel: null
  }
},
methods: {
  setSelectedItem (item) {
    this.selectedModel = item //here we change the Detail's model
  },
}
//...

में List:

टेम्पलेट:

<ul>
  <li v-for="i in list" 
      :value="i"
      @click="select(i, $event)">
        <span v-text="i"></span>
  </li>
</ul>

जे एस:

//...
data () {
  return {
    selected: null
  }
},
props: {
  list: {
    type: Array,
    required: true
  }
},
methods: {
  select (item) {
    this.selected = item
    this.$emit('select-item', item) // here we call the event we waiting for in "Parent"
  },
}
//...

यहाँ:

  • this.$emit('select-item', item)select-itemसीधे माता-पिता में आइटम भेजेंगे । और माता-पिता इसे Detailsदृश्य में भेज देंगे

5

मैं आमतौर पर क्या करता हूं अगर मैं वीयू में संचार के सामान्य पैटर्न को "हैक" करना चाहता हूं, विशेष रूप से अब जो कि .syncपदावनत है, एक सरल ईवेंटइमेटर बनाना है जो घटकों के बीच संचार को संभालता है। मेरी नवीनतम परियोजनाओं में से एक से:

import {EventEmitter} from 'events'

var Transmitter = Object.assign({}, EventEmitter.prototype, { /* ... */ })

इस Transmitterऑब्जेक्ट के साथ आप तब किसी भी घटक में कर सकते हैं:

import Transmitter from './Transmitter'

var ComponentOne = Vue.extend({
  methods: {
    transmit: Transmitter.emit('update')
  }
})

और एक "प्राप्त" घटक बनाने के लिए:

import Transmitter from './Transmitter'

var ComponentTwo = Vue.extend({
  ready: function () {
    Transmitter.on('update', this.doThingOnUpdate)
  }
})

फिर, यह वास्तव में विशिष्ट उपयोगों के लिए है। इस पैटर्न पर अपने पूरे एप्लिकेशन को आधार न बनाएं, Vuexइसके बजाय कुछ का उपयोग करें ।


1
मैं पहले से ही उपयोग कर रहा हूं vuex, लेकिन फिर से, क्या मुझे प्रत्येक छोटे संचार के लिए vuex का स्टोर बनाना चाहिए?
सर्गेई पैनफिलोव

इस जानकारी के साथ मेरे लिए यह कहना कठिन है, लेकिन मैं कहूंगा कि यदि आप पहले से ही vuexहां का उपयोग कर रहे हैं , तो इसके लिए जाएं। इसका इस्तेमाल करें।
हेक्टर लोरेंजो

1
वास्तव में मैं असहमत हूं कि हमें प्रत्येक छोटे संचार के लिए vuex का उपयोग करने की आवश्यकता है ...
विक्टर

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

3

भाई-बहनों के बीच संचार को कैसे संभालना है, यह स्थिति पर निर्भर करता है। लेकिन पहले मैं इस बात पर जोर देना चाहता हूं कि वैश्विक घटना बस दृष्टिकोण 3 में दूर जा रहा है । यह देखो RFC को । इसलिए मैंने एक नया उत्तर लिखने का फैसला किया।

न्यूनतम सामान्य पूर्वज पैटर्न (या "LCA")

सरल मामलों के लिए, मैं सबसे कम सामान्य पूर्वज पैटर्न ("डेटा डाउन, ईवेंट अप" के रूप में भी जाना जाता है) का उपयोग करने की दृढ़ता से सलाह देता हूं। इस पैटर्न को पढ़ना, लागू करना, परीक्षण करना और डीबग करना आसान है।

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

एक ई-मेल एप्लिकेशन में, एक आकस्मिक उदाहरण के लिए, यदि "संदेश शरीर" घटक के साथ बातचीत करने के लिए "टू" घटक की आवश्यकता होती है, तो उस इंटरैक्शन की स्थिति उनके माता-पिता (शायद एक घटक नामक email-form) में रह सकती है। आपके पास email-formतथाकथित में एक प्रोप हो सकता है addresseeताकि संदेश का शरीर स्वचालित रूप से प्रीपेंड हो सकेDear {{addressee.name}} रिसीवर के ईमेल पते के आधार पर से ईमेल को प्रस्तुत कर सके।

यदि संचार को बहुत सारे बिचौलियों के घटकों के साथ लंबी दूरी की यात्रा करनी पड़ती है तो एलसीए महत्वपूर्ण हो जाता है। मैं अक्सर इस उत्कृष्ट ब्लॉग पोस्ट के लिए अपने सहयोगियों का उल्लेख करता हूं । (इस तथ्य पर ध्यान न दें कि इसके उदाहरण एम्बर का उपयोग करते हैं; इसके विचार कई यूआई फ्रेमवर्क में लागू होते हैं।)

डेटा कंटेनर पैटर्न (जैसे, Vuex)

जटिल मामलों या स्थितियों के लिए जहां माता-पिता के संचार में बहुत से बिचौलिए शामिल होंगे, वेक्स या समकक्ष डेटा कंटेनर तकनीक का उपयोग करें। उपयुक्त होने पर, नामांकित मॉड्यूल का उपयोग करें ।

उदाहरण के लिए, कई इंटरकनेक्ट वाले घटकों के एक जटिल संग्रह के लिए एक अलग नामस्थान बनाने के लिए उचित हो सकता है, जैसे कि पूरी तरह से चित्रित कैलेंडर घटक।

प्रकाशित करें / सदस्यता लें (ईवेंट बस) पैटर्न

यदि इवेंट बस (या "प्रकाशित / सदस्यता") पैटर्न आपकी आवश्यकताओं के लिए अधिक उपयुक्त है, तो Vue कोर टीम अब थर्ड पार्टी लाइब्रेरी जैसे मिट का उपयोग करने की सिफारिश करती है । (पैराग्राफ 1 में संदर्भित RFC देखें)

बोनस रैंबलिंग और कोड

यहाँ खेल -अजीब तिल के माध्यम से सचित्र-से-सिबल संचार के लिए न्यूनतम आम पूर्वज समाधान का मूल उदाहरण दिया गया है।

एक भोले दृष्टिकोण सोचने के लिए हो सकता है, "तिल 1 को तिल 2 को प्रकट होने के बाद उसे अजीब होना चाहिए"। लेकिन Vue इस तरह के दृष्टिकोण को हतोत्साहित करता है, क्योंकि यह चाहता है कि हम पेड़ संरचनाओं के बारे में सोचें ।

यह बहुत अच्छी बात है। एक गैर-तुच्छ ऐप जहां डोम पेड़ों पर सीधे एक-दूसरे से संवाद करते हैं, कुछ प्रकार की लेखा प्रणाली के बिना डिबग करना बहुत मुश्किल होगा (जैसे कि वुएक्स प्रदान करता है)। उसके शीर्ष पर, "नीचे डेटा, ईवेंट्स अप" का उपयोग करने वाले घटक कम युग्मन और उच्च पुन: प्रयोज्य प्रदर्शित करते हैं - दोनों उच्च वांछनीय लक्षण हैं जो बड़े एप्लिकेशन पैमाने पर मदद करते हैं।

इस उदाहरण में, जब एक तिल को चकमा दिया जाता है, तो यह एक घटना का उत्सर्जन करता है। गेम मैनेजर घटक यह तय करता है कि ऐप की नई स्थिति क्या है, और इस प्रकार सिबलिंग तिल जानता है कि Vue फिर से प्रस्तुत करने के बाद क्या करना है। यह कुछ हद तक तुच्छ "सबसे कम सामान्य पूर्वज" उदाहरण है।

Vue.component('whack-a-mole', {
  data() {
    return {
      stateOfMoles: [true, false, false],
      points: 0
    }
  },
  template: `<div>WHACK - A - MOLE!<br/>
    <a-mole :has-mole="stateOfMoles[0]" v-on:moleMashed="moleClicked(0)"/>
    <a-mole :has-mole="stateOfMoles[1]"  v-on:moleMashed="moleClicked(1)"/>
    <a-mole :has-mole="stateOfMoles[2]" v-on:moleMashed="moleClicked(2)"/>
    <p>Score: {{points}}</p>
</div>`,
  methods: {
    moleClicked(n) {
      if(this.stateOfMoles[n]) {
         this.points++;
         this.stateOfMoles[n] = false;
         this.stateOfMoles[Math.floor(Math.random() * 3)] = true;
      }   
    }
  }
})

Vue.component('a-mole', {
  props: ['hasMole'],
  template: `<button @click="$emit('moleMashed')">
      <span class="mole-button" v-if="hasMole">🐿</span><span class="mole-button" v-if="!hasMole">🕳</span>
    </button>`
})

var app = new Vue({
  el: '#app',
  data() {
    return { name: 'Vue' }
  }
})
.mole-button {
  font-size: 2em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <whack-a-mole />
</div>

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