精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Vue 3 中的七個組件通信技巧

開發(fā) 前端
本文采用<script setup />的寫法,比options API更自由。那么我們就來說說以下七種組件通信方式都有哪些吧。

寫在前面

本文采用<script setup />的寫法,比options API更自由。那么我們就來說說以下七種組件通信方式:

  1. props
  2. emit
  3. v-model
  4. refs
  5. provide/inject
  6. eventBus
  7. vuex/pinia

舉個例子

本文將使用下面的演示,如下圖所示:

上圖中,列表和輸入框分別是父組件和子組件。根據(jù)不同的通信方式,父子組件會有所調(diào)整。

1. Props

Props是Vue中最常見的父子通信方式,使用起來也比較簡單。

根據(jù)上面的demo,我們在父組件中定義數(shù)據(jù)和對數(shù)據(jù)的操作,子組件只渲染一個列表。

父組件代碼如下:

<template>
<!-- child component -->
<child-components :list="list"></child-components>
<!-- parent component -->
<div class="child-wrap input-group">
<input
v-model="value"
type="text"
class="form-control"
placeholder="Please enter"
/>
<div class="input-group-append">
<button @click="handleAdd" class="btn btn-primary" type="button">
add
</button>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
import ChildComponents from './child.vue'
const list = ref(['JavaScript', 'HTML', 'CSS'])
const value = ref('')
// event handling function triggered by add
const handleAdd = () => {
list.value.push(value.value)
value.value = ''
}
</script>

子組件只需要渲染父組件傳過來的值即可。

代碼如下:

<template>
<ul class="parent list-group">
<li class="list-group-item" v-for="i in props.list" :key="i">{{ i }}</li>
</ul>
</template>
<script setup>
import { defineProps } from 'vue'
const props = defineProps({
list: {
type: Array,
default: () => [],
},
})
</script>

2. emit

Emit也是Vue中最常見的組件通信方式,用于子組件向父組件傳遞消息。

我們在父組件中定義列表,子組件只需要傳遞添加的值即可。

子組件代碼如下:

<template>
<div class="child-wrap input-group">
<input
v-model="value"
type="text"
class="form-control"
placeholder="Please enter"
/>
<div class="input-group-append">
<button @click="handleSubmit" class="btn btn-primary" type="button">
add
</button>
</div>
</div>
</template>
<script setup>
import { ref, defineEmits } from 'vue'
const value = ref('')
const emits = defineEmits(['add'])
const handleSubmit = () => {
emits('add', value.value)
value.value = ''
}
</script>

單擊子組件中的 [Add] 按鈕后,我們發(fā)出自定義事件并將添加的值作為參數(shù)傳遞給父組件。

父組件代碼如下:

<template>
<!-- parent component -->
<ul class="parent list-group">
<li class="list-group-item" v-for="i in list" :key="i">{{ i }}</li>
</ul>
<!-- child component -->
<child-components @add="handleAdd"></child-components>
</template>
<script setup>
import { ref } from 'vue'
import ChildComponents from './child.vue'
const list = ref(['JavaScript', 'HTML', 'CSS'])
// event handling function triggered by add
const handleAdd = value => {
list.value.push(value)
}
</script>

在父組件中,只需要監(jiān)聽子組件的自定義事件,然后執(zhí)行相應(yīng)的添加邏輯即可。

3.v-model

v-model是Vue中一個優(yōu)秀的語法糖,比如下面的代碼。

<ChildComponent v-model:title="pageTitle" />

這是以下代碼的簡寫形式

<ChildComponent :title="pageTitle" @update:title="pageTitle = $event" />

確實容易多了。現(xiàn)在我們將使用 v-model 來實現(xiàn)上面的例子。

子組件

<template>
<div class="child-wrap input-group">
<input
v-model="value"
type="text"
class="form-control"
placeholder="Please enter"
/>
<div class="input-group-append">
<button @click="handleAdd" class="btn btn-primary" type="button">
add
</button>
</div>
</div>
</template>
<script setup>
import { ref, defineEmits, defineProps } from 'vue'
const value = ref('')
const props = defineProps({
list: {
type: Array,
default: () => [],
},
})
const emits = defineEmits(['update:list'])
// Add action
const handleAdd = () => {
const arr = props.list
arr.push(value.value)
emits('update:list', arr)
value.value = ''
}
</script>

在子組件中,我們先定義props和emit,添加完成后,再emit指定的事件。

注意:update:*是Vue中固定的寫法,*代表props中的一個屬性名。

在父組件中使用比較簡單,代碼如下:

