ভ্যুজেস ২.০ তে ভাইবোন উপাদানগুলির মধ্যে যোগাযোগ


112

সংক্ষিপ্ত বিবরণ

Vue.js 2.x সালে model.syncকরা হবে অবচিত

সুতরাং, Vue.js 2.x এর ভাইবোন উপাদানগুলির মধ্যে যোগাযোগের উপযুক্ত উপায় কী?


পটভূমি

আমি ভ্যু ২.x বুঝতে পারছি, ভাইবোন যোগাযোগের জন্য পছন্দসই পদ্ধতি হ'ল একটি স্টোর বা ইভেন্টের বাস ব্যবহার করা

ইভানের মতে (ভ্যু স্রষ্টা):

এটি "উপাদানগুলির মধ্যে ডেটা পাস করার" উল্লেখ করাও সাধারণত একটি খারাপ ধারণা, কারণ শেষ পর্যন্ত ডেটা প্রবাহটি অনিয়ন্ত্রিত এবং ডিবাগ করা খুব শক্ত হয়ে যায়।

যদি এক টুকরো ডেটা একাধিক উপাদান দ্বারা ভাগ করা প্রয়োজন, গ্লোবাল স্টোর বা ভুেক্স পছন্দ করুন ।

[ আলোচনার লিঙ্ক ]

এবং:

.onceএবং .syncহ্রাস করা হয়। প্রপস এখন সর্বদা একমুখী। প্যারেন্ট স্কোপে পার্শ্ব প্রতিক্রিয়া তৈরি করতে, কোনও উপাদানকে স্পষ্টভাবে emitএকটি ইভেন্টের আবদ্ধ বাঁধাইয়ের উপর নির্ভর করার পরিবর্তে কোনও ইভেন্টের প্রয়োজন ।

সুতরাং, ইভান এবং ব্যবহারের পরামর্শ দেয়$emit()$on()


উদ্বেগ

যা আমাকে চিন্তিত তা হ'ল:

  • প্রতিটি storeএবং eventএকটি বিশ্ব দৃশ্যমানতা আছে (আমি ভুল হলে আমাকে সংশোধন করুন);
  • প্রতিটি ছোটখাট যোগাযোগের জন্য একটি নতুন স্টোর তৈরি করা খুব অপব্যয়;

আমি যা চাই তা হল ভাইবোনের উপাদানগুলির জন্য কিছু সুযোগ events বা storesদৃশ্যমানতা। (অথবা সম্ভবত আমি উপরের ধারণাটি বুঝতে পারি নি))


প্রশ্ন

সুতরাং, ভাইবোন উপাদানগুলির মধ্যে যোগাযোগের সঠিক উপায় কী?


2
$emitসঙ্গে v-modelঅনুকরণ করা .sync। আমার মনে হয় আপনার ভিউক্স পথে যাওয়া উচিত
এলটোনকামি

3
তাই আমি একই উদ্বেগ বিবেচনা করেছি। আমার সমাধান হ'ল একটি সম্প্রচার চ্যানেলের সাথে ইভেন্ট ইমিটার ব্যবহার করা যা 'স্কোপ' এর সমতুল্য - যেমন একটি শিশু / পিতামাতা এবং ভাইবোন সেটআপ যোগাযোগের জন্য একই চ্যানেলটি ব্যবহার করে। আমার ক্ষেত্রে, আমি রেডিও লাইব্রেরি Radio.uxder.com ব্যবহার করি কারণ এটি কয়েকটি কোডের লাইন এবং এর বুলেটপ্রুফ তৈরি করে, তবে অনেকে নোড ইভেন্টইমিটারটি বেছে নেবে।
ট্রেনডাস অ্যাপস

উত্তর:


83

ভ্যু ২.০ সহ, আমি ডকুমেন্টেশনে প্রদর্শিত হিসাবে ইভেন্ট হাব প্রক্রিয়াটি ব্যবহার করছি ।

  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# গ্লোবাল- মিক্সিন তারা তৃতীয় পক্ষের সংশ্লেষগুলিকেও প্রভাবিত করতে পারে।
