Vue $emit()
Vue-dagi o‘rnatilgan $emit() metodi yordamida bola komponentda ota elementda ushlab olinadigan maxsus hodisa (event) yaratishimiz mumkin.
Props ota elementdan bola komponentga ma’lumot yuborish uchun, $emit() esa buning aksini bajarish uchun ishlatiladi: bola komponentdan ota komponentga ma’lumot uzatish uchun.
Keyingi harakatlarimizning maqsadi oziq-ovqat mahsulotining “sevimli” maqomiga ega bo‘lish, o‘zgarish hozirda sodir bo‘layotgan FoodItem.vue bola komponentida emas, balki ota-ona App.vue da o‘zgartirilishidir.
Sevimli holatni FoodItem.vue o‘rniga App.vue-da o‘zgartirishning sababi shundaki, App.vue sevimli status birinchi navbatda saqlanadi, shuning uchun uni yangilash kerak. Kattaroq loyihada ma’lumotlar biz App.vue’da bog‘langan ma’lumotlar bazasidan olinishi mumkin va biz ma’lumotlar bazasiga o‘zgartirish kiritish uchun komponentda sodir bo‘layotgan o‘zgarishlarni xohlaymiz, shuning uchun biz ota-onaga bola komponentidan qayta aloqa qilishimiz kerak.
Maxsus hodisani chiqarish
Komponentdan ota komponentga ma’lumot yuborish zarurati bor va buning uchun o‘rnatilgan $emit() metodidan foydalanamiz.
Bizda allaqachon FoodItem.vue komponentida toggleFavorite usuli mavjud bo‘lib, u o‘zgartirish tugmasi bosilganda ishlaydi. Keling, mavjud qatorni olib tashlaymiz va "toggle-favorite" maxsus hodisamizni chiqarish uchun qator qo‘shamiz:
FoodItem.vue:
methods: {
toggleFavorite() {
this.foodIsFavorite = !this.foodIsFavorite;
this.$emit('toggle-Favorite');
}
}
Biz maxsus tadbirimiz nomini tanlashimiz mumkin, ammo emitatsiya hodisalari uchun kabob qutisidan foydalanish odatiy holdir.
Emissiya hodisasini oling
Maxsus emissiya hodisasi "toggle-favorite" endi FoodItem.vue komponentidan chiqariladi, lekin biz voqeani App.vue ota-onasida tinglashimiz va voqea sodir bo‘lganini ko‘rishimiz uchun biror narsa qiladigan usulni chaqirishimiz kerak.
Biz voqeani v-on o‘rniga @ stenografiyasi bilan tinglaymiz: komponent yaratilgan App.vue da:
Misol
App.vue-da "sevimli o‘zgartirish" hodisasini tinglang:
<food-item
v-for="x in foods"
:key="x.name"
:food-name="x.name"
:food-desc="x.desc"
:is-favorite="x.favorite"
@toggle-favorite="receiveEmit"
/>
Bizning maxsus "sevimli o‘zgartirish" hodisamiz sodir bo‘lganda, voqea sodir bo‘lganligini ko‘rishimiz uchun App.vue’da receiveEmit usulini yaratishimiz kerak:
methods: {
receiveEmit() {
alert('Hello World!');
}
}
Misolni ishga tushirish »
Ota-onada oziq-ovqat mahsulotining "sevimli" holatini o‘zgartiring
Endi bizda bola komponentidan "Sevimli" tugmasi bosilganda App.vue ga xabar beradigan hodisa (event) mavjud.
Biz “Sevimli” tugmasi bosilganda, App.vue’dagi “ovqatlar” massividagi “sevimli” xususiyatini to‘g‘ri oziq-ovqat mahsuloti uchun o‘zgartirmoqchimiz. Buning uchun biz oziq-ovqat mahsuloti nomini FoodItem.vue dan App.vue saytiga yuboramiz, chunki bu har bir oziq-ovqat mahsuloti uchun noyobdir:
FoodItem.vue:
methods: {
toggleFavorite() {
this.$emit('toggle-favorite', this.foodName);
}
}
Endi biz App.vue’da oziq-ovqat mahsuloti nomini “sevimli o‘zgartirish” hodisasi sodir bo‘lganda chaqiriladigan usulga argument sifatida olishimiz mumkin, masalan:
Misol
App.vue:
methods: {
receiveEmit(foodId) {
alert( 'You clicked: ' + foodId );
}
}
Misolni ishga tushirish »
Endi biz qaysi oziq-ovqat mahsuloti bosilganini bilganimizdan so‘ng, "oziq-ovqatlar" massividagi to‘g‘ri oziq-ovqat mahsuloti uchun "sevimli" holatini yangilashimiz mumkin:
App.vue:
methods: {
receiveEmit(foodId) {
const foundFood = this.foods.find(
food => food.name === foodId
);
foundFood.favorite = !foundFood.favorite;
}
}
Yuqoridagi kodda "topish" massiv usuli "foods" massividan o‘tadi va biz bosgan oziq-ovqat mahsulotiga teng nom xususiyatiga ega obyektni qidiradi va bu obyektni "foundFood" sifatida qaytaradi. Shundan so‘ng biz "foundFood.favorite" ni avvalgisiga qarama-qarshi qilib sozlashimiz mumkin, shunda u rost va yolg‘on o‘rtasida almashadi.
JavaScript massivining "topish" usuli haqida ko‘proq bilib oling.
Bu yerda JavaScript strelka funksiyalari haqida ko‘proq bilib oling.
"Oziq-ovqatlar" massividagi to‘g‘ri taom endi "sevimli" holatini yangilaydi. Qolgan yagona narsa - sevimli taomni ko‘rsatadigan rasmni yangilash.
Taom komponentlari allaqachon “foods” massividagi “favorite” holati bilan yaratilgani va App.vue’dan “is-favorite” prop’i sifatida yuborilgani sababli, tasvirni yangilash uchun FoodItem.vue faylidagi <img> elementining v-show direktivasida shu “isFavorite” prop’iga murojaat qilishimiz kifoya:
<img src="/img_quality.svg" v-show="isFavorite">
FoodItem.vue saytidagi "foodIsFavorite" ma’lumotlar xususiyatini ham o‘chirib tashlashimiz mumkin, chunki u endi ishlatilmaydi.
Misol
Ushbu oxirgi misol kodida oziq-ovqat mahsulotlarining sevimli holati avvalgidek o‘zgartirilishi mumkin, ammo endi sevimli holat App.vue ichida to‘g‘ri joyda o‘zgartirilgan.
Misolni ishga tushirish »"Emissiya" varianti
FoodItem.vue komponentida prop’larni e’lon qilganimiz kabi, Vue "emits" opsiyasidan foydalanib komponent nimalarni emit qilishini ham hujjatlashtirishimiz mumkin.
Prop’lar komponentda e’lon qilinishi shart, emit’larni esa hujjatlashtirish shunchaki tavsiya etiladi.
FoodItem.vue komponentida emissiyamizni shunday hujjatlashimiz mumkin:
<script>
export default {
props: ['foodName','foodDesc','isFavorite'],
emits: ['toggle-favorite'],
methods: {
toggleFavorite() {
this.$emit('toggle-favorite', this.foodName);
}
}
};
</script>
Emissiyalar hujjatlashtirilganda komponentdan boshqalardan foydalanish osonroq bo‘ladi.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