<template>
<!-- parent component -->
<ul class="parent list-group">
<li class="list-group-item" v-for="i in list" :key="i">{{ i }}</li>
</ul>
<!-- child component -->
<child-components v-model:list="list"></child-components>
</template>
<script setup>
import { ref } from 'vue'
import ChildComponents from './child.vue'
const list = ref(['JavaScript', 'HTML', 'CSS'])
</script>

4. refs

在使用option API時,我們可以通過this.$refs.name獲取指定的元素或組件,而在combined API中則不行。如果我們想通過ref獲取,需要定義一個同名的Ref對象,組件掛載后才能訪問到。

示例代碼如下:

<template>
<ul class="parent list-group">
<li class="list-group-item" v-for="i in childRefs?.list" :key="i">
{{ i }}
</li>
</ul>
<!-- The value of the child component ref is the same as that in the <script> -->
<child-components ref="childRefs"></child-components>
<!-- parent component -->
</template>
<script setup>
import { ref } from 'vue'
import ChildComponents from './child.vue'
const childRefs = ref(null)
</script>

子組件代碼如下:

<template>
<div class="child-wrap input-group">
<input
v-model="value"
type="text"
class="form-control"
placeholder="Please enter"
/>
<div class="input-group-append">
<button @click="handleAdd" class="btn btn-primary" type="button">
add
</button>
</div>
</div>
</template>
<script setup>
import { ref, defineExpose } from 'vue'
const list = ref(['JavaScript', 'HTML', 'CSS'])
const value = ref('')
// event handling function triggered by add
const handleAdd = () => {
list.value.push(value.value)
value.value = ''
}
defineExpose({ list })
</script>

注意:默認(rèn)情況下,setup組件是關(guān)閉的,通過template ref獲取組件的public實例。如果需要暴露,需要通過defineExpose API暴露。

5. provide/inject

Provide 和 inject 是 Vue 中提供的一對 API。無論層次有多深,API都能實現(xiàn)父組件到子組件的數(shù)據(jù)傳遞。

示例代碼如下所示:

父組件

<template>
<!-- child component -->
<child-components></child-components>
<!-- parent component -->
<div class="child-wrap input-group">
<input
v-model="value"
type="text"
class="form-control"
placeholder="Please enter"
/>
<div class="input-group-append">
<button @click="handleAdd" class="btn btn-primary" type="button">
add
</button>
</div>
</div>
</template>
<script setup>
import { ref, provide } from 'vue'
import ChildComponents from './child.vue'
const list = ref(['JavaScript', 'HTML', 'CSS'])
const value = ref('')
// Provide data to child components.
provide('list', list.value)
// event handling function triggered by add
const handleAdd = () => {
list.value.push(value.value)
value.value = ''
}
</script>

子組件

<template>
<ul class="parent list-group">
<li class="list-group-item" v-for="i in list" :key="i">{{ i }}</li>
</ul>
</template>
<script setup>
import { inject } from 'vue'
// Accept data provided by parent component
const list = inject('list')
</script>

注意:使用provide進(jìn)行數(shù)據(jù)傳遞時,盡量用readonly封裝數(shù)據(jù),避免子組件修改父組件傳過來的數(shù)據(jù)。

6.eventBus

在 Vue 3 中移除了 eventBus,但可以借助第三方工具來完成。Vue 官方推薦 mitt 或 tiny-emitter。大多數(shù)情況下,不推薦使用全局事件總線來實現(xiàn)組件通信。雖然比較簡單粗暴,但是長期維護(hù)event bus是個大問題,這里就不多說了。具體可以閱讀具體工具的文檔。

7.Vuex && Pinia

Vuex和Pinia是Vue 3中的狀態(tài)管理工具,使用這兩個工具可以輕松實現(xiàn)組件通信。由于這兩個工具比較強大,這里就不展示了。有關(guān)詳細(xì)信息,請參閱文檔。

最后

以上就是我今天想與你分享的Vue3中的7個組件通信技巧,如果對你有幫助的話,請記得點贊我,關(guān)注我,并將這篇文章分享給你的朋友,也許能夠幫助到他。

最后,謝謝你的閱讀。

責(zé)任編輯:華軒 來源: web前端開發(fā)
相關(guān)推薦

2022-05-06 08:47:10

Vue 3組件前端

2023-12-19 16:50:37

2022-12-12 13:19:11

Vue3開發(fā)技巧

2022-11-30 15:33:39

Vue 3組件

2023-03-29 07:54:25

Vue 3插件

2023-09-07 16:28:46

JavaScrip

2021-11-22 12:13:54