ভিনি.g.fer

6
@ অ্যালেক্স বর্ণিত - this.$root.$emit()এবংthis.$root.$on()
ওয়েবনেট

5
ভবিষ্যতের রেফারেন্সের জন্য, দয়া করে আপনার উত্তর কারওর উত্তর দিয়ে আপডেট করবেন না (এমনকি যদি আপনি এটি ভাল বলে মনে করেন এবং আপনি এটি উল্লেখ করেন)। বিকল্প উত্তরের সাথে লিংক করুন, বা এমনকি আপনার যদি মনে হয় ওপিকে অন্যটি গ্রহণ করতে বলুন - তবে তাদের উত্তরটি নিজের নিজের মধ্যে অনুলিপি করা খারাপ ফর্ম এবং ব্যবহারকারীরা যেখানে যথাযথভাবে creditণ প্রদান থেকে নিরুৎসাহিত করে, কারণ তারা কেবলমাত্র আপনার আপগ্রেট করতে পারে শুধুমাত্র উত্তর। আপনি যে উত্তরটি উল্লেখ করছেন সেটিকে নিজের নিজের মধ্যে না অন্তর্ভুক্ত করে (এবং এইভাবে আপগেট করুন) নেভিগেট করতে তাদের উত্সাহিত করুন।
গ্রেডফক্স

4
@ গ্রেডফক্স মূল্যবান প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ, সেই অনুসারে আমার উত্তর আপডেট করেছেন।
কাকনি

2
দয়া করে মনে রাখবেন এই সমাধান আর Vue 3. দেখুন সমর্থিত হবে না stackoverflow.com/a/60895076/752916
AlexMA

145

আপনি এটি আরও সংক্ষিপ্ত করে তুলতে পারেন এবং গ্লোবাল ইভেন্ট হাব হিসাবে মূল Vue উদাহরণটি ব্যবহার করতে পারেন :

উপাদান 1:

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

উপাদান 2:

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

2
এটি একটি ইভেন্ট ইভেন্ট হাব সংজ্ঞা দেওয়ার এবং এটি কোনও ইভেন্ট-গ্রাহকের সাথে সংযুক্ত করার চেয়ে ভাল কাজ করে।
স্ক্যাড

2
আমি এই সমাধানটির একটি বড় অনুরাগী কারণ সত্য ঘটনা ইভেন্টের সুযোগ আমার পছন্দ নয়। যাইহোক, আমি প্রতিদিন ভ্যুজেএস এর সাথে থাকি না তাই আমি যদি জানতে আগ্রহী যে কেউ যদি এই পদ্ধতির সাথে সমস্যাগুলি দেখে।
ওয়েবনেট

2
সমস্ত উত্তরের সহজ সমাধান
বিকাশ গুপ্ত

1
সুন্দর, সংক্ষিপ্ত এবং প্রয়োগ করা সহজ, পাশাপাশি সহজে বোঝা
nada

1
আপনি যদি কেবল একচেটিয়াভাবে সরাসরি ভাইবোনদের যোগাযোগ করতে চান তবে $ মূলের পরিবর্তে $ পিতামাতার ব্যবহার করুন
মলকভ

47

যোগাযোগের ধরণ

কোনও ভ্যু অ্যাপ্লিকেশন ডিজাইন করার সময় (বা বাস্তবে যে কোনও উপাদান ভিত্তিক অ্যাপ্লিকেশন) ডিজাইন করার সময়, বিভিন্ন যোগাযোগের ধরণ রয়েছে যা নির্ভর করে আমরা কোন উদ্বেগ নিয়ে কাজ করছি এবং সেগুলির নিজস্ব যোগাযোগ চ্যানেল রয়েছে।

ব্যবসায়িক যুক্তি: আপনার অ্যাপ্লিকেশন এবং এর লক্ষ্য সম্পর্কিত সুনির্দিষ্ট সবকিছুকে বোঝায়।

উপস্থাপনা যুক্তি: ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করে এমন কিছু বা ব্যবহারকারীর ইন্টারঅ্যাকশন থেকে ফলাফল।

