Vue.js এ পিতামাতার কাছ থেকে কীভাবে কোনও শিশু পদ্ধতিতে অ্যাক্সেস করবেন


91

আমার দুটি নেস্টেড উপাদান রয়েছে, পিতা-মাতার কাছ থেকে সন্তানের পদ্ধতিগুলি অ্যাক্সেস করার সঠিক উপায় কী?

this.$children[0].myMethod() কৌশলটি মনে হচ্ছে তবে এটি বেশ কুৎসিত, তাই না, এর চেয়ে ভাল আর কী হতে পারে:

<script>
import child from './my-child'

export default {
  components: {
   child
  },
  mounted () {
    this.$children[0].myMethod()
  }
}
</script>

প্রথমে নিজেকে জিজ্ঞাসা করুন আপনার সত্যিকারের প্রয়োজন কি। আপনার সমস্ত পৃষ্ঠাগুলি যদি কোনও স্টোরে থাকে তবে যেমনটি হওয়া উচিত, পিতামাতার-শিশু যোগাযোগের প্রয়োজন নেই no
বিবিসিমোনবিবি

7
@bbsimonbb রাজ্য ঘটনা থেকে পৃথক। এটি বিশেষত পিতামাতার কাছ থেকে সন্তানের ইভেন্টগুলি ট্রিগার করার বিষয়ে। আপনি প্র্রোপটি প্রবাহিত করার জন্য ভয়েসকে যা ব্যবহার করতে চাইছেন তা করতে পারেন তবে এটির জন্য শিশু উপাদানটি পরিবর্তনের জন্য প্রপ / স্টোরটি পর্যবেক্ষণ করে যাতে আপনি কার্যকরভাবে ডেটা পরিবর্তনের সাথে আরপিসিকে অনুকরণ করতে পারেন যা কেবলমাত্র আপনার চান সব কিছু যখন করতে চান উপাদান একটি ক্রিয়া ট্রিগার।
বোজন মার্কোভিচ

উত্তর:


244

আপনি রেফ ব্যবহার করতে পারেন ।

import ChildForm from './components/ChildForm'

new Vue({
  el: '#app',
  data: {
    item: {}
  },
  template: `
  <div>
     <ChildForm :item="item" ref="form" />
     <button type="submit" @click.prevent="submit">Post</button>
  </div>
  `,
  methods: {
    submit() {
      this.$refs.form.submit()
    }
  },
  components: { ChildForm },
})

যদি আপনি আঁটসাঁট মিলন অপছন্দ করেন তবে আপনি @ ইউসভেল কুইন্টেরো দ্বারা দেখানো ইভেন্ট ইভেন্টটি ব্যবহার করতে পারেন । প্রপস হিসাবে বাসে পাস করে ইভেন্ট বাস ব্যবহার করার আরও একটি উদাহরণ নীচে দেওয়া হয়েছে।

import ChildForm from './components/ChildForm'

new Vue({
  el: '#app',
  data: {
    item: {},
    bus: new Vue(),
  },
  template: `
  <div>
     <ChildForm :item="item" :bus="bus" ref="form" />
     <button type="submit" @click.prevent="submit">Post</button>
  </div>
  `,
  methods: {
    submit() {
      this.bus.$emit('submit')
    }
  },
  components: { ChildForm },
})

উপাদানগুলির কোড।

<template>
 ...
</template>

<script>
export default {
  name: 'NowForm',
  props: ['item', 'bus'],
  methods: {
    submit() {
        ...
    }
  },
  mounted() {
    this.bus.$on('submit', this.submit)
  },  
}
</script>

https://code.luasoftware.com / টিউটোরিয়ালস /vuejs/parent-call-child-comp घटक-method/


38
এটি সঠিক উত্তর, এটি আসলে আসল প্রশ্নটি পড়ে। নির্বাচিত উত্তরটি আসলে বিপরীত প্রশ্নের উত্তর দেয় (সন্তানের উপাদান থেকে পিতামাতার উপর কোনও পদ্ধতি কীভাবে ট্রিগার করা যায়)।
বোজন মার্কোভিচ

4
ইভেন্ট বাসের লিঙ্কটি যা এই উত্তরটির সাথে সংযুক্ত, এটি স্টেট ম্যানেজমেন্টে পুনঃনির্দেশিত হচ্ছে , @ বিবিসিমোনবিবি মন্তব্য পড়ার পরে , এর কান্ডটি বোঝা যায়।
oদও 95

4
আপনি যদি ব্যবহার করেন তবে এটি উল্লেখ করার মতো this.$refs., আপনার চাইল্ড উপাদানটি গতিশীলভাবে লোড করা উচিত নয়।
1_bug

ধন্যবাদ জনাব! তুমি আমাকে অনেক কষ্ট বাঁচিয়েছ। আমি একটি প্রডাকশন ইস্যু ঠিক করছিলাম এবং মরিয়া উত্তরগুলি খুঁজছিলাম! <3
ওসামা ইব্রাহিম

27

VueJS- এ পিতা-সন্তানের যোগাযোগ

একটি রুট ভ্যু উদাহরণ দেওয়া সমস্ত বংশধরদের মাধ্যমে অ্যাক্সেসযোগ্য this.$root, কোনও প্যারেন্ট উপাদানগুলি this.$childrenঅ্যারের মাধ্যমে শিশু উপাদানগুলিতে অ্যাক্সেস করতে পারে এবং কোনও শিশু উপাদান তার পিতামাতার মাধ্যমে this.$parentঅ্যাক্সেস করতে পারে, আপনার প্রথম প্রবৃত্তিটি সরাসরি এই উপাদানগুলিতে অ্যাক্সেস করতে পারে।

