Vue.js 2-তে প্রাথমিক তথ্য হিসাবে প্রপসগুলি পাস করার সঠিক উপায় কী?


102

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

আমার cars-listভ্যু উপাদান উপাদান যেখানে আমি প্রাথমিক বৈশিষ্ট্যগুলির সাথে প্রপসগুলি এখানে পাস করি single-car:

// cars-list.vue

<script>
    export default {
        data: function() {
            return {
                cars: [
                    {
                        color: 'red',
                        maxSpeed: 200,
                    },
                    {
                        color: 'blue',
                        maxSpeed: 195,
                    },
                ]
            }
        },
    }
</script>

<template>
    <div>
        <template v-for="car in cars">
            <single-car :initial-properties="car"></single-car>
        </template>
    </div>
</template>

আমি এখনই এটা করতে যে আমার ভিতরে single-carউপাদান আমি বরাদ্দ করছি this.initialPropertiesআমার থেকে this.data.propertiesউপর created()আরম্ভের হুক। এবং এটি কাজ করে এবং প্রতিক্রিয়াশীল।

// single-car.vue

<script>
    export default {
        data: function() {
            return {
                properties: {},
            }
        },
        created: function(){
            this.data.properties = this.initialProperties;
        },
    }
</script>

<template>
    <div>Car is in {{properties.color}} and has a max speed of {{properties.maxSpeed}}</div>
</template>

তবে তার সাথে আমার সমস্যাটি হ'ল আমি জানি না যে এটি করার সঠিক উপায় কিনা? এটা কি রাস্তা দিয়ে কিছু ঝামেলা সৃষ্টি করবে না? নাকি এটি করার আরও ভাল উপায় আছে?


14
এটা আমার মতে Vue সবচেয়ে বিভ্রান্তিকর জিনিস: প্রত্যেক dataহয় two-wayআবদ্ধ, কিন্তু আপনি প্রেরণ করতে পারবেন না dataউপাদান জন্য, আপনাকে পাস props, কিন্তু আপনি লাভ করেন পরিবর্তন করতে পারবেন না propsবা রূপান্তর propsকরতে data। তারপর কি? একটি জিনিস যা আমি শিখেছি তা হ'ল আপনার পাশ propsকাটা উচিত এবং ইভেন্টগুলি ট্রিগার করা উচিত। এটি হ'ল, যদি উপাদানটি propsএটি পেয়েছে তা পরিবর্তন করতে চায় , তবে এটি একটি ইভেন্ট ডেকে "পুনরায় রেন্ডার" করা উচিত। তবে তারপরে আপনি one-wayঠিক যেমন রিএ্যাক্টের মতো বাঁধাই করে রেখেছেন এবং আমি সেটির ব্যবহার দেখতে পাচ্ছি না data। বেশ বিভ্রান্তিকর।
আন্দ্রে পেনা

4
ডেটা মূলত উপাদানটির ব্যক্তিগত ব্যবহারের জন্য তৈরি। উপাদানটির প্রসঙ্গে এটিতে রাখা সমস্ত কিছুই প্রতিক্রিয়াশীল এবং এটিকে আবদ্ধ হতে পারে। প্রপস সহ ধারণাটি হ'ল মানগুলিকে উপাদানগুলিতে রূপান্তরিত করা কিন্তু একটি উত্তীর্ণ মান পরিবর্তনের মাধ্যমে পিতামাতার রাজ্যের পরিবর্তনগুলি নিঃশব্দে চালু করতে সক্ষম হওয়া থেকে উপাদানটিকে রাখা উচিত। আপনার ইঙ্গিত অনুসারে কোনও ইভেন্টে এটি সুস্পষ্ট করা আরও ভাল। এটি ভ্যু ১.০ থেকে ২.০ এ দর্শনের পরিবর্তন ছিল।
ডেভিড কে। হেস