এই দুটি উদ্বেগ এই ধরণের যোগাযোগের সাথে সম্পর্কিত:

  • আবেদনের অবস্থা
  • মূল সন্তান
  • শিশুদের জন্য পিতা বা মাতা
  • ভাইবোন

প্রতিটি ধরণের সঠিক যোগাযোগের চ্যানেল ব্যবহার করা উচিত।


যোগাযোগ মাধ্যম

একটি চ্যানেলটি একটি শিথিল শব্দ যা আমি কোনও ভ্যু অ্যাপের চারপাশে ডেটা বিনিময় করতে কংক্রিট বাস্তবায়নগুলি উল্লেখ করতে ব্যবহার করব।

প্রপস: পিতা-সন্তানের উপস্থাপনা যুক্তি

প্রত্যক্ষ পিতা-সন্তানের পক্ষে ভ্যুর মধ্যে সবচেয়ে সহজ যোগাযোগের চ্যানেল যোগাযোগের । এটি বেশিরভাগ উপস্থাপনা যুক্তির সাথে সম্পর্কিত ডেটা বা শ্রেণিবিন্যাসের নীচে ডেটাগুলির একটি সীমাবদ্ধ সেট সম্পর্কিত পাস করার জন্য ব্যবহার করা উচিত।

রেফ এবং পদ্ধতি: উপস্থাপনাটি অ্যান্টি-প্যাটার্ন

যখন কোনও সন্তানের পিতা-মাতার কাছ থেকে কোনও ইভেন্ট পরিচালনা করতে দেওয়া কোনও প্রস্তাব ব্যবহার করা অর্থহীন নয় তখন সন্তানের উপাদানগুলির উপর একটি সেট আপ করা refএবং তার পদ্ধতিগুলি কল করা ঠিক আছে।

এটি করবেন না, এটি একটি অ্যান্টি-প্যাটার্ন। আপনার উপাদান আর্কিটেকচার এবং ডেটা প্রবাহকে নতুন করে দেখুন। যদি আপনি নিজেকে কোনও পিতামাতার কাছ থেকে সন্তানের উপাদানগুলির জন্য কোনও পদ্ধতি কল করতে চান বলে মনে করেন তবে সম্ভবত রাষ্ট্রটি উপরে তুলে ধরার বা এখানে বর্ণিত অন্যান্য উপায়গুলি বা অন্য উত্তরে বিবেচনা করার সম্ভবত সময় এসেছে ।

ইভেন্টস: শিশু-পিতামাতার উপস্থাপনার যুক্তি

$emitএবং $on। সরাসরি শিশু-পিতামাতার যোগাযোগের জন্য সবচেয়ে সহজ যোগাযোগের চ্যানেল। আবার, উপস্থাপনা যুক্তি জন্য ব্যবহার করা উচিত।

ইভেন্ট বাস

বেশিরভাগ উত্তর ইভেন্ট বাসের জন্য ভাল বিকল্প দেয় যা দূরবর্তী উপাদানগুলির জন্য উপলভ্য যোগাযোগ চ্যানেলগুলির মধ্যে একটি বা বাস্তবে কোনও কিছুর জন্য উপযুক্ত বিকল্প দেয়।

এগুলি দরকারী হয়ে উঠতে পারে যখন পুরো জায়গা জুড়ে প্রপসটি খুব নীচে থেকে নীচে নেস্ট করা বাচ্চাদের উপাদানগুলিতে চলে যায়, প্রায় কোনও উপাদানগুলির মধ্যে এগুলির প্রয়োজন হয় না। সাবধানে নির্বাচিত ডেটার জন্য অল্প পরিমাণে ব্যবহার করুন।

সতর্কতা অবলম্বন করুন: ইভেন্ট বাসের সাথে নিজেকে আবদ্ধ করে রাখা উপাদানগুলির পরবর্তী সৃষ্টি একাধিকবার আবদ্ধ হবে - একাধিক হ্যান্ডলারের উদ্দীপনা এবং ফুটো হওয়া। আমি অতীতে ডিজাইন করেছি এমন একক পৃষ্ঠাগুলির অ্যাপ্লিকেশনগুলিতে ব্যক্তিগতভাবে কখনও ইভেন্ট বাসের প্রয়োজন অনুভব করিনি।