ভ্যুজেএস ডকুমেন্টেশন দুটি খুব ভাল কারণে বিশেষত এর বিরুদ্ধে সতর্ক করে:

  • এটি দৃly়ভাবে সন্তানের সাথে পিতামাতাকে দম্পতি করে (এবং বিপরীতে)
  • আপনি সন্তানের উপাদান দ্বারা এটি সংশোধন করা যেতে পারে যে, আপনি পিতামাতার অবস্থার উপর নির্ভর করতে পারবেন না।

সমাধানটি হ'ল ভয়ের কাস্টম ইভেন্ট ইন্টারফেসটি ব্যবহার করা

ভ্যু দ্বারা বাস্তবায়িত ইভেন্ট ইন্টারফেস আপনাকে উপাদান গাছটিকে উপরে এবং নীচে যোগাযোগ করতে দেয়। কাস্টম ইভেন্ট ইন্টারফেসের সুবিধা আপনাকে চারটি পদ্ধতিতে অ্যাক্সেস দেয়:

  1. $on() - আপনাকে ইভেন্টটি শোনার জন্য আপনার ভ্যূ উদাহরণটিতে শ্রোতা ঘোষণা করার অনুমতি দেয়
  2. $emit() - আপনাকে একই পরিস্থিতিতে ইভেন্টগুলি ট্রিগার করতে দেয় (স্ব)

ব্যবহারের উদাহরণ $on()এবং $emit():

const events = new Vue({}),
    parentComponent = new Vue({
      el: '#parent',
      ready() {
        events.$on('eventGreet', () => {
          this.parentMsg = `I heard the greeting event from Child component ${++this.counter} times..`;
        });
      },
      data: {
        parentMsg: 'I am listening for an event..',
        counter: 0
      }
    }),
    childComponent = new Vue({
      el: '#child',
      methods: {
      greet: function () {
        events.$emit('eventGreet');
        this.childMsg = `I am firing greeting event ${++this.counter} times..`;
      }
    },
    data: {
      childMsg: 'I am getting ready to fire an event.',
      counter: 0
    }
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.28/vue.min.js"></script>

<div id="parent">
  <h2>Parent Component</h2>
  <p>{{parentMsg}}</p>
</div>

<div id="child">
  <h2>Child Component</h2>
  <p>{{childMsg}}</p>
  <button v-on:click="greet">Greet</button>
</div>

উত্তরটি মূল পোস্ট থেকে নেওয়া: ভ্যুজেএস-এর উপাদানগুলির মধ্যে যোগাযোগ করা


4
আপনাকে ধন্যবাদ, তাই আমি ইভেন্টগুলির মাধ্যমে আমার কোডটিকে একত্রীকরণের চেষ্টা করব!
al3x

4
যখন সামগ্রী অনুলিপি / আটকানো হয় উত্স উল্লেখ করা ভাল।
মিহাই ভিল্কু

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

66
এটি আসলে যা জিজ্ঞাসা করেছিল তার বিপরীত প্রশ্নের উত্তর দেয়। ডেসমন্ড লুয়ার উত্তর আসল প্রশ্নের উত্তর দেয়।
বোজন মার্কোভিচ

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

1

আপনার নিয়ন্ত্রণ রেন্ডার দ্বারা প্রভাবিত হলে রেফ এবং ইভেন্ট বাস দুটিরই সমস্যা রয়েছে v-if। সুতরাং, আমি একটি সহজ পদ্ধতি নিয়ে যাওয়ার সিদ্ধান্ত নিয়েছি।

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

(ডেসমন্ড লুয়ার উত্তর থেকে কিছু কোড নেওয়া)

মূল উপাদান কোড:

import ChildComponent from './components/ChildComponent'

new Vue({
  el: '#app',
  data: {
    item: {},
    childMethodsQueue: [],
  },
  template: `
  <div>
     <ChildComponent :item="item" :methods-queue="childMethodsQueue" />
     <button type="submit" @click.prevent="submit">Post</button>
  </div>
  `,
  methods: {
    submit() {
      this.childMethodsQueue.push({name: ChildComponent.methods.save.name, params: {}})
    }
  },
  components: { ChildComponent },
})

এটি চাইল্ড কম্পোনেন্টের জন্য কোড

<template>
 ...
</template>

<script>
export default {
  name: 'ChildComponent',
  props: {
    methodsQueue: { type: Array },
  },
  watch: {
    methodsQueue: function () {
      this.processMethodsQueue()
    },
  },
  mounted() {
    this.processMethodsQueue()
  },
  methods: {
    save() {
        console.log("Child saved...")
    },
    processMethodsQueue() {
      if (!this.methodsQueue) return
      let len = this.methodsQueue.length
      for (let i = 0; i < len; i++) {
        let method = this.methodsQueue.shift()
        this[method.name](method.params)
      }
    },
  },
}
</script>

এবং উন্নতির জন্য অনেকগুলি জায়গা রয়েছে যেমন processMethodsQueueএকটি মিশ্রণে চলে যাওয়া ...


0

অন্য সন্তানের সাথে কোনও সন্তানের অংশের সাথে যোগাযোগ করার জন্য আমি পিতামাতায় একটি পদ্ধতি তৈরি করেছি যা একটি শিশুকে এমন পদ্ধতিতে কল করে:

this.$refs.childMethod()

এবং অন্য সন্তানের কাছ থেকে আমি মূল পদ্ধতিটি কল করেছি:

this.$root.theRootMethod()

এটা আমার জন্য কাজ করেছে।


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