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

原生“跨組件”通信方式

開發 前端
相信大家平時在Vue或者React中都碰到過“跨組件”通信的需求,通常我們需要將數據放在一個公共的父級上,然后用Context之類的方式傳遞下去,或者借用Pinia這樣的開源庫去更好的管理這些數據。

現在已經是“組件化”開發時代了。

相信大家平時在vue或者react中都碰到過“跨組件”通信的需求,通常我們需要將數據放在一個公共的父級上,然后用context之類的方式傳遞下去,或者借用pinia這樣的開源庫去更好的管理這些數據。

不過,大部分項目可能沒有那么復雜,可能只有極少部分需要“跨組件”通信或者全局傳遞的,專門去引入一個全局狀態管理庫還是有一定成本的,不僅僅是性能開銷,還有學習成本。

另外,還有一些舊項目,由于前期組件設計未考慮周全,或者由于后期需求迭代,導致需要跨組件通信,此時再引入狀態管理庫也有很大的改造成本。

框架用久了,可能有些都忘了,原生 web 并沒有組件化的概念,整個頁面都是開放的,所以,借助原生的一些行為和方式,也能很輕易的解決“跨組件”通信問題,下面列舉了幾個方式,一起看看吧~

一、label for

舉個例子,下面是之前做的一個錯別字糾錯功能,也就是自動檢測錯別字,然后提供替換和忽略一些功能,如下:

現在不用關注是怎么實現的,如果按照組件化拆分,右邊的糾錯面板肯定是單獨的組件。

很自然的,關于忽略的相關函數也是寫在這個組件,類似于這樣。

<!--糾錯組件-->
<script setup>
const ignore = () => {
  // 相關操作
}
</script>
<template>
...
<button @click="ignore">忽略</button>
...
</template>

嗯,很好,組件化很不錯,邏輯也很清晰。

過了兩天,產品又需要在另外一個地方也要有“忽略”功能,當鼠標懸浮的時候,下拉選項中也有忽略選項,并且這兩個忽略的功能是完全一樣的,如下:

再單獨實現一遍肯定是不行的,把這個函數抽離出來?但是還有新的問題,整個錯別字的列表也是需要更新的,是不是也要把這個列表也獨立出來?

no,當然不需要這么麻煩,僅需要一個label標簽就可以輕松搞定,如下:

<!--寫作區域的下拉組件-->
<template>
...
<ui-dropdown>
  <label for="AAA">忽略</label>
  ...
</ui-dropdown>
...
</template>

當然,右邊的忽略按鈕也需要加上一個相同的ID(實際中是動態生成的)。

<!--糾錯組件-->
<template>
...
<button id="AAA" @click="ignore">忽略</button>
...
</template>

這樣,通過label+for就將這兩個元素關聯起來了,點擊這個label元素就相當于點擊了右邊的忽略按鈕,無需任何跨組件通信,是不是非常方便呢?

二、主動觸發事件

有時候,需要通信的事件可能并不是通過按鈕點擊的,比如這樣一個寫作頁面,按照頁面布局和功能,各個部分肯定是單獨的組件,如下:

其中,右上角有一個“保存”按鈕,可以保存內容,假設是這樣。

<!--功能組件-->
<script setup>
const save = () => {
  // 相關操作
}
</script>
<template>
...
<button @click="save">保存</button>
...
</template>

現在,產品又提出一個要求,希望在寫作時,按 Ctrl + S也能保存內容。

那么,你會怎么處理呢?把保存方法封裝一下?全局通信?

其實,我們要做的事情很簡單,只需要主動去觸發一下保存按鈕的點擊事件就可以了,當然需要獲取到這個按鈕,所以要加個ID。

<!--功能組件-->
<template>
...
<button id="saveBtn" @click="save">保存</button>
...
</template>

然后在寫作組件中直接通過觸發click事件就好了。

<!--寫作組件-->
<script setup>
// Ctrl+S 保存
const save = () => {
  document.getElementById('saveBtn').click()
}
</script>

當然,我更習慣于用dispatch的方式來觸發。

document.getElementById('saveBtn').dispatchEvent(new Event('click'))

這樣的好處是不限類型,任意事件都可以觸發,而不僅僅是點擊事件。

dom.dispatchEvent(new Event('mouseover'))