নিম্নলিখিতটি দেখায় যে একটি সাধারণ ভুল কীভাবে ফাঁসের দিকে নিয়ে যায় যেখানে Itemডিওএম থেকে সরানো হলেও উপাদানটি এখনও ট্রিগার করে।

destroyedলাইফেসাইকেল হুক শ্রোতাদের অপসারণ মনে রাখবেন ।

সেন্ট্রালাইজড স্টোর (ব্যবসায়িক যুক্তি)

Vuex জন্য Vue সঙ্গে যেতে উপায় রাষ্ট্র ব্যবস্থাপনা । এটি কেবল ইভেন্টগুলির চেয়ে অনেক বেশি অফার করে এবং এটি সম্পূর্ণ স্কেল অ্যাপ্লিকেশনের জন্য প্রস্তুত।

এবং এখন আপনি জিজ্ঞাসা :

[এস] আমি প্রতিটি ছোটখাট যোগাযোগের জন্য ভেক্সের দোকান তৈরি করব?

এটি সত্যই জ্বলজ্বল যখন:

  • আপনার ব্যবসার যুক্তি দিয়ে কাজ করা,
  • ব্যাকএন্ডের সাথে যোগাযোগ করা (বা কোনও স্থানীয় অস্থায়ী স্তর যেমন স্থানীয় স্টোরেজ)

সুতরাং আপনার উপাদানগুলি ব্যবহারকারীর ইন্টারফেসগুলি পরিচালনা করে বোঝাতে চাইছে really

এর অর্থ এই নয় যে আপনি এটিকে উপাদান যুক্তির জন্য ব্যবহার করতে পারবেন না, তবে আমি যুক্তিটি কেবল প্রয়োজনীয় বৈশ্বিক ইউআই রাষ্ট্রের সাথে একটি নেমস্পিড ভিউেক্স মডিউলে যুক্ত করব।

বিশ্বব্যাপী সমস্ত কিছুর একটি বড় জগাখিচুড়ি মোকাবেলা এড়াতে, দোকানটি একাধিক নেমস্পিড মডিউলগুলিতে পৃথক করা উচিত।


উপাদান ধরনের

এই সমস্ত যোগাযোগকে অর্কেস্ট্রেট করতে এবং পুনরায় ব্যবহারের সহজলভ্য করার জন্য আমাদের উপাদানগুলি দুটি ভিন্ন ধরণের হিসাবে ভাবা উচিত।

  • অ্যাপ্লিকেশন নির্দিষ্ট পাত্রে
  • জেনেরিক উপাদান

আবার, এর অর্থ এই নয় যে জেনেরিক উপাদানটি পুনরায় ব্যবহার করা উচিত বা অ্যাপ্লিকেশন নির্দিষ্ট ধারকটি পুনরায় ব্যবহার করা যাবে না, তবে তাদের বিভিন্ন দায়িত্ব রয়েছে।

অ্যাপ্লিকেশন নির্দিষ্ট পাত্রে

এগুলি হ'ল সরল ভ্যু উপাদান যা অন্যান্য ভ্যূ উপাদানগুলি (জেনেরিক বা অন্যান্য অ্যাপ্লিকেশন নির্দিষ্ট ধারকগুলি) মোড়কে দেয়। এখানেই ভেক্স স্টোর যোগাযোগ হওয়া উচিত এবং এই ধারকটিকে অন্যান্য সহজ উপায়গুলির মাধ্যমে প্রপস এবং ইভেন্ট শ্রোতার মাধ্যমে যোগাযোগ করা উচিত।

এই পাত্রে এমনকি কোনও নেটিভ ডোম উপাদান থাকতে পারে না এবং জেনেরিক উপাদানগুলি টেম্প্লেটিং এবং ব্যবহারকারীর ইন্টারঅ্যাকশনগুলির সাথে ডিল করতে দেয়।

