Component Events
এই পৃষ্ঠাটি ধরে নেওয়া হচ্ছে আপনি ইতিমধ্যেই Components Basics পড়েছেন। আপনি যদি কম্পোনেন্টগুলিতে নতুন হন তবে প্রথমে এটি পড়ুন।
Emitting and Listening to Events
একটি component অন্তর্নির্মিত $emit
পদ্ধতি ব্যবহার করে সরাসরি টেমপ্লেট এক্সপ্রেশনে (যেমন v-on
হ্যান্ডলারে) কাস্টম ইভেন্ট নির্গত করতে পারে:
template
<!-- MyComponent -->
<button @click="$emit('someEvent')">click me</button>
তারপর parent v-on
ব্যবহার করে এটি শুনতে পারেন:
template
<MyComponent @some-event="callback" />
.once
সংশোধকটি কম্পোনেন্ট ইভেন্ট শ্রোতাদের জন্যও সমর্থিত:
template
<MyComponent @some-event.once="callback" />
উপাদান এবং প্রপসের মতো, ইভেন্টের নামগুলি একটি স্বয়ংক্রিয় কেস রূপান্তর প্রদান করে। লক্ষ্য করুন আমরা একটি ক্যামেলকেস ইভেন্ট নির্গত করেছি, কিন্তু পিতামাতার মধ্যে একটি কাবাব-কেসড শ্রোতা ব্যবহার করে এটি শুনতে পারি। প্রপস কেসিং এর মতো, আমরা টেমপ্লেটে কাবাব-কেসড ইভেন্ট শ্রোতাদের ব্যবহার করার পরামর্শ দিই।
TIP
নেটিভ DOM ইভেন্টের বিপরীতে, কম্পোনেন্ট নির্গত ইভেন্টগুলি বুদ্বুদ না করে। আপনি শুধুমাত্র একটি সরাসরি চাইল্ড কম্পোনেন্ট দ্বারা নির্গত ঘটনা শুনতে পারেন. ভাইবোন বা গভীরভাবে নেস্টেড কম্পোনেন্টগুলির মধ্যে যোগাযোগ করার প্রয়োজন হলে, একটি বহিরাগত ইভেন্ট বাস বা একটি গ্লোবাল স্টেট ম্যানেজমেন্ট সলিউশন ব্যবহার করুন।
Event Arguments
এটি কখনও কখনও একটি ইভেন্টের সাথে একটি নির্দিষ্ট মান নির্গত করা দরকারী। উদাহরণ স্বরূপ, আমরা <BlogPost>
কম্পোনেন্টকে টেক্সটকে কতটা বড় করতে হবে তার দায়িত্বে থাকতে চাই। এই ক্ষেত্রে, আমরা এই মান প্রদান করতে $emit
-এ অতিরিক্ত আর্গুমেন্ট পাঠাতে পারি:
template
<button @click="$emit('increaseBy', 1)">
Increase by 1
</button>
তারপর, যখন আমরা পিতামাতার ইভেন্টটি শুনি, তখন আমরা শ্রোতা হিসাবে একটি ইনলাইন তীর ফাংশন ব্যবহার করতে পারি, যা আমাদের ইভেন্ট আর্গুমেন্ট অ্যাক্সেস করতে দেয়:
template
<MyButton @increase-by="(n) => count += n" />
অথবা, যদি ইভেন্ট হ্যান্ডলার একটি পদ্ধতি হয়:
template
<MyButton @increase-by="increaseCount" />
তারপর মানটি সেই পদ্ধতির প্রথম প্যারামিটার হিসাবে পাস করা হবে:
js
function increaseCount(n) {
count.value += n
}
TIP
ইভেন্টের নামের পরে সমস্ত অতিরিক্ত আর্গুমেন্ট $emit()
-এ পাঠানো হয়েছে শ্রোতার কাছে ফরোয়ার্ড করা হবে। উদাহরণস্বরূপ, $emit('foo', 1, 2, 3)
দিয়ে শ্রোতা ফাংশন তিনটি আর্গুমেন্ট পাবে।
Declaring Emitted Events
একটি কম্পোনেন্ট স্পষ্টভাবে ইভেন্ট ঘোষণা করতে পারে এটি ব্যবহার করে নির্গত হবে defineEmits()
ম্যাক্রো :
vue
<script setup>
defineEmits(['inFocus', 'submit'])
</script>
আমরা <template>
এ যে $emit
পদ্ধতিটি ব্যবহার করেছি সেটি কোনো কম্পোনেন্টের <script setup>
বিভাগে অ্যাক্সেসযোগ্য নয়, কিন্তু defineEmits()
একটি সমতুল্য ফাংশন প্রদান করে যা আমরা পরিবর্তে ব্যবহার করতে পারি:
vue
<script setup>
const emit = defineEmits(['inFocus', 'submit'])
function buttonClick() {
emit('submit')
}
</script>
defineEmits()
ম্যাক্রো কোনও ফাংশনের ভিতরে ব্যবহার করা যাবে না, এটি অবশ্যই উপরের উদাহরণের মতো সরাসরি <script setup>
-এর মধ্যে রাখতে হবে।
আপনি যদি <script setup>
এর পরিবর্তে একটি স্পষ্ট setup
ফাংশন ব্যবহার করেন, তবে ইভেন্টগুলি emits
বিকল্প ব্যবহার করে ঘোষণা করা উচিত এবং emit
ফাংশনটি হল setup()
প্রসঙ্গে প্রকাশ করা হয়েছে:
js
export default {
emits: ['inFocus', 'submit'],
setup(props, ctx) {
ctx.emit('submit')
}
}
setup()
প্রসঙ্গের অন্যান্য বৈশিষ্ট্যের মতো, emit
নিরাপদে ধ্বংস করা যেতে পারে:
js
export default {
emits: ['inFocus', 'submit'],
setup(props, { emit }) {
emit('submit')
}
}
emits
অপশন এবং defineEmits()
ম্যাক্রোও একটি অবজেক্ট সিনট্যাক্স সমর্থন করে। TypeScript ব্যবহার করলে আপনি আর্গুমেন্ট টাইপ করতে পারেন, যা আমাদের নির্গত ইভেন্টের পেলোডের রানটাইম বৈধতা সম্পাদন করতে দেয়:
vue
<script setup>
const emit = defineEmits({
submit(payload: { email: string, password: string }) {
// return `true` or `false` to indicate
// validation pass / fail
}
})
</script>
আপনি যদি <script setup>
এর সাথে TypeScript ব্যবহার করেন, তাহলে বিশুদ্ধ ধরনের টীকা ব্যবহার করে নির্গত ইভেন্ট ঘোষণা করাও সম্ভব:
vue
<script setup lang="ts">
const emit = defineEmits<{
(e: 'change', id: number): void
(e: 'update', value: string): void
}>()
</script>
আরো বিস্তারিত: টাইপিং কম্পোনেন্ট এমিটস
যদিও ঐচ্ছিক, একটি কম্পোনেন্ট কীভাবে কাজ করবে তা আরও ভালভাবে নথি করার জন্য সমস্ত নির্গত ইভেন্টকে সংজ্ঞায়িত করার সুপারিশ করা হয়। এটি Vue-কে পরিচিত শ্রোতাদের fallthrough attributes থেকে বাদ দেওয়ার অনুমতি দেয়, 3য় পক্ষের কোড দ্বারা ম্যানুয়ালি প্রেরিত DOM ইভেন্টের কারণে এজ কেস এড়িয়ে যায়।
TIP
যদি একটি নেটিভ ইভেন্ট (যেমন, click
) emits
বিকল্পে সংজ্ঞায়িত করা হয়, তাহলে শ্রোতা এখন শুধুমাত্র কম্পোনেন্ট-নির্গত click
ইভেন্ট শুনবে এবং নেটিভ click
ইভেন্টে আর সাড়া দিবে না।
Events Validation
প্রপ টাইপ ভ্যালিডেশনের অনুরূপ, একটি নির্গত ইভেন্টকে বৈধ করা যেতে পারে যদি এটি অ্যারে সিনট্যাক্সের পরিবর্তে অবজেক্ট সিনট্যাক্স দিয়ে সংজ্ঞায়িত করা হয়।
বৈধতা যোগ করতে, ইভেন্টটিকে একটি ফাংশন বরাদ্দ করা হয় যা emit
-এ পাস করা আর্গুমেন্টগুলি গ্রহণ করে কল করে এবং ইভেন্টটি বৈধ কিনা তা নির্দেশ করতে একটি বুলিয়ান ফেরত দেয়।
vue
<script setup>
const emit = defineEmits({
// No validation
click: null,
// Validate submit event
submit: ({ email, password }) => {
if (email && password) {
return true
} else {
console.warn('Invalid submit event payload!')
return false
}
}
})
function submitForm(email, password) {
emit('submit', { email, password })
}
</script>