আজ আমি এখানে একটি থ্রেড শুরু করার চেষ্টা করেছি: ফোরাম.ভয়েজস.আর.আর্গ / টি /
বগ্রেভ

উত্তর:


109

এই https://github.com/vuejs/vuejs.org/pull/567 ধন্যবাদ আমি এখন উত্তর জানি।

পদ্ধতি 1

প্রাথমিক উপাত্ত সরাসরি ডেটাতে পাস করুন। আপডেট হওয়া ডক্সে উদাহরণটি পছন্দ করুন:

props: ['initialCounter'],
data: function () {
    return {
        counter: this.initialCounter
    }
}

তবে মনে রাখবেন যে যদি পাস করা প্রোপ কোনও অবজেক্ট বা অ্যারে হয় যা প্যারেন্ট উপাদানগুলিতে ব্যবহৃত হয় তবে সেই প্রপগুলিতে কোনও পরিবর্তন হলে সেই প্যারেন্ট উপাদানটির অবস্থার পরিবর্তন ঘটবে।

সতর্কতা : এই পদ্ধতিটি সুপারিশ করা হয় না। এটি আপনার উপাদানগুলি অনির্দেশ্য করে তুলবে। আপনার যদি সন্তানের উপাদানগুলি থেকে পিতামাতাদের ডেটা সেট করতে হয় হয় হয় ভিউক্সের মতো রাজ্য পরিচালনা ব্যবহার করুন বা "ভি-মডেল" ব্যবহার করুন। https://vuejs.org/v2/guide/components.html#Using-v-model-on- উপাদান

পদ্ধতি 2

যদি আপনার প্রারম্ভিক প্রপ কোনও বস্তু বা অ্যারে হয় এবং আপনি যদি চান না বাচ্চাদের রাজ্যের পরিবর্তনগুলি পিতামাতার রাজ্যে প্রচার করুন তবে কেবল Vue.util.extendপ্রসগুলির একটি অনুলিপি তৈরির পরিবর্তে এটি সরাসরি বাচ্চাদের ডেটাতে নির্দেশ করে ব্যবহার করুন:

props: ['initialCounter'],
data: function () {
    return {
        counter: Vue.util.extend({}, this.initialCounter)
    }
}

পদ্ধতি 3

প্রপস ক্লোন করতে আপনি স্প্রেড অপারেটরও ব্যবহার করতে পারেন। ইগরের উত্তরে আরও বিশদ: https://stackoverflow.com/a/51911118/3143704

তবে মনে রাখবেন স্প্রেড অপারেটরগুলি পুরানো ব্রাউজারগুলিতে সমর্থিত নয় এবং আরও ভাল সামঞ্জস্যের জন্য আপনাকে কোডটি ট্রান্সপ্লাই করতে হবে যেমন ব্যবহার করে babel

পাদটীকা

[1] মনে রাখবেন এটি একটি অভ্যন্তরীণ ভ্যূ ইউটিলিটি এবং এটি নতুন সংস্করণে পরিবর্তিত হতে পারে। সেই প্রপটি অনুলিপি করতে আপনি অন্যান্য পদ্ধতি ব্যবহার করতে চাইতে পারেন, " আমি কীভাবে জাভাস্ক্রিপ্ট অবজেক্টটিকে সঠিকভাবে ক্লোন করব? " দেখুন।

আমার পরীক্ষাটি যেখানে আমি এটি পরীক্ষা করছিলাম: https://jsfiddle.net/sm4kx7p9/3/


4
সুতরাং প্যারেন্ট উপাদানগুলিতে পরিবর্তনগুলি প্রচার করা কি ঠিক অনুশীলন?
আইগোর