সুযোগ একরকম eventsবা storesভাইবোন উপাদান দৃশ্যমানতা

এখানেই স্কোপিং ঘটে। সর্বাধিক উপাদান দোকান সম্পর্কে জানি না এবং এই কম্পোনেন্ট (বেশিরভাগই) এক ব্যবহার দোকান মডিউল একটি সীমিত সেট দিয়ে namespaced উচিত gettersএবং actionsপ্রদত্ত সঙ্গে প্রয়োগ Vuex বাঁধাই সাহায্যকারী

জেনেরিক উপাদান

এগুলি প্রপস থেকে তাদের ডেটা গ্রহণ করা উচিত, তাদের নিজস্ব স্থানীয় ডেটাতে পরিবর্তন করা উচিত এবং সাধারণ ইভেন্টগুলি নির্গত করা উচিত। বেশিরভাগ সময় তাদের জানা উচিত নয় যে কোনও ভেক্স স্টোর রয়েছে।

এগুলিকে পাত্রেও বলা যেতে পারে কারণ তাদের একমাত্র দায়িত্ব অন্যান্য ইউআই উপাদানগুলিতে প্রেরণা হতে পারে।


ভাইবোন যোগাযোগ

সুতরাং, এত কিছুর পরেও, কীভাবে আমরা দুটি ভাইবোনের উপাদানগুলির মধ্যে যোগাযোগ করব?

উদাহরণ সহকারে এটি বোঝা সহজ: আমাদের বলুন যে আমাদের কাছে একটি ইনপুট বাক্স রয়েছে এবং এর ডেটা অ্যাপ্লিকেশন জুড়ে ভাগ করা উচিত (গাছের বিভিন্ন স্থানে ভাইবোন) এবং ব্যাকএন্ডের সাথে অবিচল থাকে।

সবচেয়ে খারাপ পরিস্থিতির সাথে শুরু করে , আমাদের উপাদান উপস্থাপনা এবং ব্যবসায়িক যুক্তি মিশ্রিত করবে ।

// 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>

যেহেতু ভেক্স স্টোর ক্রিয়াকলাপগুলি ব্যাকএন্ড যোগাযোগের সাথে যোগাযোগ করে, তাই আমাদের এখানে ধারকটি অক্ষ এবং ব্যাকএন্ড সম্পর্কে জানতে হবে না।



আমি এই উত্তর পছন্দ। তবে আপনি কী দয়া করে ইভেন্ট বাসের বিস্তারিত ব্যাখ্যা করতে এবং "সতর্কতা অবলম্বন করুন:" দ্রষ্টব্য? হতে পারে আপনি কিছু উদাহরণ দিতে পারেন, আমি বুঝতে পারি না কীভাবে উপাদানগুলি দু'বার বাঁধা হতে পারে।
ভ্যানড্রয়েড

উদাহরণস্বরূপ ফর্ম বৈধকরণের জন্য আপনি কীভাবে প্যারেন্ট উপাদান এবং গ্র্যান্ড সন্তানের অংশের মধ্যে যোগাযোগ করবেন। যেখানে পিতামাতার উপাদানগুলি একটি পৃষ্ঠা, শিশু ফর্ম, এবং গ্র্যান্ড শিশুটি ইনপুট ফর্ম উপাদান?
লর্ড জেড

1
@ ভ্যান্ড্রয়েড আমি একটি সাধারণ উদাহরণ তৈরি করেছি যা শ্রোতাদের যথাযথভাবে অপসারণ করা হয় না এমন ফাঁস দেখায়, যেমন এই থ্রেডের প্রতিটি উদাহরণের মতো।
এমিল বার্গারন

@ লর্ডজেড এটি সত্যই নির্ভর করে তবে আপনার পরিস্থিতি সম্পর্কে আমার ধারণা থেকে এটি দেখতে কোনও ডিজাইনের সমস্যা বলে মনে হচ্ছে। ভ্যু বেশিরভাগ উপস্থাপনা যুক্তির জন্য ব্যবহার করা উচিত। ফর্ম বৈধতা অন্য কোথাও করা উচিত, যেমন ভ্যানিলা জেএস এপিআই ইন্টারফেসের মতো, যে কোনও ভিউেক্স ক্রিয়া ফর্মের ডেটা সহ কল ​​করবে।
এমিল বার্গারন

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হ্যাঁ ব্যবহার করেন তবে এটির জন্য যান। এটা ব্যবহার করো.
হেক্টর লরেঞ্জো

