精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

欧美日韩一区二区电影| 成a人片亚洲日本久久| 久热精品视频在线免费观看| 91人妻一区二区| 欧美特大特白屁股xxxx| 自拍偷拍国产精品| 久久99九九| 一区二区日韩视频| 亚洲毛片网站| 久久精品一偷一偷国产| 国产偷人妻精品一区| 五月天色综合| 欧美日韩免费看| 一区二区日本| 天堂影院在线| 国产成人在线免费| 国产精品久久久久不卡| 精品无码av在线| 久久免费大视频| 日韩成人xxxx| 国产性猛交96| 国产精品1区| 在线影视一区二区三区| 成人午夜免费在线| av在线免费网站| 亚洲国产成人在线| 久久久久网址| 动漫av一区二区三区| 韩国视频一区二区| 国产精品久久久久久久久久| 国产a∨精品一区二区三区仙踪林| 天天影视天天精品| 伊是香蕉大人久久| 久久久久久久久免费看无码| 精品福利网址导航| 欧美大片一区二区| 捷克做爰xxxⅹ性视频| 日本精品裸体写真集在线观看| 亚洲成人在线网站| 黄色一级片国产| 超碰在线caoporn| 国产精品成人一区二区艾草 | 久久深夜福利免费观看| 人妻精品久久久久中文| 午夜先锋成人动漫在线| 亚洲精品在线电影| av av在线| 国内精品国产成人国产三级粉色 | 在线观看欧美一区二区| 自拍偷拍亚洲| 91精品视频网| 亚洲制服在线观看| 免费精品一区| 日韩欧美一二三| 中文字幕永久免费| av动漫精品一区二区| 精品久久久久久亚洲综合网| 特黄特色免费视频| 老司机精品视频在线播放| 精品国产乱码久久久久久图片 | 日本中文字幕在线一区| 亚洲精品美女视频| 无码人妻精品一区二区三应用大全| 欧美黄色录像| 亚洲欧美在线一区| 日本猛少妇色xxxxx免费网站| 色综合色综合| 欧美成人一二三| 国产午夜久久久| 亚洲茄子视频| 国产成人精品免费久久久久 | 日韩高清免费观看| 少妇久久久久久久久久| 成人影视亚洲图片在线| 精品国产区一区二区三区在线观看| 波多野结衣喷潮| 欧美日韩国产亚洲一区| 992tv成人免费影院| 成人黄色激情视频| 国产一区二区三区免费播放| 99re视频在线播放| 亚洲人视频在线观看| 国产婷婷一区二区| 欧美在线观看视频免费| 自由日本语热亚洲人| 欧美麻豆精品久久久久久| 人妻体体内射精一区二区| 日韩av黄色在线| 久久国内精品一国内精品| 精品视频一区二区在线观看| 日韩成人伦理电影在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 人妻少妇精品无码专区| 亚洲国产电影在线观看| 中文精品无码中文字幕无码专区 | 狠狠入ady亚洲精品经典电影| 欧美亚洲国产视频| 一级片免费网站| gogogo免费视频观看亚洲一| 亚洲一区二区不卡视频| 啊啊啊久久久| 欧美丰满高潮xxxx喷水动漫| 日本丰满少妇裸体自慰| 欧美在线高清| 国产精品男人爽免费视频1| 亚洲国产精品suv| 国产精品日产欧美久久久久| av日韩一区二区三区| 亚洲精品毛片| 亚洲美女性视频| 久久免费视频6| 精油按摩中文字幕久久| 日韩高清专区| 无遮挡爽大片在线观看视频| 日韩欧美的一区二区| 亚洲天堂精品一区| 久久精品动漫| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 美女被啪啪一区二区| 成人影院在线看| 在线亚洲精品福利网址导航| 午夜剧场免费看| 午夜精品久久| 91精品在线国产| 福利视频在线播放| 91国产精品成人| 中文字幕av网址| 一本色道精品久久一区二区三区| 亚洲曰本av电影| 黄网页在线观看| 欧美日韩高清影院| 特级西西人体高清大胆| 丝袜脚交一区二区| 精品婷婷色一区二区三区蜜桃| 伊人影院在线视频| 91精品国产一区二区三区香蕉| 国产精品久久免费观看| 国产一区91| 鲁片一区二区三区| 神马久久午夜| 国产视频在线观看一区二区| 国产成人自拍视频在线| 99国产精品久| 成人一对一视频| 精品成人自拍视频| 57pao国产成人免费| 天堂影院在线| 91成人在线精品| 天堂在线中文视频| 久久国产精品99久久久久久老狼 | 亚洲调教欧美在线| 亚洲影院一区| 日本一区二区三区www| 91在线亚洲| 日韩在线免费视频观看| 国产精品视频一二区| 亚洲激情网站免费观看| 91亚洲一线产区二线产区| 亚洲精品少妇| 免费成人看片网址| 日本一道高清亚洲日美韩| 中文字幕精品久久久久| 中国女人一级一次看片| 国产精品国产自产拍在线| 免费网站在线观看黄| 一区二区三区四区电影| 国产不卡一区二区三区在线观看 | 国产精品96久久久久久| av黄色在线观看| 欧美一区二区三区四区在线观看| 久久久精品国产sm调教| 91亚洲国产成人精品一区二三| 久久久久狠狠高潮亚洲精品| 日韩国产欧美一区二区| 5566中文字幕一区二区| 黄在线观看免费网站ktv| 亚洲天堂免费在线| 国产成人三级在线播放 | 久久国产精品久久久久久久久久 | 欧美亚洲精品天堂| 国产精品色婷婷久久58| 伊人久久久久久久久| 国产色综合网| 手机在线视频你懂的| 欧美大片网址| 国产日韩亚洲欧美| 国产色播av在线| 主播福利视频一区| 天堂av一区二区三区| 欧美亚男人的天堂| 九九精品在线观看视频| 国产亚洲一区二区三区在线观看| www.成年人| 免费在线观看成人av| 手机成人av在线| 免费成人网www| 2019国产精品视频| 在线观看精品| 国外成人免费在线播放| 色视频在线免费观看| 亚洲激情视频网| 国产伦精品一区二区三区免.费| 欧美日韩国产限制| 久久精品黄色片| 国产亚洲精品精华液| 亚洲美女在线播放| 久久成人麻豆午夜电影| 精品视频一区二区在线| 影音先锋久久久| 中文字幕一区二区三区四区五区人| 欧美激情极品| 亚洲a一级视频| 成人毛片免费| 欧亚精品在线观看| 黄页在线观看免费| 日韩中文视频免费在线观看| 免费a级毛片在线观看| 精品国产髙清在线看国产毛片| 中文字幕精品无码亚| 日韩欧美在线观看| 日韩字幕在线观看| 亚洲主播在线观看| 国产一二三四区| 国产精品卡一卡二卡三| 亚洲久久久久久久| 91色在线porny| 视频免费在线观看| 成人18视频在线播放| 熟女人妻一区二区三区免费看| 狠狠v欧美v日韩v亚洲ⅴ| 色悠悠久久综合网| 美女网站在线免费欧美精品| 欧美精品一区二区三区免费播放| 国产麻豆综合| 2022亚洲天堂| 亚洲综合另类| 久久久噜噜噜www成人网| 国产日韩欧美三区| 国产高清精品在线观看| 日韩视频一区| www一区二区www免费| 国产日韩欧美高清免费| 国产成人a亚洲精v品无码| 媚黑女一区二区| 国模杨依粉嫩蝴蝶150p| 日韩精品一二三| 午夜久久久精品| 看国产成人h片视频| 亚洲小视频网站| 国产综合成人久久大片91| 久久精品久久99| 高清视频一区二区| 精品人妻一区二区三区日产| 99视频超级精品| 波多野结衣办公室33分钟| 久久婷婷国产综合国色天香| 日本乱子伦xxxx| 国产精品久久久久婷婷二区次| www.4hu95.com四虎| 国产精品成人在线观看| 欧美片一区二区| 天天av天天翘天天综合网色鬼国产| 在线观看中文字幕视频| 欧美性猛交xxxx黑人交| 国产青青草视频| 亚洲成人精品av| 精品乱码一区二区三四区视频| 最近中文字幕mv在线一区二区三区四区| 2017亚洲天堂1024| 欧美国产视频一区二区| 美女100%一区| 国产日韩精品在线播放| 91久久偷偷做嫩草影院电| 久久免费视频1| 欧美独立站高清久久| 奇米777四色影视在线看| 国产精品久久久久久久免费软件| 午夜精品在线免费观看| 国产一区在线不卡| 国产中文字幕一区二区| 国产精品美女久久久久久久久| 欧美国产精品一二三| 一本到一区二区三区| 一区二区三区午夜| 亚洲国产精品一区二区久| а√天堂中文在线资源bt在线 | 日韩伦理在线一区| 国产精品永久免费| 久久狠狠久久| 一区不卡视频| 一区二区三区高清视频在线观看| 日本黄大片一区二区三区| 成人午夜在线播放| 欧美自拍偷拍网| 午夜a成v人精品| 国产精品区在线观看| 亚洲精品日韩欧美| 97caopor国产在线视频| 国产成人精品日本亚洲| jazzjazz国产精品久久| 宅男一区二区三区| 久久人人超碰| 久久久高清视频| 亚洲色图在线视频| 久久久精品毛片| 亚洲成人久久久久| 米奇精品一区二区三区| 日韩av电影在线免费播放| 成人看片爽爽爽| 在线观看三级网站| 日产国产高清一区二区三区| 中文字幕影片免费在线观看| 亚洲精品中文字幕在线观看| 中文字幕免费播放| 国产视频精品免费播放| 国产中文在线播放| 成人看片视频| 亚洲电影影音先锋| 不卡的av中文字幕| 久久精品免费在线观看| 9i看片成人免费看片| 精品国产三级a在线观看| 在线观看a级片| 91精品啪aⅴ在线观看国产| 日韩欧美精品综合| 欧美日韩在线成人| 久久精品人人爽人人爽| 国产寡妇亲子伦一区二区三区四区| 精品国产乱码久久久久久夜甘婷婷| 黄色成人在线| 亚洲一区亚洲二区| 91精品啪在线观看国产18| 亚欧美在线观看| 欧美激情一区二区三区| 久久久久久无码精品大片| 亚洲欧美日韩精品| 午夜欧美巨大性欧美巨大| 欧美日韩另类综合| 久久久久久久波多野高潮日日| 国产三级国产精品| 狠狠躁夜夜躁人人躁婷婷91| 四虎影院在线播放| 欧美亚洲成人免费| 精品欧美久久| 鲁一鲁一鲁一鲁一av| 国产精品免费视频网站| 一级特黄色大片| 久久伊人精品天天| 视频欧美一区| 国产人妻777人伦精品hd| 99精品久久99久久久久| 日韩精品在线观看免费| 亚洲丝袜av一区| 久久精品国产精品亚洲毛片| 亚洲永久激情精品| 国产一区二区三区免费| 久热这里只有精品在线| 亚洲第一福利网站| 中文字幕乱码在线播放| 亚洲va韩国va欧美va精四季| 久久99久国产精品黄毛片色诱| 亚洲av无码一区二区三区在线| 欧美成人video| 中文字幕不卡三区视频| 亚洲成人一区二区三区| 国产在线日韩欧美| 黄色小视频在线免费看| 亚洲欧美日韩综合| 亚洲我射av| 福利视频一区二区三区四区| 久久久一区二区三区| 91在线精品入口| 韩国19禁主播vip福利视频| 亚洲专区视频| 一级淫片在线观看| 午夜久久久影院| a天堂在线资源| 超碰在线97av| 丝袜亚洲另类欧美| 青青草原在线免费观看视频| 亚洲女成人图区| 久久伦理中文字幕| 免费av网址在线| 亚洲黄色免费电影| 九色蝌蚪在线| 国产精品区一区二区三含羞草| 日韩成人免费电影| 国产网站在线看| 综合国产在线视频| 青青草久久爱| 在线一区二区不卡| 日韩欧美精品中文字幕| 色呦呦视频在线观看| 神马影院午夜我不卡影院| 懂色av中文字幕一区二区三区 | 久久99国产精品久久99果冻传媒| 日韩 欧美 亚洲| 久久久成人精品| 国产在线日韩精品| 伊人久久一区二区三区|