關于dispatchEvent,下面還有更靈活的運用。

三、dispatchEvent 和 addEventListener

dispatchEvent不僅可以觸發常見的點擊事件,也能夠觸發任意自定義事件。

舉個例子,有兩個相互獨立的功能區,有兩個按鈕,分別點擊后,會做一些操作,比如請求接口,最后會彈出同一個獎勵彈窗

如果按照組件話的思維來考慮,可能需要將獎勵彈窗的狀態放在一個公共的父級,然后依次回調,或者用全局狀態管理庫區管理這些狀態。

但是,如果從原生 web 來考慮,其實不必那么麻煩,下面是一些偽代碼。

<!--功能組件A-->
<script setup>
const getPrize = () => {
  // 領獎勵一系列邏輯
}
</script>
<template>
...
<button @click="getPrize">領獎勵A</button>
...
</template>

然后還有功能區 B。

<!--功能組件B-->
<script setup>
const getPrize = () => {
  // 領獎勵B一系列邏輯
}
</script>
<template>
...
<button @click="getPrize">領獎勵B</button>
...
</template>

然后還有獎勵彈窗。

<!--獎勵彈窗-->
<script>
const open = () => {
  // 打開彈窗
}
</script>
<template>
...
<dialog>獎勵彈窗</dialog>
...
</template>

那么,怎么讓其他功能區的組件打開獎勵彈窗呢?

這就需要用自定義事件了,很簡單,直接觸發一個自定義事件,假設就叫做prize。

document.dispatchEvent(new CustomEvent('prize'))

放在業務組件中就是。

<!--功能組件A-->
<script setup>
const getPrize = () => {
  // 領獎勵一系列邏輯
  document.dispatchEvent(new CustomEvent('prize'))
}
</script>
<template>
...
<button @click="getPrize">領獎勵A</button>
...
</template>

然后,我們可以在頁面任意地方都監聽到這個事件,直接通過addEventListener就可以了。

document.addEventListener('prize', () => {
  // 監聽到了prize
})

所以,我們可以把這個監聽直接放在獎勵彈窗組件中。

<!--獎勵彈窗-->
<script>
const open = () => {
  // 打開彈窗
}

onMounted(() => {
  document.addEventListener('prize', () => {
  	// 監聽到了prize,打開彈窗
    open()
	})
})
</script>
<template>
...
<dialog>獎勵彈窗</dialog>
...
</template>

這樣,無論組件是什么樣的嵌套關系,都可以隨心所欲地通信了。

四、最后總結一下

本文更多的還是提供一種思路,實際開發中可以自己權衡,什么方式比較合適,下面總結一下這三種方式

  • label for比較適合于按鈕點擊事件的復用,可以將label元素與button元素綁定起來。
  • 相比label for而言,主動觸發事件更靈活,可以觸發任意事件,無需button元素,也不限制點擊事件。
  • dispatchEvent 和 addEventListener是最靈活的方式了,幾乎可以做到全局通信,通過dispatchEvent觸發,然后通過addEventListener監聽。

當然,這些方式也不能濫用,畢竟用多了就顯得邏輯混亂,如果全局通信的情況比較多,還是建議使用傳統的組件化方式就行管理。

責任編輯:姜華 來源: 前端偵探
相關推薦

2022-07-20 15:19:17

容器Docker

2019-04-10 08:24:06

vue組件通信

2019-08-14 10:00:08

vue組件通信前端

2022-03-11 12:31:04

Vue3組件前端

2022-05-06 08:47:10

Vue 3組件前端

2021-08-24 14:57:27

鴻蒙HarmonyOS應用

2023-03-30 11:50:34

2019-05-29 14:23:53

Vue.js組件通信

2019-05-15 08:00:00

vue組件間通信前端

2010-02-26 14:05:57

WCF通信方式

2024-01-09 08:34:56

Vue3.js組件通信

2021-07-05 11:06:11

組件React通信

2023-12-15 08:07:55

2013-12-11 09:51:33

2025-08-08 01:11:00

React組件通信

2021-03-18 08:00:55

組件Hooks React

2022-08-03 09:58:03

跨端框架實踐

2023-12-04 07:14:40

通信微服務

2017-03-28 10:20:24

Docker通信分析

