Props
এই পৃষ্ঠাটি ধরে নেওয়া হচ্ছে আপনি ইতিমধ্যেই Components Basics পড়েছেন। আপনি যদি কম্পোনেন্টগুলিতে নতুন হন তবে প্রথমে এটি পড়ুন।
Props Declaration
Vue কম্পোনেন্টগুলির সুস্পষ্ট প্রপস ঘোষণার প্রয়োজন যাতে Vue জানে যে কোন বাহ্যিক প্রপগুলি কম্পোনেন্টে পাস করা হয়েছে তাকে ফলথ্রু বৈশিষ্ট্য হিসাবে গণ্য করা উচিত (যা এই বিভাগে) এ আলোচনা করা হবে৷
<script setup>
ব্যবহার করে এসএফসি-তে, প্রপগুলিকে defineProps()
ম্যাক্রো ব্যবহার করে ঘোষণা করা যেতে পারে:
vue
<script setup>
const props = defineProps(['foo'])
console.log(props.foo)
</script>
অ-<script setup>
কম্পোনেন্টগুলিতে, প্রপগুলি props
বিকল্প ব্যবহার করে ঘোষণা করা হয়:
js
export default {
props: ['foo'],
setup(props) {
// setup() receives props as the first argument.
console.log(props.foo)
}
}
লক্ষ্য করুন defineProps()
-এ পাস করা আর্গুমেন্ট props
অপশনে প্রদত্ত মানের সমান: একই প্রপস অপশন API দুটি ঘোষণা স্টাইলর মধ্যে ভাগ করা হয়েছে।
স্ট্রিংগুলির একটি অ্যারে ব্যবহার করে প্রপস ঘোষণা করার পাশাপাশি, আমরা অবজেক্ট সিনট্যাক্সও ব্যবহার করতে পারি:
js
// in <script setup>
defineProps({
title: String,
likes: Number
})
js
// in non-<script setup>
export default {
props: {
title: String,
likes: Number
}
}
অবজেক্ট ডিক্লারেশন সিনট্যাক্সের প্রতিটি প্রপার্টির জন্য, কী হল প্রপের নাম, যখন মানটি প্রত্যাশিত ধরনের কনস্ট্রাক্টর ফাংশন হওয়া উচিত।
এটি শুধুমাত্র আপনার কম্পোনেন্ট নথিভুক্ত করে না, তবে অন্য ডেভেলপারদেরও সতর্ক করবে ব্রাউজার কনসোলে আপনার কম্পোনেন্ট ব্যবহার করে যদি তারা ভুল টাইপ পাস করে। আমরা এই পৃষ্ঠার আরও নিচে prop validation সম্পর্কে আরও বিস্তারিত আলোচনা করব।
আপনি যদি <script setup>
এর সাথে TypeScript ব্যবহার করেন, তাহলে বিশুদ্ধ টাইপ টীকা ব্যবহার করে প্রপস ঘোষণা করাও সম্ভব:
vue
<script setup lang="ts">
defineProps<{
title?: string
likes?: number
}>()
</script>
আরো বিস্তারিত: Typing Component Props
Reactive Props Destructure
Vue এর প্রতিক্রিয়াশীলতা সিস্টেম সম্পত্তি অ্যাক্সেসের উপর ভিত্তি করে রাষ্ট্রীয় ব্যবহার ট্র্যাক করে। যেমন আপনি যখন কম্পিউটেড গেটার বা প্রহরীতে props.foo
অ্যাক্সেস করেন, তখন foo
প্রপ নির্ভরতা হিসেবে ট্র্যাক করা হয়।
সুতরাং, নিম্নলিখিত কোড দেওয়া:
js
const { foo } = defineProps(['foo'])
watchEffect(() => {
// runs only once before 3.5
// re-runs when the "foo" prop changes in 3.5+
console.log(foo)
})
সংস্করণ 3.4 এবং নীচে, foo
একটি প্রকৃত ধ্রুবক এবং কখনই পরিবর্তন হবে না। ভার্সন 3.5 এবং তার উপরে, Vue এর কম্পাইলার স্বয়ংক্রিয়ভাবে props
কে প্রিপেন করে। যখন একই <script setup>
ব্লকের কোড defineProps
থেকে ধ্বংস করা ভেরিয়েবল অ্যাক্সেস করে। সুতরাং উপরের কোডটি নিম্নলিখিতগুলির সমতুল্য হয়ে যায়:
js
const props = defineProps(['foo'])
watchEffect(() => {
// `foo` transformed to `props.foo` by the compiler
console.log(props.foo)
})
উপরন্তু, আপনি প্রপসের জন্য ডিফল্ট মান ঘোষণা করতে JavaScript এর নেটিভ ডিফল্ট মান সিনট্যাক্স ব্যবহার করতে পারেন। টাইপ-ভিত্তিক প্রপস ঘোষণা ব্যবহার করার সময় এটি বিশেষভাবে কার্যকর:
ts
const { foo = 'hello' } = defineProps<{ foo?: string }>()
আপনি যদি আপনার IDE-তে বিধ্বংসী প্রপস এবং স্বাভাবিক ভেরিয়েবলের মধ্যে আরও ভিজ্যুয়াল পার্থক্য রাখতে পছন্দ করেন, Vue-এর VSCode এক্সটেনশনটি ধ্বংসপ্রাপ্ত প্রপসের জন্য ইনলে-ইঙ্গিত সক্ষম করার জন্য একটি সেটিং প্রদান করে।
Passing Destructured Props into Functions
যখন আমরা একটি ফাংশনে একটি ধ্বংসপ্রাপ্ত প্রপ পাস করি, যেমন:
js
const { foo } = defineProps(['foo'])
watch(foo, /* ... */)
এটি প্রত্যাশিতভাবে কাজ করবে না কারণ এটি watch(props.foo, ...)
এর সমতুল্য - আমরা একটি প্রতিক্রিয়াশীল ডেটা উৎসের পরিবর্তে একটি মানকে watch
-তে পাস করছি। আসলে, Vue এর কম্পাইলার এই ধরনের কেস ধরবে এবং একটি সতর্কতা নিক্ষেপ করবে।
যেভাবে আমরা watch() => props.foo, ...)
দিয়ে একটি সাধারণ প্রপ দেখতে পারি, একইভাবে আমরা একটি ধ্বংসপ্রাপ্ত প্রপকে গেটারে মোড়ানোর মাধ্যমেও দেখতে পারি:
js
watch(() => foo, /* ... */)
উপরন্তু, প্রতিক্রিয়াশীলতা বজায় রাখার সময় আমাদের একটি বাহ্যিক ফাংশনে একটি ধ্বংসপ্রাপ্ত প্রপ পাস করার প্রয়োজন হলে এটি প্রস্তাবিত পদ্ধতি:
js
useComposable(() => foo)
বাহ্যিক ফাংশন গেটারকে কল করতে পারে (অথবা এটিকে toValue) দিয়ে যখন প্রদত্ত প্রপের পরিবর্তনগুলি ট্র্যাক করতে হবে, যেমন একটি গণনা করা বা প্রহরী গেটার মধ্যে.
Prop Passing Details
Prop Name Casing
আমরা camelCase ব্যবহার করে দীর্ঘ প্রপ নাম ঘোষণা করি কারণ এটি প্রপার্টি কী হিসাবে ব্যবহার করার সময় উদ্ধৃতিগুলি ব্যবহার করা এড়িয়ে যায় এবং আমাদেরকে সরাসরি টেমপ্লেট এক্সপ্রেশনে তাদের উল্লেখ করার অনুমতি দেয় কারণ তারা বৈধ জাভাস্ক্রিপ্ট শনাক্তকারী:
js
defineProps({
greetingMessage: String
})
template
<span>{{ greetingMessage }}</span>
টেকনিক্যালি, আপনি চাইল্ড কম্পোনেন্টে প্রপস দেওয়ার সময় ক্যামেলকেস ব্যবহার করতে পারেন (except in in-DOM templates)। যাইহোক, কনভেনশন এইচটিএমএল বৈশিষ্ট্যের সাথে সারিবদ্ধ করার জন্য সব ক্ষেত্রে কাবাব-কেস ব্যবহার করছে:
template
<MyComponent greeting-message="hello" />
আমরা যখনই সম্ভব কম্পোনেন্ট ট্যাগের জন্য PascalCase ব্যবহার করি কারণ এটি Vue কম্পোনেন্টগুলিকে নেটিভ কম্পোনেন্ট থেকে আলাদা করে টেমপ্লেট পাঠযোগ্যতা উন্নত করে। যাইহোক, প্রপস পাস করার সময় ক্যামেলকেস ব্যবহার করার মতো ব্যবহারিক সুবিধা নেই, তাই আমরা প্রতিটি ভাষার নিয়ম অনুসরণ করা বেছে নিই।
Static vs. Dynamic Props
এখনও অবধি, আপনি প্রপগুলিকে স্ট্যাটিক মান হিসাবে পাস করতে দেখেছেন, যেমন:
template
<BlogPost title="My journey with Vue" />
আপনি v-bind
বা এর :
শর্টকাটের সাথে গতিশীলভাবে বরাদ্দ করা প্রপসও দেখেছেন, যেমন:
template
<!-- Dynamically assign the value of a variable -->
<BlogPost :title="post.title" />
<!-- Dynamically assign the value of a complex expression -->
<BlogPost :title="post.title + ' by ' + post.author.name" />
Passing Different Value Types
উপরের দুটি উদাহরণে, আমরা স্ট্রিং মান পাস করি, কিন্তু যেকোনো ধরনের মান একটি প্রপে পাস করা যেতে পারে।
Number
template
<!-- Even though `42` is static, we need v-bind to tell Vue that -->
<!-- this is a JavaScript expression rather than a string. -->
<BlogPost :likes="42" />
<!-- Dynamically assign to the value of a variable. -->
<BlogPost :likes="post.likes" />
Boolean
template
<!-- Including the prop with no value will imply `true`. -->
<BlogPost is-published />
<!-- Even though `false` is static, we need v-bind to tell Vue that -->
<!-- this is a JavaScript expression rather than a string. -->
<BlogPost :is-published="false" />
<!-- Dynamically assign to the value of a variable. -->
<BlogPost :is-published="post.isPublished" />
Array
template
<!-- Even though the array is static, we need v-bind to tell Vue that -->
<!-- this is a JavaScript expression rather than a string. -->
<BlogPost :comment-ids="[234, 266, 273]" />
<!-- Dynamically assign to the value of a variable. -->
<BlogPost :comment-ids="post.commentIds" />
Object
template
<!-- Even though the object is static, we need v-bind to tell Vue that -->
<!-- this is a JavaScript expression rather than a string. -->
<BlogPost
:author="{
name: 'Veronica',
company: 'Veridian Dynamics'
}"
/>
<!-- Dynamically assign to the value of a variable. -->
<BlogPost :author="post.author" />
Binding Multiple Properties Using an Object
আপনি যদি একটি অবজেক্টর সমস্ত বৈশিষ্ট্যকে প্রপ হিসাবে পাস করতে চান তবে আপনি যুক্তি ছাড়াই v-bind
ব্যবহার করতে পারেন (v-bind `` এর পরিবর্তে
:প্রপ-নাম`)। উদাহরণস্বরূপ, একটি 'পোস্ট' অবজেক্ট দেওয়া হয়েছে:
js
const post = {
id: 1,
title: 'My Journey with Vue'
}
নিম্নলিখিত টেমপ্লেট:
template
<BlogPost v-bind="post" />
এর সমতুল্য হবে:
template
<BlogPost :id="post.id" :title="post.title" />
One-Way Data Flow
সমস্ত প্রপস চাইল্ড কম্পিউটেড প্রপার্টি এবং পিতামাতার মধ্যে একটি ওয়ান-ওয়ে-ডাউন বাইন্ডিং গঠন করে: যখন পিতামাতার কম্পিউটেড প্রপার্টি আপডেট হয়, তখন এটি সন্তানের কাছে প্রবাহিত হবে, তবে অন্যভাবে নয়। এটি চাইল্ডর কম্পোনেন্টগুলিকে দুর্ঘটনাক্রমে পিতামাতার অবস্থা পরিবর্তন করতে বাধা দেয়, যা আপনার অ্যাপের ডেটা প্রবাহকে বোঝা কঠিন করে তুলতে পারে।
উপরন্তু, প্রতিবার অভিভাবক কম্পোনেন্ট আপডেট করা হয়, চাইল্ড কম্পোনেন্টের সমস্ত প্রপস সর্বশেষ মান সহ রিফ্রেশ করা হবে। এর মানে হল আপনার চাইল্ড কম্পোনেন্টের ভিতরে প্রপ মিউটেট করার চেষ্টা না করা উচিত। আপনি যদি তা করেন, Vue আপনাকে কনসোলে সতর্ক করবে:
js
const props = defineProps(['foo'])
// ❌ warning, props are readonly!
props.foo = 'bar'
সাধারণত দুটি ক্ষেত্রে এটি একটি প্রপ পরিবর্তন করতে প্রলুব্ধ করে:
প্রপটি একটি প্রাথমিক মান পাস করতে ব্যবহৃত হয়; চাইল্ড কম্পোনেন্ট এটিকে পরবর্তীতে একটি স্থানীয় ডেটা কম্পিউটেড প্রপার্টি হিসাবে ব্যবহার করতে চায়। এই ক্ষেত্রে, একটি স্থানীয় ডেটা কম্পিউটেড প্রপার্টি সংজ্ঞায়িত করা ভাল যা প্রারম্ভিক মান হিসাবে প্রপ ব্যবহার করে:
jsconst props = defineProps(['initialCounter']) // counter only uses props.initialCounter as the initial value; // it is disconnected from future prop updates. const counter = ref(props.initialCounter)
প্রপটি একটি raw মান হিসাবে পাস করা হয়েছে যা রূপান্তরিত করা দরকার। এই ক্ষেত্রে, প্রপের মান ব্যবহার করে একটি গণনা করা কম্পিউটেড প্রপার্টি সংজ্ঞায়িত করা ভাল:
jsconst props = defineProps(['size']) // computed property that auto-updates when the prop changes const normalizedSize = computed(() => props.size.trim().toLowerCase())
Mutating Object / Array Props
যখন অবজেক্ট এবং অ্যারেগুলিকে প্রপ হিসাবে পাস করা হয়, যখন চাইল্ড কম্পোনেন্ট প্রপ বাইন্ডিংকে পরিবর্তন করতে পারে না, তখন এটি অবজেক্ট বা অ্যারের নেস্টেড বৈশিষ্ট্যগুলিকে পরিবর্তিত করতে সক্ষম হবে। এর কারণ হল জাভাস্ক্রিপ্টে অবজেক্ট এবং অ্যারে রেফারেন্স দ্বারা পাস করা হয় এবং এই ধরনের মিউটেশন প্রতিরোধ করা Vue-এর জন্য অযৌক্তিকভাবে ব্যয়বহুল।
এই ধরনের মিউটেশনগুলির প্রধান ত্রুটি হল যে এটি চাইল্ড কম্পোনেন্টটিকে এমনভাবে পিতামাতার অবস্থাকে প্রভাবিত করতে দেয় যা পিতামাতার কম্পোনেন্টের কাছে স্পষ্ট নয়, সম্ভাব্যভাবে ভবিষ্যতে ডেটা প্রবাহ সম্পর্কে যুক্তি করা আরও কঠিন করে তোলে। একটি সর্বোত্তম অভ্যাস হিসাবে, আপনার এই ধরনের মিউটেশন এড়ানো উচিত যদি না পিতামাতা এবং সন্তানের নকশা দ্বারা শক্তভাবে মিলিত হয়। বেশিরভাগ ক্ষেত্রে, সন্তানের উচিত একটি ইভেন্ট নির্গত করা যাতে পিতামাতাকে মিউটেশন করতে দেয়।
Prop Validation
কম্পোনেন্টগুলি তাদের প্রপসের জন্য প্রয়োজনীয়তা নির্দিষ্ট করতে পারে, যেমন আপনি ইতিমধ্যে দেখেছেন প্রকারগুলি। কোনো প্রয়োজন পূরণ না হলে, Vue আপনাকে ব্রাউজারের JavaScript কনসোলে সতর্ক করবে। অন্যদের দ্বারা ব্যবহার করার উদ্দেশ্যে এমন একটি কম্পোনেন্ট তৈরি করার সময় এটি বিশেষভাবে কার্যকর।
প্রপ যাচাইকরণ নির্দিষ্ট করতে, আপনি defineProps()
macro , স্ট্রিংগুলির একটি অ্যারের পরিবর্তে। উদাহরণ স্বরূপ:
js
defineProps({
// Basic type check
// (`null` and `undefined` values will allow any type)
propA: Number,
// Multiple possible types
propB: [String, Number],
// Required string
propC: {
type: String,
required: true
},
// Required but nullable string
propD: {
type: [String, null],
required: true
},
// Number with a default value
propE: {
type: Number,
default: 100
},
// Object with a default value
propF: {
type: Object,
// Object or array defaults must be returned from
// a factory function. The function receives the raw
// props received by the component as the argument.
default(rawProps) {
return { message: 'hello' }
}
},
// Custom validator function
// full props passed as 2nd argument in 3.4+
propG: {
validator(value, props) {
// The value must match one of these strings
return ['success', 'warning', 'danger'].includes(value)
}
},
// Function with a default value
propH: {
type: Function,
// Unlike object or array default, this is not a factory
// function - this is a function to serve as a default value
default() {
return 'Default function'
}
}
})
TIP
defineProps()
আর্গুমেন্টের ভিতরের কোড <script setup>
-এ ঘোষিত অন্যান্য ভেরিয়েবল অ্যাক্সেস করতে পারে না, কারণ কম্পাইল করার সময় সম্পূর্ণ এক্সপ্রেশন একটি বাইরের ফাংশন স্কোপে সরানো হয়।
অতিরিক্ত বিস্তারিত:
সমস্ত প্রপস ডিফল্টরূপে ঐচ্ছিক, যদি না
required: true
নির্দিষ্ট করা হয়।Boolean
ব্যতীত একটি অনুপস্থিত ঐচ্ছিক প্রপ হবেundefined
মান।Boolean
অনুপস্থিত প্রপগুলিকেfalse
তে নিক্ষেপ করা হবে। আপনি এটির জন্য একটিdefault
সেট করে এটি পরিবর্তন করতে পারেন — যেমন:default: undefined
একটি নন-বুলিয়ান প্রপ হিসাবে আচরণ করতে।যদি একটি
default
মান নির্দিষ্ট করা থাকে, তাহলে এটি ব্যবহার করা হবে যদি সমাধানকৃত প্রপ মানundefined
হয় - এতে প্রপ অনুপস্থিত থাকলে বা একটি সুস্পষ্টundefined
মান পাস হলে উভয়ই অন্তর্ভুক্ত থাকে।
যখন প্রপ বৈধতা যাচাই করতে ব্যর্থ হয়, Vue একটি কনসোল সতর্কতা তৈরি করবে (যদি development বিল্ড ব্যবহার করে)।
Type-based props declarations ব্যবহার করলে, Vue কম্পাইল করার জন্য যথাসাধ্য চেষ্টা করবে সমতুল্য রানটাইম প্রপ ঘোষণায় টীকা টাইপ করুন। উদাহরণস্বরূপ, defineProps<{ msg: string }>
কম্পাইল করা হবে { msg: { type: String, required: true }}
-এ।
Runtime Type Checks
type
নিম্নলিখিত নেটিভ কনস্ট্রাক্টরগুলির মধ্যে একটি হতে পারে:
String
Number
Boolean
Array
Object
Date
Function
Symbol
Error
এছাড়াও, type
একটি কাস্টম ক্লাস বা কনস্ট্রাক্টর ফাংশনও হতে পারে এবং দাবিটি instanceof
চেকের মাধ্যমে করা হবে। উদাহরণস্বরূপ, নিম্নলিখিত ক্লাস দেওয়া:
js
class Person {
constructor(firstName, lastName) {
this.firstName = firstName
this.lastName = lastName
}
}
আপনি এটি একটি প্রপের প্রকার হিসাবে ব্যবহার করতে পারেন:
js
defineProps({
author: Person
})
author
প্রপের মান প্রকৃতপক্ষে Person
শ্রেণীর একটি উদাহরণ কিনা তা যাচাই করতে Vue instanceof Person
ব্যবহার করবে।
Nullable Type
যদি টাইপটি প্রয়োজন হয় তবে বাতিলযোগ্য, আপনি অ্যারে সিনট্যাক্স ব্যবহার করতে পারেন যাতে null
অন্তর্ভুক্ত থাকে:
js
defineProps({
id: {
type: [String, null],
required: true
}
})
মনে রাখবেন যে যদি অ্যারে সিনট্যাক্স ব্যবহার না করে type
শুধুমাত্র null
হয়, তাহলে এটি যেকোনো প্রকারের অনুমতি দেবে।
Boolean Casting
Boolean
টাইপের প্রপগুলিতে নেটিভ বুলিয়ান অ্যাট্রিবিউটের আচরণ অনুকরণ করার জন্য বিশেষ কাস্টিং নিয়ম রয়েছে৷ নিম্নলিখিত ঘোষণার সাথে একটি <MyComponent>
দেওয়া হয়েছে:
js
defineProps({
disabled: Boolean
})
component এই মত ব্যবহার করা যেতে পারে:
template
<!-- equivalent of passing :disabled="true" -->
<MyComponent disabled />
<!-- equivalent of passing :disabled="false" -->
<MyComponent />
যখন একাধিক প্রকারের অনুমতি দেওয়ার জন্য একটি প্রপ ঘোষণা করা হয়, তখন Boolean
এর জন্য কাস্টিং নিয়মগুলিও প্রয়োগ করা হবে। যাইহোক, একটি প্রান্ত আছে যখন String
এবং Boolean
উভয়ই অনুমোদিত - বুলিয়ান কাস্টিং নিয়ম শুধুমাত্র তখনই প্রযোজ্য হয় যদি স্ট্রিং-এর আগে বুলিয়ান উপস্থিত হয়:
js
// disabled will be casted to true
defineProps({
disabled: [Boolean, Number]
})
// disabled will be casted to true
defineProps({
disabled: [Boolean, String]
})
// disabled will be casted to true
defineProps({
disabled: [Number, Boolean]
})
// disabled will be parsed as an empty string (disabled="")
defineProps({
disabled: [String, Boolean]
})