Linuxwget 命令

2022-06-23 09:22:57

Vue技巧前端

2023-11-06 11:32:46

CSS選擇器作用域

2018-05-24 08:47:15

數(shù)據(jù)存儲技巧

2023-05-30 09:59:38

2021-08-17 10:08:44

HTML網(wǎng)站網(wǎng)絡(luò)

2024-06-25 15:41:41

2022-04-14 10:40:11

領(lǐng)導(dǎo)者IT團隊遠(yuǎn)程團隊

2019-09-09 10:32:51

基于意圖的網(wǎng)絡(luò)IBN網(wǎng)絡(luò)

2021-06-10 08:00:00

首席信息安全官IT數(shù)據(jù)

2021-03-02 10:54:08

高管IT投資首席信息官

2022-08-26 08:00:00

數(shù)字時代IT首席信息官

2012-09-17 10:57:39

郵件安全

2015-11-30 17:12:31

Git使用技巧
點贊
收藏

51CTO技術(shù)棧公眾號

九色porny丨首页在线| 一二三区免费视频| 亚洲精品高潮| 一区二区三区四区乱视频| 福利视频久久| 黄色大全在线观看| 欧美视频一区| 亚洲全黄一级网站| 无套白嫩进入乌克兰美女| 国产福利电影在线播放| 久久精品日韩一区二区三区| 91视频国产精品| aaa人片在线| 97偷自拍亚洲综合二区| 欧美精品一区二| 国产一伦一伦一伦| 精品捆绑调教一区二区三区| 国产欧美精品日韩区二区麻豆天美| 91久久精品国产91久久性色tv| 国产区在线观看视频| 亚洲电影在线一区二区三区| 亚洲人成毛片在线播放| 最新版天堂资源在线| www.国产精品| 日韩欧美国产黄色| 9l视频自拍9l视频自拍| 欧美日韩伦理片| 国产成a人亚洲| 国产日韩在线一区| 色av性av丰满av| 99精品福利视频| 久久综合色88| 2017亚洲天堂| av在线不卡顿| 日韩精品视频免费| 日韩少妇一区二区| 日韩区欧美区| 制服丝袜亚洲色图| 青青草原国产在线视频| 台湾佬成人网| 色偷偷久久人人79超碰人人澡| 欧美一级片免费播放| 中文字幕有码在线观看| 国产精品护士白丝一区av| 欧美大香线蕉线伊人久久| 日本精品一二区| 成人美女视频在线观看| 亚洲最大的免费| 一区二区视频免费| 美国毛片一区二区三区| 国产精品嫩草视频| 中文字幕1区2区3区| 视频一区二区中文字幕| 日韩免费观看视频| 无码人妻精品一区二区三区不卡 | 久久尤物电影视频在线观看| 国产精品二区在线观看| 性猛交富婆╳xxx乱大交天津| 狠狠色综合日日| 亚洲影院污污.| www.看毛片| 成人免费毛片嘿嘿连载视频| 粉嫩av四季av绯色av第一区| 欧美 日韩 人妻 高清 中文| 成熟亚洲日本毛茸茸凸凹| 国产精品久久久久久久小唯西川| 免费观看黄色一级视频| 不卡的电视剧免费网站有什么| 国产欧美日韩一区二区三区| 三级网站在线看| 91丨九色丨蝌蚪丨老版| 久久久福利视频| 国产精品一二三区视频| 日韩一区日韩二区| 久久综合亚洲精品| 色吧亚洲日本| 91福利小视频| 香蕉视频xxxx| 久久悠悠精品综合网| 精品亚洲国产成av人片传媒| 中文字幕免费在线看线人动作大片| 日韩欧美精品一区| 欧美精品中文字幕一区| 男人的天堂一区| 日韩高清不卡一区二区三区| 成人性生交xxxxx网站| 亚洲成熟女性毛茸茸| 91美女在线视频| 一区二区免费电影| 成人影音在线| 欧美性大战久久久久久久蜜臀| 尤物网站在线看| 日韩免费电影在线观看| 丝袜亚洲另类欧美重口| 久久视频免费在线观看| 美女视频网站久久| 成人区精品一区二区| 国产在线免费观看| 亚洲影院在线观看| 国产精品wwwww| 日韩欧美一级| 中文字幕精品国产| jizz国产免费| 奇米四色…亚洲| 国产精品久久久久免费| 国产视频网站在线| 亚洲成人动漫在线观看| 中文av一区二区三区| 精品精品国产毛片在线看| 中文字幕亚洲欧美日韩在线不卡| 久久久美女视频| 美女脱光内衣内裤视频久久影院| 久久国产精品免费一区| 成人看av片| 欧美色图免费看| 亚洲天堂资源在线| 欧美精品国产一区| 国产精品一区二区久久久久| 午夜性色福利视频| 一区二区三区影院| 欧美美女性视频| 国内精品久久久久久久影视简单 | 精品一区二区三区久久| 久久综合九色99| 国产www视频在线观看| 欧美日本一区二区| 国产精品免费无码| 亚洲永久免费精品| 国产日韩一区二区| 性欧美videoshd高清| 欧美日韩激情一区二区| 久久精品成人av| 国产视频一区在线观看一区免费| 91久久国产自产拍夜夜嗨| 国产在线高潮| 91精品久久久久久久99蜜桃 | 亚洲欧美乱综合| 波多野结衣xxxx| 欧美肉体xxxx裸体137大胆| 欧美一级高清免费播放| 午夜成人免费影院| 亚洲第一狼人社区| 一级黄色片毛片| 欧美黄色一区二区| 亚洲影院污污.| 污片在线免费观看| 日韩一区二区精品在线观看| 亚洲欧美小视频| 国产精品主播直播| 国产性生活免费视频| 6080成人| 97免费在线视频| 姝姝窝人体www聚色窝| 亚洲成av人影院| 亚洲中文字幕一区| 亚洲伦理精品| 久久久久综合一区二区三区| 日本在线播放一二三区| 亚洲精品中文字幕av| av大片在线免费观看| 久久先锋影音av| 亚洲不卡视频在线| 日韩精品影视| 亚洲精品日韩激情在线电影| 在线免费观看的av| 337p日本欧洲亚洲大胆精品| 国产91精品一区| 国产欧美一区二区精品秋霞影院| 欧美婷婷精品激情| 亚洲国产一区二区在线观看| av免费精品一区二区三区| av2020不卡| 亚洲日韩中文字幕在线播放| 中文亚洲av片在线观看| 亚洲免费高清视频在线| 中国免费黄色片| 久久综合中文| 午夜在线视频免费观看| a看欧美黄色女同性恋| 97免费视频在线| 亚洲1卡2卡3卡4卡乱码精品| 日韩视频在线观看一区二区| 免费观看成人毛片| 亚洲天堂av老司机| 午夜一区二区三区免费| 蜜桃av一区二区在线观看| www.-级毛片线天内射视视| 精品五月天堂| 国产在线高清精品| 国产欧洲在线| 色综久久综合桃花网| 狠狠综合久久av一区二区| 在线精品视频一区二区| 欧美精品一区二区成人| 久久久久久久免费视频了| 手机在线视频一区| 久久一区精品| 日韩免费在线观看av| 精品国产中文字幕第一页 | 欧美自拍小视频| 欧美精品18| 亚洲成人网上| 久久久久观看| 91色琪琪电影亚洲精品久久| 日本免费久久| 欧美激情小视频| av在线天堂播放| 日韩av在线免费| aaa一区二区三区| 欧美色综合网站| 天天干在线播放| 亚洲一级二级在线| 欧美风情第一页| 国产亚洲福利社区一区| 日韩综合第一页| 国产成人综合精品三级| 尤蜜粉嫩av国产一区二区三区| 亚洲黄色影片| 成人黄色片免费| 久久精品国内一区二区三区水蜜桃| 蜜桃av色综合| 美女视频免费精品| 成人动漫在线视频| 国产视频一区二| 国产精品视频中文字幕91| 男人最爱成人网| 26uuu日韩精品一区二区| 精品日韩av| 欧美精品做受xxx性少妇| 免费在线观看av片| 中文字幕亚洲欧美在线| 国内精品在线视频| 亚洲老头同性xxxxx| 天堂中文在线观看视频| 欧美精品一区二区三区在线播放 | 国产成人午夜精品5599| 91亚洲精品久久久蜜桃借种| 日本在线不卡视频| 黄色三级视频片| 日韩电影网1区2区| 又色又爽又高潮免费视频国产| 小嫩嫩精品导航| 男人天堂1024| 亚洲女优在线| 日本一本二本在线观看| 欧美专区一区二区三区| 国产午夜福利视频在线观看| 亚洲综合二区| 熟妇人妻va精品中文字幕| 久久99伊人| 大肉大捧一进一出好爽动态图| 亚洲一区二区免费看| 亚洲熟妇av日韩熟妇在线| 99综合视频| 成人在线看视频| 日本中文一区二区三区| 91视频这里只有精品| 国产毛片一区二区| 无码人妻一区二区三区免费n鬼沢| 国产一区二区三区高清播放| 中文字幕乱妇无码av在线| 国产成人精品午夜视频免费| 麻豆av免费看| 91色|porny| 亚洲精品一区二区三区影院忠贞| 国产精品美女久久福利网站| 小泽玛利亚一区| 亚洲一区二区偷拍精品| 成年人午夜视频| 欧美体内谢she精2性欧美| 精人妻无码一区二区三区| 欧美日韩亚州综合| 亚洲第一黄色片| 亚洲欧美在线一区二区| 嫩草在线视频| 国模私拍视频一区| 欧美国产日韩电影| 91蜜桃网站免费观看| 牛牛影视久久网| 亚洲三区在线| 亚洲成色精品| wwwwxxxx日韩| 风间由美性色一区二区三区| 加勒比一区二区| 亚洲欧美日韩中文字幕一区二区三区| 日本一卡二卡在线播放| 一区二区三区国产豹纹内裤在线 | 欧美色欧美亚洲另类二区| 国产av无码专区亚洲a∨毛片| 亚洲国产精品人人爽夜夜爽| 成人在线免费视频| 国内精品国产三级国产在线专| 精品欧美一区二区三区在线观看 | 久久久综合色| 国产伦精品一区二区三区四区视频_| 日韩av不卡在线观看| 特级特黄刘亦菲aaa级| 中文字幕成人av| 五月天婷婷丁香| 欧美丰满高潮xxxx喷水动漫| 亚欧洲精品视频| 久久夜色撩人精品| 97久久香蕉国产线看观看| 亚洲自拍偷拍网址| 精品午夜久久| 国产v片免费观看| 国产中文一区二区三区| brazzers精品成人一区| 一区av在线播放| 亚洲手机在线观看| 精品亚洲一区二区三区四区五区| 成人黄色网址| 国产精品视频地址| 国产精品手机在线播放| 黄页网站在线观看视频| 国产一区二区三区免费观看| 懂色av蜜桃av| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲国产精品久久久久久6q| 中文字幕日韩精品在线观看| 欧美xoxoxo| 久久综合九色综合久99| 亚洲高清资源| 日本中文字幕精品| 亚洲日本电影在线| 亚洲一区在线观| 这里只有精品丝袜| 日本精品裸体写真集在线观看| 久草一区二区| 99精品视频免费观看视频| 少妇高潮一69aⅹ| 国产精品午夜春色av| 少妇一级淫片免费放中国| 亚洲精品电影在线观看| wwwww亚洲| 国产一区二区三区av在线| 国产精品99一区二区| 北条麻妃亚洲一区| 亚洲精品精品亚洲| 精品人妻无码一区二区| 欧美大奶子在线| 91精品尤物| 激情小视频网站| 成人精品视频一区| 日韩欧美不卡视频| 精品视频在线导航| 竹内纱里奈兽皇系列在线观看 | 欧美韩日高清| 免费看涩涩视频| 国产精品久久三| 97国产成人无码精品久久久| xxxx性欧美| 亚洲精品视频一二三区| 精品一二三四五区| 91伊人久久大香线蕉| 日本视频网站在线观看| 亚洲欧美中文字幕| 国产精品久久乐| 国产精品夜夜夜爽张柏芝| 国产精品综合网| 欧美人与禽zozzo禽性配| 精品国产91乱码一区二区三区 | 视频一区二区三区不卡| 91精品久久久久久久久久入口| 亚洲国产精品综合久久久| 久久久久久久穴| 欧美午夜视频在线观看| 99视频在线观看地址| 亚洲a成v人在线观看| 亚洲精品护士| 国产jjizz一区二区三区视频| 欧美精品自拍偷拍动漫精品| 制服丝袜中文字幕在线| 九色综合日本| 精品一区二区三区久久| 国产无遮挡又黄又爽在线观看| 亚洲欧美日韩图片| 高清av一区| 女人被男人躁得好爽免费视频| 91视频一区二区| 亚洲图片小说视频| 久久久久久免费精品| 欧美日韩老妇| 在线中文字日产幕| 色综合久久久久久久久久久| 日本免费在线视频| 国产亚洲欧美另类一区二区三区 | 国产裸体视频网站| 日韩欧美综合在线视频| 免费a在线看| 精品久久sese| 狠狠色综合色综合网络| 亚洲日本韩国在线| 久久成人国产精品| 国产99精品| 熟女人妻一区二区三区免费看| 日韩欧美在线看| 欧美亚洲系列| 一区二区三区我不卡| 91偷拍与自偷拍精品|