4
@ ব্যক্তিগতভাবে ব্যক্তিগতভাবে আমি এটিকে যতটা সম্ভব এড়াতে চেষ্টা করব। এটি আপনার উপাদানগুলি অনির্দেশ্য করে তুলবে। আমি মনে করি প্যারেন্ট উপাদানগুলিতে পরিবর্তন আনার আরও ভাল উপায় হ'ল "ভি-মডেল" পদ্ধতিটি ব্যবহার করা যেখানে আপনি আপনার সন্তানের উপাদান থেকে প্যারেন্ট উপাদানগুলিতে পরিবর্তন প্রর্জন করছেন। vuejs.org/v2/guide/components.html#Using-v-model-on- উপাদান
ডোমিনিক সেরফিন

হ্যাঁ তবে গভীর বস্তু সম্পর্কে কী? আমার কি গভীর অনুলিপি করা উচিত? গভীর অবজেক্টটি ব্যবহার না করার জন্য আমার কি আমার উপাদানগুলি আবার ডিজাইন করা উচিত? অর্থাত্ একটি প্রস্তাব: { ok: 1, notOk: { meh: 2 } }পূর্ববর্তী ক্লোনিং পদ্ধতিগুলির সাথে কোনও অভ্যন্তরীণ ডেটাতে সেট করা থাকলেও notOk.meh
প্রপটি

4
@ ডোমিনিকসেরাফিন চমৎকার প্রশ্ন এবং উত্তরের জন্য ধন্যবাদ। এটি ভ্যু জেএসের অ্যাকিলিস নিরাময়ের পুরোপুরি চিত্রিত করে কাঠামোগত হিসাবে এটি সুসংহতকরণকে খুব ভালভাবে পরিচালনা করে তবে কমপগুলির মধ্যে ডেটা পাস করা একটি প্রধান পিআইটিএ। স্রেফ নামকরণের দুঃস্বপ্নটি দেখুন। সুতরাং এখন initialআমার কম্পিউটারের মধ্যে সেগুলি ব্যবহার করতে সক্ষম হতে আমার সমস্ত প্রপস উপসর্গ করা দরকার । এটি এতটা ক্লিনার হবে যদি আমরা কেবল dataকোনও কম্পিউটারের কাছে ডাকা একটি প্রপ পাস করতে পারি এবং এটি স্বয়ংক্রিয়ভাবে এই সমস্ত initialPropNameউন্মাদনা ছাড়াই লোকালাইজড ডেটা প্রচার করতে পারি ।
এজেবি

4
@ ডোমিনিকসেফিন আমি শুনছি আপনি কী বলছেন, এবং আপনি ভুল নন। তবে Vue.js ব্যবহার করে একটি ফর্ম-বিল্ডার অ্যাপ লিখুন এবং আপনি আমার অর্থ কী তাড়াতাড়ি দেখতে পাবেন। আমি আসলে আমার ডেটা ভাগ করে নেওয়ার কৌশলটি সমস্ত ডেটার (বা ভয়েক্সও কাজ করবে) এর জন্য ভ্যু prop --> comp.data-স্ট্যাশ ব্যবহারের পরিবর্তনের প্রক্রিয়াতে চলেছি । তবে এখন আমি কেবলমাত্র "আধুনিক" জেএস ফ্রেমওয়ার্কগুলি আমার উপর তাদের মতামত চাপিয়ে দেওয়ার আগে যেমনটি করতাম সেভাবে আমি আমার ডেটাটি অবজেক্টটি থেকে সরিয়ে ফেলছি । সুতরাং এটি প্রশ্নটি জিজ্ঞাসা করে: কমপ্যাট ডেটা সম্পত্তিটির বিন্দুটি কী? window
এজেবি

29

@ ডেমোকিক-সেরাফিনের উত্তরটির সহকর্মী:

আপনি যদি কোনও বস্তুটি পাস করছেন তবে আপনি স্প্রেড অপারেটর (ES6 সিনট্যাক্স) ব্যবহার করে সহজেই এটি ক্লোন করতে পারেন:

 props: {
   record: {
     type: Object,
     required: true
   }
 },

data () { // opt. 1
  return {
    recordLocal: {...this.record}
  }
},

