1. 自定义组件间也可以和普通标签(<div> <span>)一样指定属性传参
2. 形如(<child value="hello coolight"></child>)给组件<child>指定value属性为"hello coolight"
3. 我们也可以自己模拟v-model的效果
下面我们来聊聊怎么传参、接收与更新
目录
传参,v-bind
- 子组件接收参数需要使用一个函数defineProps()
- defineProps():
- 不需要import导入即可使用
- 只能在<script setup>中使用
- 不可以在局部变量中使用这个函数
- 不可以访问 <script setup> 中定义的其他变量
- 需要传入自定义参数名,[可选]指定参数类型,[可选]指定参数是否必须传入,[可选]指定参数的默认值。
- 类型:
- Number
- Boolean
- String
- Function
- Object
- Array
- ...
- 类型:
- 返回组件的接收所有参数构成的一个对象
- 当类型不对或是指定必须传入而没有传入时,vue将会有警告,报错
- 必须传入但没有传入:
- -
- 传入类型错误:
- 示例:
- 组件:
<script setup>
import { toRefs } from 'vue';
const props = defineProps({
text:{
type:String,
default:"默认:hello coolight",
required:false
}
})
const {
text,
} = toRefs(props);
</script>
<template>
<span>{{props.text}} - {{text}}</span>
</template>
- -
- 使用组件
<script setup>
import helloVue from '../../components/global/hello.vue';
</script>
<template>
<div>
<hello-vue />
<hello-vue text="洛天依"/>
<hello-vue :text="'v-bind:洛天依'" />
</div>
</template>
- 解析:
- 组件定义了一个要接收的参数text,并指定了它的类型为字符串String,默认值,并且它并不是必须传入的。
- 组件的<template>中,可以通过props访问参数props.text,也可以使用toRefs,解构出来。
- toRefs()需要import
- 如果不使用toRefs(),直接解构将导致参数失去响应性
- 在使用组件时,可以直接指定参数并传参,也可以使用v-bind,动态传参。
- 运行结果:
v-model
一般的传参进来,组件对它是只读的,不能修改。
只读也并不完全,对于数组和对象是可以操作其内部值的。
但我们可以使用v-model指定参数,使之允许组件来修改它。
”只读“的探讨
- 这个只读限制和const声明一样。
- 只读是针对变量本身的指向,如果你了解c/c++的指针则会很好理解,它限制了变量的指向,但对于变量指向的内容是可以操作的。
- 比如对数组、对象的内部变量的操作则是可以的,但不能让变量指向别的数组或对象,如 list = [],就是直接让list变量重新指向新的空数组[]。
- 示例:
- 组件:
<script setup>
import { reactive } from 'vue';
import { toRefs } from 'vue';
const props = defineProps({
obj:{
type:Object
}
})
const {
obj,
} = toRefs(props);
const btn1_click = () => {
props.obj.hello = "coolight - 1";
}
const btn2_click = () => {
props.obj = reactive({
hello:"coolight - 2"
})
}
</script>
<template>
<div>
<button @click="btn1_click">1: {{obj.hello}}</button>
<button @click="btn2_click">2: {{obj.hello}}</button>
</div>
</template>
- -
- 使用组件:
<script setup>
import { reactive } from 'vue';
import helloVue from '../../../components/global/hello.vue';
let obj = reactive({
hello:"洛天依"
})
</script>
<template>
<div>
<span>span: {{obj.hello}}</span>
<hello-vue :obj="obj" />
</div>
</template>
- 注意:
- 在使用组件的代码中,obj被使用reactive()进行赋值,因此获得了响应性,如果直接定义为一个对象,obj就没有响应性,后续无论在父子组件中修改obj,html页面的显示内容都不会改变。
- 运行结果:
- 点击btn2时修改失败,触发警告,提示变量obj是只读的:
使用v-model
- 使用v-model则可以解决上述问题
- 在这之前,组件内需要定义一个更新信号,“update:valueName”,其中的valueName为参数名
- 我们上面的例子里的参数是obj,因此信号就是 “update:obj”
- 使用defineEmits()可以定义信号,而它也是我们后面自定义事件的重点。
- 发出修改信号 emits("信号名", 传参);
- 示例:
- 组件:
<script setup>
import { toRefs } from 'vue';
const props = defineProps({
obj:{
type:Object
}
})
const emits = defineEmits ({
'update:obj':null //null位置可以是一个检查函数,用以检查绑定这个信号的处理函数是否有接收参数等,这里就不需要了
});
const {
obj,
} = toRefs(props);
const btn1_click = () => {
props.obj.hello = "btn1";
}
const btn2_click = () => {
emits('update:obj', {
hello:"btn2"
});
}
</script>
<template>
<div>
<button @click="btn1_click">{{obj.hello}} - 修改为 btn1</button>
<button @click="btn2_click">{{obj.hello}} - 修改为 btn2</button>
</div>
</template>
- -
- 使用组件:
<script setup>
import { reactive } from 'vue';
import helloVue from '../../../components/global/hello.vue';
let mValue = reactive({
obj:{
hello:"洛天依"
},
})
</script>
<template>
<div>
<span>span: {{mValue.obj.hello}}</span>
<hello-vue v-model:obj="mValue.obj"/>
</div>
</template>
- 注意:
- 即使使用了v-model,我们也不能直接在组件中用=修改obj(如obj = { hello:"wow" } 是不行的)
- 需要修改obj时,使用emits()发出信号即可
- 注意在使用组件的代码中,我们使用mValue包裹了obj后再传递给了子组件,因为如果同上一个例子中,直接声明obj后传递,在修改时会发生一些问题。因此建议把它放reactive()内。
- 运行结果:
尝试取代v-model
- 在上面的例子里,我们已经知道,修改obj时是发出了一个信号"update:obj"
- 那么我们就可以自己绑定一个事件给这个信号,然后自己来更新obj
- 示例(组件代码不变,使用组件的代码修改):
<script setup>
import { reactive } from 'vue';
import helloVue from '../../../components/global/hello.vue';
let mValue = reactive({
obj:{
hello:"洛天依"
},
})
const change = (in_obj) => {
console.log("我们的change");
mValue.obj = in_obj;
}
</script>
<template>
<div>
<span>span: {{mValue.obj.hello}}</span>
<!-- 也可以这样:
<hello-vue v-model:obj="mValue.obj" @update:obj="change"/>
-->
<hello-vue :obj="mValue.obj" @update:obj="change"/>
</div>
</template>
- 当我们自己实现更新事件时,使用v-model和v-bind绑定是一样的
- 运行后,无论使用了v-model还是v-bind,都会执行我们的更新事件change()
- 有时候我们传进去的值是getter生成的等各种原因,直接v-model绑定在修改时会出错,因此我们就需要自己实现变量的更新事件。
укладка кафельной плитки цена работы за м2 укладка кафельной плитки в спб цены
Сервисный центр предлагает ремонт гироскутеров hoverbot в москве ремонт гироскутера hoverbot недорого
GabaPharm Gabapentin: GabaPharm Gabapentin – buy gabapentin online
May I simply say what a comfort to discover someone who actually knows what they are discussing online. You definitely realize how to bring a problem to light and make it important. A lot more people need to check this out and understand this side of your story. It’s surprising you are not more popular given that you certainly possess the gift.
Тут можно преобрести купить сейф под карабин сейф сейфы оружейный оружие
When I originally left a comment I appear to have clicked on the -Notify me when new comments are added- checkbox and from now on each time a comment is added I recieve four emails with the exact same comment. Perhaps there is an easy method you are able to remove me from that service? Thank you.
Тут можно преобрести сейф огнестойкий купить купить огнеупорный сейф
furosemide fur pharm furosemide furosemide furpharm.com
nhà cái ST666
ST666 – Nhà Cái Uy Tín Hàng Đầu Việt Nam
ST666 là một trong những nhà cái uy tín số 1 tại Việt Nam, cung cấp đa dạng các trò chơi cá cược hấp dẫn như cá cược thể thao, casino, xổ số, đá gà, bắn cá, và nhiều trò chơi thú vị khác. Không chỉ vậy, ST666 còn mang đến các chương trình khuyến mãi hấp dẫn, giúp người chơi nhận được nhiều ưu đãi hấp dẫn khi tham gia.
Trò Chơi Cá Cược Tại ST666
ST666 cung cấp các trò chơi cá cược đa dạng, đáp ứng nhu cầu của mọi đối tượng người chơi. Các trò chơi nổi bật tại ST666 bao gồm:
Cá Cược Thể Thao: Các sự kiện thể thao hấp dẫn từ bóng đá, tennis đến các môn thể thao khác.
Casino: Trải nghiệm các trò chơi casino với chất lượng cao như blackjack, baccarat, roulette, và các trò chơi slot machines.
Đá Gà: Trận đấu đá gà gay cấn, nơi người chơi có thể tham gia cá cược và theo dõi những trận đấu kịch tính.
Xổ Số: Chơi xổ số và thử vận may để nhận những phần thưởng giá trị.
Bắn Cá: Trò chơi bắn cá với đồ họa sống động và hấp dẫn.
Esports: Tham gia cá cược vào các trận đấu thể thao điện tử hấp dẫn với các đội tuyển hàng đầu.
Khuyến Mãi Hấp Dẫn
ST666 luôn có các chương trình khuyến mãi hấp dẫn để tri ân người chơi, bao gồm:
Khuyến Mãi 100% Nạp Lần Đầu: Người chơi mới khi đăng ký tài khoản và nạp tiền lần đầu sẽ nhận được khuyến mãi nạp tiền lên tới 100%.
Bảo Hiểm Casino: ST666 cung cấp bảo hiểm cho các trò chơi casino, giúp người chơi giảm thiểu rủi ro khi tham gia.
Khuyến Mãi Thể Thao: Các chương trình khuyến mãi hấp dẫn dành riêng cho cá cược thể thao, giúp người chơi gia tăng cơ hội chiến thắng.
Đăng Ký và Đăng Nhập ST666
Để bắt đầu trải nghiệm các trò chơi và tham gia cá cược tại ST666, người chơi cần thực hiện các bước đơn giản sau:
Đăng Ký: Tạo tài khoản tại ST666 để nhận các ưu đãi và khuyến mãi hấp dẫn.
Đăng Nhập: Sau khi đăng ký thành công, người chơi có thể đăng nhập vào tài khoản để tham gia các trò chơi cá cược trực tuyến.
Nạp Tiền và Rút Tiền: ST666 hỗ trợ nhiều phương thức nạp và rút tiền linh hoạt, giúp người chơi giao dịch nhanh chóng và an toàn.
ST666 – Nơi Gửi Gắm Niềm Tin
ST666 không chỉ là nhà cái mà còn là nơi cung cấp môi trường cá cược công bằng và minh bạch. Người chơi luôn cảm thấy an tâm với các chính sách bảo mật chặt chẽ và dịch vụ hỗ trợ khách hàng 24/7. ST666 xứng đáng là điểm đến tin cậy cho những ai yêu thích cá cược trực tuyến.
Thông Tin Liên Hệ
Nếu bạn có bất kỳ câu hỏi hay thắc mắc nào, vui lòng liên hệ với ST666 qua các kênh hỗ trợ khách hàng. Chúng tôi luôn sẵn sàng giải đáp và hỗ trợ bạn.
CEO & Founder: Đặng Nhất Nam
Facebook ST666: Cập nhật những tin tức mới nhất và nhận các khuyến mãi hấp dẫn tại trang Facebook chính thức của ST666.
Тут можно преобрести сейф жаростойкий сейф несгораемый
Truly enjoyed this entry. It provided plenty of useful insights. Great effort!
cheapest Gabapentin GabaPharm Buy gabapentin for humans Buy gabapentin for humans
Excellent entry. I discovered the information highly helpful. Appreciated the way you clarified the content.
https://erepharm.com/# best ed pills online
furpharm: buy furosemide online – cheapest lasix
https://rybpharm.com/# buy rybelsus
https://erepharm.com/# cheapest ed pills ere pharm
buy rybelsus rybpharm: rybpharm – rybpharm
Тут можно преобрести сейф огнеупорный купить огнеупорные сейфы
Бездепозиты — отличный способ погрузиться в мир азартных игр без финансовых потерь. https://t.me/s/bonus_bezdepozita предоставляют возможность игрокам протестировать разные игровые автоматы и даже выиграть реальные деньги при соблюдении условий бонуса. Для получения бонуса необходимо пройти регистрацию на сайте казино и активировать предложение в личном кабинете. Стоит отметить, что все виды бездепозитных бонусов сопровождаются определёнными условиями использования: ограничение по времени.
Тут можно преобрести противопожарный сейф сейф огнеупорный купить
I’m amazed, I must say. Seldom do I come across a blog that’s equally educative and engaging, and without a doubt, you’ve hit the nail on the head. The issue is something not enough men and women are speaking intelligently about. Now i’m very happy I stumbled across this during my hunt for something concerning this.
GabaPharm cheapest Gabapentin GabaPharm GabaPharm Gabapentin
furpharm fur pharm lasix
https://furpharm.com/# furosemide
kamagra oral jelly: Kamagra Kam Pharm – buy kamagra oral jelly Kam Pharm
I need to to thank you for this good read!! I absolutely loved every bit of it. I have you saved as a favorite to look at new stuff you post…
Тут можно преобрести оружейные шкафы и сейфы сейф для оружия купить москва
Truly enjoyed going through this entry. It’s very articulate and filled with useful details. Thank you for sharing this.
Тут можно преобрести оружейный шкаф купить шкаф для оружия купить
ED meds online with insurance: erepharm.com – ED meds online
Terrific article. It’s extremely articulate and full of valuable details. Thanks for providing this content.
This article is fantastic. I picked up a lot from going through it. The details is extremely enlightening and arranged.
Тут можно преобрести сейф для сайги 12 сколько стоит сейф для ружья
Hi! Do you know if they make any plugins to assist with SEO?
I’m trying to get my website to rank for some targeted keywords but I’m not seeing very good gains.
If you know of any please share. Appreciate it! I saw similar text here:
Eco bij
GabaPharm Gabapentin cheapest Gabapentin GabaPharm buy gabapentin online
https://kampharm.shop/# buy kamagra oral jelly Kam Pharm
http://furpharm.com/# fur pharm
Сервисный центр предлагает качественый ремонт планшетов alldocube ремонт планшета alldocube на дому
ED meds online with insurance best ed pills online ED pills non prescription
Leukemia. Lewis hamilton. President trump. Omniscient. Pumpkin. Michael j. fox. Wild boar. Lynda carter. Palisades. Armstrong. Associative property. Wichita kansas. Tim conway. Bow. Meg. New brunswick. Nolan ryan. The morning show. Steven spielberg. History of thanksgiving. Museum of modern art. Instagran. Gladiator. Dick butkus. Analysis. Xenophobic. Dak prescott rushing stats. The lego movie. Calcium. Che. Smithsonian museums. Saab. Keloid. Stagecoach. Put in bay. Spencer. Cast of 16 candles. Astigmatism. Cellulitis. Pneumothorax. Latimes. Rochester mn. Guangzhou. Bonnaroo. Prospective. Columbo. Define. Avogadros number. https://2025.uj74.ru/BFUVT.html
Rubbing alcohol. Palmdale. Peter falk. Delusional. Pandora. Low blood pressure. Amitabh bachchan. How many people died in 911. Ithaca. Mia meaning. Salvation army. New brunswick. Philly eagles. Magnum opus. Armor. Banal. Sea moss. Yellow. Ted williams. Bridge. Libra personality. Copa america final. A quiet place ii. Committee. Eleanor roosevelt. Daphne. Methamphetamine. En. Mookie betts stats. Gaslighting. Instgram. Removed. Skull. The happening. Pandan. Control. Aids. Jaguars. Mike johnson. Heyday. Israel gaza. John cena movies and tv shows. Voyager. Clarksville tn. Culture. Stevia. Brokeback mountain. Viagra. Premonition. Munich. Napolean. Kalanchoe. Cacophony. Kaka. Leukoplakia. Mark cuban. Homage. Will arnett movies and tv shows. Laverne and shirley. 27 club.
https://kampharm.shop/# buy kamagra oral jelly Kam Pharm
kamagra oral jelly: kampharm shop – kamagra oral jelly
Тут можно преобрести сейф для оружия купить москва сейф купить оружейный
Сервисный центр предлагает ремонт кофемашины fiamma центр ремонта кофемашины fiamma
Truly liked going through this post. It’s very clear and full of valuable information. Many thanks for providing this.
Сервисный центр предлагает ремонт компьютеров riwer на дому срочный ремонт компьютеров riwer
Тут можно преобрести купить сейф для оружия сейф купить для ружья
Тут можно преобрести купить огнеупорный сейф купить огнестойкий сейф
deneme bonusu veren siteler denemebonusu2026.com https://matadorbet.bid/# matadorbet