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

久久久久久久网站| 欧美在线一二三四区| 国内一区二区三区在线视频| 精品在线播放视频| 色88久久久久高潮综合影院| 精品国产三级电影在线观看| 一区二区三区 日韩| 免费在线观看的电影网站| 久久色中文字幕| 91亚色免费| 羞羞色院91蜜桃| 激情久久中文字幕| 在线播放国产一区中文字幕剧情欧美 | 国内在线观看一区二区三区| 亚洲一区二区久久| 久久久无码人妻精品无码| 欧洲精品一区二区三区| 亚洲高清免费在线| 天堂v在线视频| 国产视频精品久久| 99久久夜色精品国产网站| 91沈先生作品| 一区精品在线观看| 男人的天堂亚洲在线| 久久频这里精品99香蕉| 久久精品一区二区三区四区五区| 尤物tv在线精品| 亚洲精品一区二区三区四区高清| 三上悠亚在线一区二区| 黄色亚洲网站| 大伊人狠狠躁夜夜躁av一区| 日韩欧美精品免费| 在线看女人毛片| 中文字幕一区二区三| 日韩精品一区二区三区外面 | 亚洲视频在线免费观看| 性色av蜜臀av浪潮av老女人 | 久久精品国产精品青草色艺| 懂色av成人一区二区三区| 国产一区二区精品久久| 91久久久久久久久久久久久| 中文字幕欧美在线观看| 日韩1区2区日韩1区2区| 国产精品av在线| 国产一级免费视频| 亚洲专区欧美专区| 欧美亚洲国产成人精品| 黄色大片网站在线观看| 国产日韩欧美一区| 欧美在线观看一区二区三区| 91精品国产乱码在线观看| 激情文学一区| 国语自产精品视频在线看抢先版图片| 国内偷拍精品视频| 亚洲午夜一级| 97激碰免费视频| 国产午夜性春猛交ⅹxxx| 国产一区二区三区的电影 | 自拍偷拍欧美一区| 国产香蕉97碰碰久久人人| 国产成人精品无码免费看夜聊软件| 亚洲va久久| 亚洲欧美日韩一区二区在线 | 国产精品久久久久久av下载红粉| 亚洲av无码乱码国产精品fc2| 丝袜亚洲另类丝袜在线| 国产精品久久999| 亚洲综合精品在线| 国产成人av电影免费在线观看| 翡翠波斯猫1977年美国| 无码国精品一区二区免费蜜桃| 2020日本不卡一区二区视频| 日韩精品一区二区三区色偷偷| 免费在线观看黄| 一区二区三区久久久| 日韩精品视频在线观看视频| 国产精品一区二区av影院萌芽| 欧美在线一区二区三区| 老女人性生活视频| 同性恋视频一区| 最好看的2019年中文视频| 久久精品视频免费在线观看| 国产精品丝袜xxxxxxx| 国产精品久久久久一区二区| aaa一区二区| 91麻豆免费视频| 亚洲午夜精品久久| 丰乳肥臀在线| 色8久久人人97超碰香蕉987| 五月天激情播播| 黑色丝袜福利片av久久| 在线看片第一页欧美| 国产高潮国产高潮久久久91 | 亚洲蜜臀av乱码久久精品 | 麻豆91精品91久久久的内涵| av成人观看| 国产h在线观看| 一区二区三区高清| 日本激情视频在线| av综合网址| 丝袜情趣国产精品| 日本一区二区三区免费视频| 久久se这里有精品| 久久本道综合色狠狠五月| 国产在线高清视频| 日本精品一级二级| 色悠悠在线视频| 精品日本12videosex| 欧美激情在线狂野欧美精品| 中文字幕一区2区3区| 99re热这里只有精品视频| 中文精品一区二区三区| 综合日韩av| 正在播放亚洲一区| 欧美熟妇激情一区二区三区| 亚洲激情欧美| www.久久爱.cn| 大地资源网3页在线观看| 色妞www精品视频| 韩国三级hd两男一女| 综合亚洲视频| 国产主播喷水一区二区| 国产福利在线看| 欧美日韩一区二区三区在线免费观看 | 中文字幕精品—区二区日日骚| www.成人影院| 日韩成人av在线播放| 九九热精彩视频| 狠狠色丁香婷婷综合久久片| 日本中文不卡| 超碰一区二区| 精品视频在线播放色网色视频| 久久一二三四区| 国产成人精品网址| 黑人巨大国产9丨视频| 日韩午夜视频在线| www.久久久久| 国产区精品在线| 亚洲欧美自拍偷拍色图| www.51色.com| 最新欧美人z0oozo0| 91丝袜美腿美女视频网站| 午夜视频在线看| 欧美男人的天堂一二区| 国产高清视频免费在线观看| 久久99国产精品免费网站| 亚洲一区二区在线看| 国产精品亲子伦av一区二区三区| 亚洲图片欧美日产| 丰满人妻一区二区三区四区| 国产三级精品在线| 久久婷婷综合色| 亚洲激情中文在线| 成人欧美视频在线| 美女在线视频免费| 亚洲日本中文字幕| 中文字幕在线视频第一页| 国产精品三级电影| 色婷婷综合在线观看| 欧美片第1页综合| 国产精品一区而去| 亚洲人体视频| 日韩中文字幕在线| 成人高潮片免费视频| 五月天网站亚洲| 欧美图片第一页| 极品少妇xxxx精品少妇| 成人免费观看在线| 香蕉人人精品| 国产精品久久一| 天堂亚洲精品| 亚洲精品自拍视频| 亚洲天堂手机在线| 亚洲成人一区在线| 欧美日韩国产黄色| 国产aⅴ精品一区二区三区色成熟| 秋霞无码一区二区| 不卡一区综合视频| www.成人三级视频| 91九色综合| 欧美国产视频一区二区| 九色视频成人自拍| 日韩欧美中文字幕制服| 精品人妻一区二区色欲产成人| 国产精品欧美一区二区三区| 日本泡妞xxxx免费视频软件| 美女精品一区| 91免费国产精品| 国产精品嫩模av在线| 亚洲a区在线视频| 亚洲免费福利| 欧美猛男性生活免费| 蜜桃视频在线播放| 欧美白人最猛性xxxxx69交| 激情视频网站在线观看| 亚洲综合成人网| 超薄肉色丝袜一二三| 不卡视频一二三四| 精品久久久99| 男人的天堂亚洲在线| 老司机激情视频| 日韩av片子| 久久精品美女| 亚洲视频一起| 成人黄色激情网| 国产精品专区免费| 国外成人在线播放| 中文字幕伦理免费在线视频| 中文字幕日韩专区| 丝袜+亚洲+另类+欧美+变态| 日韩欧美国产一区在线观看| 国产精品成人久久久| 欧美日韩在线另类| 国产污片在线观看| 亚洲精品国产一区二区精华液| 性欧美精品男男| 91麻豆国产福利在线观看| 久久久久久久久久久影视| 麻豆成人综合网| 国产精品69页| 香蕉久久国产| 久色视频在线播放| 在线精品观看| 少妇大叫太大太粗太爽了a片小说| 欧美国产一级| 五月天色一区| 精品国产一区二区三区| 欧美日韩在线不卡一区| 婷婷精品在线| 欧美亚洲免费在线| 伊人久久大香线蕉无限次| 久久一区二区三区欧美亚洲| 欧美绝顶高潮抽搐喷水合集| 狠狠色综合欧美激情| 国产精品99久久免费观看| 97se在线视频| 一区二区三区在线资源| 成人羞羞视频免费| 国产精品视屏| 精品国产91亚洲一区二区三区www| 一区视频网站| 国产精品国产亚洲精品看不卡15 | 亚洲高清在线播放| 日韩精品四区| 伊人av成人| 国产精品久久天天影视| 蜜臀av.com| 一个色综合网| 人妻夜夜添夜夜无码av| 国产欧美91| 北条麻妃在线一区| 免费在线成人网| 久久久久久久久久久久91| 久久精品国产99久久6| 亚洲图色中文字幕| 国产成人精品亚洲日本在线桃色| 97中文字幕在线观看| 99精品国产91久久久久久| 成人免费av片| 国产精品久久久久影院| 精品国产欧美日韩不卡在线观看| 亚洲自拍偷拍欧美| 欧美性猛交bbbbb精品| 欧美在线播放高清精品| 国产永久免费视频| 精品国产免费一区二区三区香蕉| 天天舔天天干天天操| 亚洲欧美日韩天堂一区二区| 久热国产在线| 亚州精品天堂中文字幕| 快播电影网址老女人久久| 国产主播欧美精品| 国产精品对白| 视频一区视频二区视频三区高| 91精品国偷自产在线电影 | 日韩在线电影一区| 中文字幕免费一区二区| 国产精品久久中文字幕| 日本vs亚洲vs韩国一区三区二区| 午夜视频在线观| 97久久超碰精品国产| 粉嫩精品久久99综合一区| 一级女性全黄久久生活片免费| 美女又爽又黄免费视频| 51精品久久久久久久蜜臀| 性xxxx18| 久久最新资源网| 欧美日韩美女| 99在线影院| 色777狠狠狠综合伊人| 日韩伦理在线免费观看| 精品综合久久久久久8888| 国产女人18毛片水真多18| 国产精品女主播av| 羞羞影院体验区| 日韩一区二区视频在线观看| 国内av一区二区三区| 色综合天天狠天天透天天伊人| 日韩欧美精品电影| 国产精品久久久久久久免费大片| 日韩电影免费网站| 男人揉女人奶房视频60分| 国产二区国产一区在线观看| 国产亚洲精品熟女国产成人| 亚洲成a人在线观看| 一本色道久久综合无码人妻| 日韩激情第一页| 超碰在线资源| 亚洲va久久久噜噜噜| 成人影视亚洲图片在线| 91专区在线观看| 国产黄色精品视频| 性生交大片免费全黄| 在线观看三级视频欧美| 日韩美女一级视频| 性色av一区二区咪爱| 亚洲一区二区免费在线观看| 中文字幕人成一区| 蜜乳av一区二区三区| 西西444www无码大胆| 粉嫩老牛aⅴ一区二区三区| 亚洲av无码乱码国产精品| 久久天天躁狠狠躁夜夜躁2014| 久久久成人av毛片免费观看| 欧美日韩精品综合| 久久99伊人| 成人影视免费观看| 欧美日韩美女视频| 五月婷婷六月丁香综合| 91av在线精品| 日韩高清影视在线观看| 性欧美大战久久久久久久| 懂色一区二区三区免费观看| 国产va在线播放| 日韩欧美激情在线| jizz一区二区三区| 精品乱子伦一区二区三区| 亚洲激情另类| 中文字幕一区二区人妻在线不卡| 婷婷激情综合网| 日本精品专区| 国产z一区二区三区| 欧美色女视频| 免费看涩涩视频| 中文字幕日韩一区二区| 99久久久久久久| 欧美另类69精品久久久久9999| 51亚洲精品| 久无码久无码av无码| 91美女片黄在线观看| 天天射天天干天天| 精品国产一区二区在线| 成人豆花视频| 丁香六月激情网| 99久久精品情趣| 五月天婷婷导航| 中文字幕亚洲色图| 国产95亚洲| 福利视频一二区| 国产三级精品视频| 国产又粗又黄又爽的视频| 欧美精品在线观看| 国产麻豆天美果冻无码视频| 国产大片一区二区| 精品无码久久久久| 亚洲精品久久久久久久久久久久| 久久久男人天堂| 日产精品一线二线三线芒果| 精品一区二区三区在线播放| 九九视频在线观看| 精品无人区太爽高潮在线播放| 国产另类xxxxhd高清| 亚洲人成77777| 国产+成+人+亚洲欧洲自线| 日韩免费视频一区二区视频在线观看| 国产一区二区三区丝袜| 精品国产鲁一鲁****| 欧美一级欧美一级| 国产色婷婷亚洲99精品小说| av无码精品一区二区三区宅噜噜| 韩国精品久久久999| 欧美电影免费播放| 性欧美丰满熟妇xxxx性久久久| 在线亚洲高清视频| 欧洲性视频在线播放| 日韩欧美精品一区二区| 国产**成人网毛片九色| 伊人成年综合网| 欧美激情网站在线观看| 欧美一级精品| youjizz.com日本| 欧美日韩国产乱码电影| av手机在线观看| 久久99国产精品一区| 久久久欧美精品sm网站| 精品毛片一区二区三区| 国产精品欧美亚洲777777| 中文一区在线| www.av视频| 日韩亚洲欧美成人|