2021-12-30 23:57:29

插值方式Github
點贊
收藏

51CTO技術棧公眾號

天堂91在线| 日本亚洲欧美在线| 日韩精品亚洲人成在线观看| 高潮精品一区videoshd| 欧美激情2020午夜免费观看| 99久久人妻无码中文字幕系列| 日本一本在线免费福利| 久久综合九色综合久久久精品综合| 欧美精品久久久久久久久久| 一级做a爰片毛片| 九七电影院97理论片久久tvb| 国产日韩精品视频一区| 欧美一区三区三区高中清蜜桃| 日本精品一二三区| 日韩一级二级| 亚洲国产成人porn| 亚洲色图自拍| 神马午夜精品95| 精品一区二区在线观看| 91精品国产高清久久久久久| 青青青视频在线播放| 成人18夜夜网深夜福利网| 在线观看亚洲专区| 精品少妇人妻av免费久久洗澡| 日韩一级在线播放| 久久se精品一区精品二区| 91精品国产99| 欧美片一区二区| 久久国产精品亚洲人一区二区三区| 欧美人动与zoxxxx乱| 国产91xxx| 最爽无遮挡行房视频在线| 国产三级欧美三级| 久久资源亚洲| 日韩中文字幕综合| 国产一区二区剧情av在线| 国产成人精品一区二区在线| 久久精品99久久久久久| 国产精品99一区二区三| 日韩一级免费观看| 亚洲美女性囗交| 91精品店在线| 日本高清成人免费播放| 国产肥臀一区二区福利视频| 国产盗摄一区二区| 亚洲精品大片www| 一级黄色录像免费看| 在线观看a视频| 精品亚洲免费视频| 韩剧1988免费观看全集| 欧美成人黄色网| 女主播福利一区| 亚洲国产精品成人va在线观看| 88av.com| 偷拍视频一区二区三区| 欧美日韩综合视频网址| 六月丁香激情网| 九色porny自拍视频在线观看| 中文一区一区三区高中清不卡| 444亚洲人体| a毛片在线免费观看| 国产一区在线不卡| 91中文字幕在线观看| 99精品国产99久久久久久97| 亚洲一区二区伦理| 欧洲亚洲在线视频| 午夜精品一区二| 青椒成人免费视频| 成人福利网站在线观看| va视频在线观看| 成人亚洲一区二区一| 国产一区二区高清不卡| 爽爽视频在线观看| 久久精品亚洲精品国产欧美| 亚洲精品二区| 1024在线播放| 欧美日韩国产精品一区| 欧洲xxxxx| 精灵使的剑舞无删减版在线观看| 国产精品日日摸夜夜摸av| 亚洲一区三区| 欧美日韩经典丝袜| 午夜久久久久久久久久一区二区| 黄色录像特级片| 91社区在线观看播放| 亚洲欧美一区二区视频| 97中文字幕在线| 3d玉蒲团在线观看| 国产精品国产精品国产专区不蜜 | 三级全黄做爰视频| 欧美激情日韩| 理论片在线不卡免费观看| 国产一卡二卡在线播放| 美女久久一区| 5g影院天天爽成人免费下载| 亚洲欧美色视频| 国产精品第四页| 国产自产在线视频| 在线观看av免费| 一本到不卡免费一区二区| 欧美亚洲国产成人| 欧美激情不卡| 亚洲精品视频中文字幕| 欧美手机在线观看| 亚洲尤物影院| 成人黄色av网址| 4438亚洲最大| 中文字幕丰满孑伦无码专区| 欧美成人milf| 奇米成人av国产一区二区三区| 国产精品99精品无码视| 亚洲清纯自拍| 91免费在线视频网站| 麻豆导航在线观看| 亚洲一区二区欧美| 午夜激情av在线| 天天躁日日躁成人字幕aⅴ| 久久久成人的性感天堂| 亚洲欧美另类在线视频| 国产成人精品影视| 国产免费一区二区三区| 亚洲 精品 综合 精品 自拍| 亚洲情趣在线观看| 欧美成人精品免费| 91成人短视频在线观看| 亚洲欧洲高清在线| 日韩成人免费在线观看| 国产乱人伦精品一区二区在线观看| 不卡一卡2卡3卡4卡精品在| 中文字幕日本在线观看| 日韩欧美亚洲范冰冰与中字| 欧美激情 亚洲| 欧美在线三区| 91精品视频专区| 亚洲s色大片| 欧美自拍偷拍一区| 午夜欧美性电影| 亚洲女优在线观看| 久久密一区二区三区| 国产91在线播放精品91| 青青操在线视频| 欧美午夜精品久久久久久浪潮 | 欧美日韩国产精品一区| 无遮挡又爽又刺激的视频| 成人午夜大片| 久久久久久12| 国产精品视频无码| 成人欧美一区二区三区黑人麻豆| 国产黄色激情视频| 久久久久毛片免费观看| 日韩成人在线网站| 国产乡下妇女做爰视频| 人人爽香蕉精品| 日本一区视频在线观看| 日韩视频网站在线观看| 一区二区三区高清国产| 欧美激情一区二区三区免费观看| 国产不卡免费视频| 国产成人永久免费视频| 欧美影视资讯| 丝袜一区二区三区| 国产剧情久久久| 久久久青草青青国产亚洲免观| a级网站在线观看| 亚洲成人人体| 伊人久久久久久久久久久久久| 国产精品111| 99re在线视频这里只有精品| aⅴ在线免费观看| 欧美三级伦理在线| 国产精品亚洲精品| 色窝窝无码一区二区三区成人网站| 国产精品免费久久| 99中文字幕在线| 精品动漫3d一区二区三区免费版| 91精品久久久久久久| 成年人网站在线| 亚洲丁香久久久| 波多野结衣黄色网址| 91天堂素人约啪| 国产又粗又长又大的视频| 亚洲91中文字幕无线码三区| 国产v亚洲v天堂无码| av日韩电影| 日韩视频在线一区| 中文字幕黄色av| 一区二区三区小说| 欧美一区二区三区成人精品| 久久精品理论片| 日韩国产一级片| 日韩一区电影| 国产一区二区三区四区五区加勒比| 日本性爱视频在线观看| 亚洲欧美日韩精品久久亚洲区| 在线观看亚洲欧美| 国产精品丝袜一区| 男女男精品视频站| 国产尤物精品| 午夜精品一区二区在线观看的| 欧美日韩五区| 高清欧美电影在线| 在线视频三区| 日韩电影中文 亚洲精品乱码 | 日本50路肥熟bbw| 日本成人在线不卡视频| 国产精品国产对白熟妇| 水蜜桃精品av一区二区| 成人免费视频网址| 在线黄色的网站 | 国产精品实拍| 亚洲人成亚洲人成在线观看| www精品国产| 欧美日韩一区视频| 在线精品免费视| 亚洲一区二区三区四区五区中文 | 久久精品九色| 国产精品久久久久久久午夜 | 91成人app| 国产91在线播放| 日本黄色免费在线| 欧美精品久久久久久久| 成人影欧美片| 中文字幕精品久久| 国产中文在线| 亚洲精品自在久久| 一卡二卡在线视频| 色先锋资源久久综合| 在线观看天堂av| 国产网站一区二区| 交换做爰国语对白| 久久精品国产99国产精品| 日本熟妇人妻xxxxx| 国产精品普通话对白| 久久99久久99精品| 欧美色123| 蜜臀在线免费观看| 亚洲mv大片欧洲mv大片| 在线观看日本一区| 国产精品传媒精东影业在线| 日产精品高清视频免费| 国产欧美日韩精品一区二区免费 | 亚洲免费观看高清完整 | 成人午夜视频在线| 日批视频在线看| 丝袜亚洲另类丝袜在线| 性做爰过程免费播放| 999国产精品| 裸体大乳女做爰69| 亚洲一级毛片| 日产精品久久久久久久蜜臀| 欧美激情 亚洲a∨综合| 777久久精品一区二区三区无码 | 亚洲日韩欧美视频| 久青青在线观看视频国产| 亚洲男人天堂九九视频| 欧美xxx.com| 精品嫩草影院久久| 人人妻人人玩人人澡人人爽| 亚洲激情在线视频| 99视频免费看| 日韩美女一区二区三区四区| 亚洲AV无码国产精品午夜字幕 | 国产精品自在线拍| 国产一区二区三区奇米久涩 | 久久综合给合久久狠狠色| 神马久久影院| 涩涩日韩在线| 欧美在线网站| 日本毛片在线免费观看| 日韩av在线播放中文字幕| 亚洲精品久久久中文字幕| 国产在线国偷精品产拍免费yy| 激情网站五月天| 狠狠色丁香婷婷综合| 91成人在线观看喷潮蘑菇| 99riav久久精品riav| 日本一区二区在线观看视频| 国产精品123| 男女一区二区三区| 久久精品一区四区| 3d动漫精品啪啪一区二区下载 | 欧美一级视频| 色国产在线视频| 成人一道本在线| 中文字幕有码在线播放| 亚洲欧美激情在线| 国产无遮挡呻吟娇喘视频| 欧美视频日韩视频在线观看| 99久久精品日本一区二区免费 | 国产精品99久久久久久久久久久久| 色是在线视频| 成人黄色av网站| 首页亚洲中字| 国产成人生活片| 久久一二三四| 亚洲色图久久久| 蜜臀av性久久久久av蜜臀妖精| 99视频在线视频| 成人一二三区视频| 国产视频123区| 亚洲少妇最新在线视频| 欧美三日本三级少妇99| 欧美日本不卡视频| 欧美日本网站| 欧美激情视频网| 日韩精品一页| 欧美专区一二三| 亚洲小说欧美另类婷婷| 亚洲欧美偷拍另类| 久久亚洲一区二区三区明星换脸| 波多野结衣 在线| 国产精品拍天天在线| 69精品久久久| 色噜噜狠狠色综合中国| 国产成人无码www免费视频播放| 亚洲国产精品视频在线观看| 黄网站在线免费| 国产精品免费电影| 亚洲视频分类| 免费无码毛片一区二三区| 国产精品一区三区| 老熟妇高潮一区二区三区| 一本色道久久综合亚洲91| 亚洲天堂avav| 亚洲天堂视频在线观看| 日韩av一卡| 国产精品果冻传媒潘| 你懂的国产精品永久在线| 国产福利精品一区二区三区| 北条麻妃国产九九精品视频| 五月天av网站| 欧美精品日韩一本| 在线播放麻豆| 2019av中文字幕| 精品视频自拍| 99热久久这里只有精品| 国产不卡在线视频| 九九热精品在线观看| 91精品国产高清一区二区三区| 香蕉视频黄色片| 97国产真实伦对白精彩视频8| 91亚洲视频| 日韩精彩视频| 亚洲美女视频在线免费观看| 一个人看的视频www| 亚洲精品视频在线观看网站| 99久久国产热无码精品免费| 欧美成人一区在线| 99精品国产一区二区三区2021| 神马影院一区二区| 99热免费精品| 精品人妻一区二区三区香蕉| 欧美日韩午夜激情| 男女视频在线观看| 国产成人精品a视频一区www| 国产一区二区三区探花| 蜜臀视频一区二区三区| 中文一区在线播放| 天天干,天天干| 亚洲国产福利在线| 成人福利片网站| 国产美女精品久久久| 亚洲乱码在线| 中文字幕人妻熟女在线| 岛国精品视频在线播放| 国产精品免费播放| 成人a在线视频| 激情综合亚洲| 中文字幕在线看高清电影| 欧美亚洲日本国产| 青青草视频免费在线观看| 国产精品精品一区二区三区午夜版| 亚洲成在人线免费观看| 欧美伦理视频在线观看| 国产精品国产三级国产a| 免费精品一区二区| 久久精品成人欧美大片| 2020国产精品极品色在线观看| 国产免费一区二区三区四在线播放| 免费观看成人av| 麻豆亚洲av熟女国产一区二| 精品网站999www| 亚洲人成网站在线在线观看| 亚洲国产精品无码观看久久| 国产欧美一区二区精品忘忧草| 日韩人妻精品中文字幕| 久久九九免费视频| 国产另类在线| 中国黄色片一级| 欧美日韩国产一区在线| 日本中文在线观看| 国产一区自拍视频| 精一区二区三区| 91九色丨porny丨肉丝| 日韩中文字幕在线视频| 欧美日韩破处视频| 国产深夜男女无套内射| 综合久久综合久久| 天堂在线中文资源| 91手机在线观看|