computed: { // opt. 2
  recordLocal () {
    return {...this.record}
  }
},

তবে সবচেয়ে গুরুত্বপূর্ণ হ'ল অপ্টটি ব্যবহার করা মনে রাখা। 2 যদি আপনি একটি গণিত মান, বা তার চেয়েও বেশি একটি অ্যাসিনক্রোনাস মানকে দিয়ে যাচ্ছেন। অন্যথায় স্থানীয় মান আপডেট হবে না।

ডেমো:

Vue.component('card', { 
  template: '#app2',
  props: {
    test1: null,
    test2: null
  },
  data () { // opt. 1
    return {
      test1AsData: {...this.test1}
    }
  },
  computed: { // opt. 2
    test2AsComputed () {
      return {...this.test2}
    }
  }
})

new Vue({
  el: "#app1",
  data () {
    return {
      test1: {1: 'will not update'},
      test2: {2: 'will update after 1 second'}
    }
  },
  mounted () {
    setTimeout(() => {
      this.test1 = {1: 'updated!'}
      this.test2 = {2: 'updated!'}
    }, 1000)
  }
})
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>

<div id="app1">
  <card :test1="test1" :test2="test2"></card>
</div>

<template id="app2">
  <div>
    test1 as data: {{test1AsData}}
    <hr />
    test2 as computed: {{test2AsComputed}}
  </div>
</template>

https://jsfiddle.net/nomikos3/eywraw8t/281070/


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

@ dominik-serafin হ্যাঁ, আপনি ঠিক বলেছেন, আমি ES6 এ একটি রেফারেন্স যুক্ত করেছি। ওয়েবপ্যাক ভিত্তিক অ্যাপ্লিকেশনগুলিতে আধুনিক জাভাস্ক্রিপ্টটির পুরো ব্যবহার করার জন্য প্রাক কনফিগার করা বাবেল থাকা এত সহজ।
ইগোর পররা

recordLocal: [...this.record](আমার ক্ষেত্রে রেকর্ডটি একটি অ্যারে) আমার পক্ষে কাজ করে না - ভ্যু উপাদানটি লোড করে এবং পরীক্ষা করার পরে recordআইটেমগুলি ধারণ করে এবং recordLocalখালি অ্যারে ছিল।
খ্রিস্টান

আমি যখন এটি নিখুঁত সম্পত্তি হিসাবে ব্যবহার করি তা ভাল হয়, আমার জন্য যখন আমি ডেটা ভিতরে রাখার চেষ্টা করি তখন এটি কাজ করে না = (... তবে আমি এটি ব্যবহার করে পেয়েছিcomputed
ফিলিপ মুনার

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

14

আমি বিশ্বাস করি আপনি এটি সঠিকভাবে করছেন কারণ ডক্সে যা বলা হয়েছে তা তাই।

একটি স্থানীয় ডেটা সম্পত্তি ব্যাখ্যা করুন যা প্রপের প্রাথমিক মানটিকে তার প্রাথমিক মান হিসাবে ব্যবহার করে

https://vuejs.org/guide/components.html#One- ওয়েভ- ডেটা- ফ্লো


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

এটি আমার পক্ষে কাজ করে এবং স্পষ্টভাবে নথিভুক্ত হয়। উপরের উত্তরে এই লাইনটি ভু ডকুমেন্টেশনের সাথে বিরোধ হিসাবে আমি যতদূর বলতে পারি "সতর্কতা: এই পদ্ধতিটি সুপারিশ করা হয়নি It এটি আপনার উপাদানগুলিকে অনির্দেশ্য করে তুলবে you যদি আপনার সন্তানের উপাদানগুলি থেকে পিতামাতাদের ডেটা সেট করতে হয় তবে হয় ভয়েস বা ব্যবহারের মতো স্টেট ম্যানেজমেন্ট ব্যবহার করুন use "ভি-মডেল"। "
নাথানিয়েল রিঙ্ক

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