1
আসলে আমি একমত নই যে আমাদের প্রতিটি ছোটখাটো যোগাযোগের জন্য ভেক্স ব্যবহার করা দরকার ...
ভিক্টর

না, অবশ্যই না, এটি সব প্রসঙ্গে নির্ভর করে। আসলে আমার উত্তর vuex থেকে সরে যায়। অন্যদিকে, আমি দেখতে পেয়েছি যে আপনি ভুএক্স এবং একটি কেন্দ্রীয় রাষ্ট্রের অবজেক্টের ধারণাটি ব্যবহার করেন, আমি কম বস্তুর মধ্যে যোগাযোগের উপর নির্ভর করি। তবে হ্যাঁ, একমত, এটি সব নির্ভর করে।
হেক্টর লরেঞ্জো

3

ভাইবোনদের মধ্যে কীভাবে যোগাযোগ পরিচালনা করা যায় তা পরিস্থিতির উপর নির্ভর করে। তবে প্রথমে আমি জোর দিয়ে বলতে চাই যে বিশ্বব্যাপী ইভেন্টের বাসের পদ্ধতিটি ভ্যূ 3 তে চলে যাচ্ছে । এই আরএফসি দেখুন । আমি কেন নতুন উত্তর লেখার সিদ্ধান্ত নিয়েছি।

সর্বনিম্ন সাধারণ পূর্বপুরুষ প্যাটার্ন (বা "এলসিএ")

সাধারণ ক্ষেত্রে, আমি সর্বনিম্ন সর্বনিম্ন সাধারণ পূর্বপুরুষ (যা "ডেটা ডাউন, ইভেন্টস আপ" নামে পরিচিত) ব্যবহার করার পরামর্শ দিচ্ছি। এই প্যাটার্নটি পড়া, বাস্তবায়ন, পরীক্ষা করা এবং ডিবাগ করা সহজ।

সংক্ষেপে, এর অর্থ যদি দুটি উপাদানকে যোগাযোগ করতে হয় তবে তাদের ভাগ করা রাষ্ট্রকে নিকটতম উপাদানগুলিতে রাখুন যা পূর্বপুরুষ হিসাবে উভয়ই ভাগ করে। প্রসেসের মাধ্যমে প্যারেন্ট উপাদান থেকে শিশু উপাদানগুলিতে ডেটা পাস করুন এবং একটি ইভেন্ট নির্গত করে শিশু থেকে পিতামাতার কাছে তথ্য প্রেরণ করুন (এই উত্তরের নীচে এটির উদাহরণ দেখুন)।

একটি সঙ্কল্পিত উদাহরণের জন্য, একটি ইমেল অ্যাপ্লিকেশনে, "মেসেজ বডি" উপাদানটির সাথে "টু" উপাদানটির ইন্টারঅ্যাক্ট করার প্রয়োজন হলে সেই ইন্টারঅ্যাকশনটির অবস্থা তাদের পিতামাতায় থাকতে পারে (সম্ভবত কোনও উপাদান বলা হয় email-form)। আপনি একটি ঠেকনা থাকতে পারে email-formবলা addresseeযাতে বার্তার মূল স্বয়ংক্রিয়ভাবে পূর্বে লিখুন করতে Dear {{addressee.name}}ই-মেইল রিসিভারের ইমেল ঠিকানার উপর ভিত্তি করে করা হয়।

যোগাযোগের জন্য প্রচুর মধ্যস্বত্বভোগী উপাদানগুলির সাথে দীর্ঘ দূরত্বে ভ্রমণ করতে হয়, তবে এলসিএ কঠোর হয়ে ওঠে। আমি প্রায়শই এই দুর্দান্ত ব্লগ পোস্টে সহকর্মীদের উল্লেখ করি । (এর উদাহরণগুলি এম্বার ব্যবহার করে এমন বিষয়টিকে উপেক্ষা করুন; এর ধারণাগুলি অনেকগুলি ইউআই ফ্রেমওয়ার্ক জুড়ে প্রযোজ্য)

ডেটা কনটেইনার প্যাটার্ন (যেমন, ভেক্স)

জটিল ক্ষেত্রে বা পরিস্থিতিতে যেখানে পিতামাতার – সন্তানের যোগাযোগের ক্ষেত্রে অনেক মধ্যস্বত্বভোগী জড়িত, ভুেক্স বা সমতুল্য ডেটা ধারক প্রযুক্তি ব্যবহার করুন। যখন উপযুক্ত হয়, নেমস্পিড মডিউলগুলি ব্যবহার করুন ।

উদাহরণস্বরূপ, সম্পূর্ণ আন্তঃসংযোগযুক্ত ক্যালেন্ডার উপাদান হিসাবে অনেক আন্তঃসংযোগযুক্ত উপাদানগুলির জটিল সংগ্রহের জন্য পৃথক নেমস্পেস তৈরি করা যুক্তিসঙ্গত হতে পারে।

প্রকাশ / সাবস্ক্রাইব (ইভেন্ট বাস) প্যাটার্ন

যদি ইভেন্ট বাস (বা "প্রকাশ / সাবস্ক্রাইব") প্যাটার্নটি আপনার প্রয়োজনের জন্য আরও উপযুক্ত হয় তবে ভ্যু কোর টিম এখন মাইটের মতো একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করার পরামর্শ দেয় । (অনুচ্ছেদ 1 এ উল্লেখ করা আরএফসি দেখুন)

বোনাস ramblings এবং কোড

ভাইব্যাক-ভাই-ভাইবোন যোগাযোগের জন্য সর্বনিম্ন সাধারণ পূর্বপুরুষ সমাধানের একটি মৌলিক উদাহরণ এখানে, গেমটি ওয়াচ-এ-মোলের মাধ্যমে চিত্রিত ।

একটি নির্লজ্জ দৃষ্টিভঙ্গি ভাবতে পারে, "তিল 1 টি তিল 2 কে ভেসে যাওয়ার পরে উপস্থিত হতে বলা উচিত"। তবে ভ্যু এই ধরণের পদ্ধতিকে নিরুৎসাহিত করে, যেহেতু এটি আমাদের গাছের কাঠামোর ক্ষেত্রে বিবেচনা করতে চায় ।

এটি সম্ভবত খুব ভাল জিনিস। একটি নন-তুচ্ছ অ্যাপ্লিকেশন যেখানে নোডগুলি সরাসরি ডিওএম গাছ জুড়ে একে অপরের সাথে যোগাযোগ করে থাকে কোনও ধরণের অ্যাকাউন্টিং সিস্টেম (যেমন ভুেক্স সরবরাহ করে) ছাড়াই ডিবাগ করা খুব কঠিন হবে। তার উপরে, "ডেটা ডাউন, ইভেন্টগুলি আপ" ব্যবহার করে এমন উপাদানগুলি কম সংশ্লেষ এবং উচ্চ পুনরায় ব্যবহারযোগ্যতা - উভয়ই অত্যন্ত পছন্দসই বৈশিষ্ট্য যা বড় বড় অ্যাপ্লিকেশন স্কেলকে সহায়তা করে।

এই উদাহরণস্বরূপ, যখন একটি তিলটি ফেটে যায়, তখন এটি একটি ইভেন্ট নির্গত করে। গেম ম্যানেজার অংশটি অ্যাপ্লিকেশনটির নতুন স্থিতি কী তা সিদ্ধান্ত নিয়েছে এবং এইভাবে ভাইবোন তিলটি ভ্যু পুনঃ-রেন্ডারগুলির পরে স্পষ্টতই কী করতে হবে তা জানে। এটি কিছুটা তুচ্ছ "সর্বনিম্ন সাধারণ পূর্বপুরুষ" উদাহরণ।

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>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.