日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

原生“跨組件”通信方式

來源: 責編: 時間:2023-11-13 17:18:38 308觀看
導讀現(xiàn)在已經(jīng)是“組件化”開發(fā)時代了。相信大家平時在vue或者react中都碰到過“跨組件”通信的需求,通常我們需要將數(shù)據(jù)放在一個公共的父級上,然后用context之類的方式傳遞下去,或者借用pinia這樣的開源庫去更好的管理這些數(shù)

USA28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在已經(jīng)是“組件化”開發(fā)時代了。USA28資訊網(wǎng)——每日最新資訊28at.com

相信大家平時在vue或者react中都碰到過“跨組件”通信的需求,通常我們需要將數(shù)據(jù)放在一個公共的父級上,然后用context之類的方式傳遞下去,或者借用pinia這樣的開源庫去更好的管理這些數(shù)據(jù)。USA28資訊網(wǎng)——每日最新資訊28at.com

不過,大部分項目可能沒有那么復雜,可能只有極少部分需要“跨組件”通信或者全局傳遞的,專門去引入一個全局狀態(tài)管理庫還是有一定成本的,不僅僅是性能開銷,還有學習成本。USA28資訊網(wǎng)——每日最新資訊28at.com

另外,還有一些舊項目,由于前期組件設計未考慮周全,或者由于后期需求迭代,導致需要跨組件通信,此時再引入狀態(tài)管理庫也有很大的改造成本。USA28資訊網(wǎng)——每日最新資訊28at.com

框架用久了,可能有些都忘了,原生 web 并沒有組件化的概念,整個頁面都是開放的,所以,借助原生的一些行為和方式,也能很輕易的解決“跨組件”通信問題,下面列舉了幾個方式,一起看看吧~USA28資訊網(wǎng)——每日最新資訊28at.com

一、label for

舉個例子,下面是之前做的一個錯別字糾錯功能,也就是自動檢測錯別字,然后提供替換和忽略一些功能,如下:USA28資訊網(wǎng)——每日最新資訊28at.com

USA28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在不用關注是怎么實現(xiàn)的,如果按照組件化拆分,右邊的糾錯面板肯定是單獨的組件。USA28資訊網(wǎng)——每日最新資訊28at.com

USA28資訊網(wǎng)——每日最新資訊28at.com

很自然的,關于忽略的相關函數(shù)也是寫在這個組件,類似于這樣。USA28資訊網(wǎng)——每日最新資訊28at.com

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

嗯,很好,組件化很不錯,邏輯也很清晰。USA28資訊網(wǎng)——每日最新資訊28at.com

過了兩天,產(chǎn)品又需要在另外一個地方也要有“忽略”功能,當鼠標懸浮的時候,下拉選項中也有忽略選項,并且這兩個忽略的功能是完全一樣的,如下:USA28資訊網(wǎng)——每日最新資訊28at.com

USA28資訊網(wǎng)——每日最新資訊28at.com

再單獨實現(xiàn)一遍肯定是不行的,把這個函數(shù)抽離出來?但是還有新的問題,整個錯別字的列表也是需要更新的,是不是也要把這個列表也獨立出來?USA28資訊網(wǎng)——每日最新資訊28at.com

no,當然不需要這么麻煩,僅需要一個label標簽就可以輕松搞定,如下:USA28資訊網(wǎng)——每日最新資訊28at.com

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

當然,右邊的忽略按鈕也需要加上一個相同的ID(實際中是動態(tài)生成的)。USA28資訊網(wǎng)——每日最新資訊28at.com

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

這樣,通過label+for就將這兩個元素關聯(lián)起來了,點擊這個label元素就相當于點擊了右邊的忽略按鈕,無需任何跨組件通信,是不是非常方便呢?USA28資訊網(wǎng)——每日最新資訊28at.com

二、主動觸發(fā)事件

有時候,需要通信的事件可能并不是通過按鈕點擊的,比如這樣一個寫作頁面,按照頁面布局和功能,各個部分肯定是單獨的組件,如下:USA28資訊網(wǎng)——每日最新資訊28at.com

USA28資訊網(wǎng)——每日最新資訊28at.com

其中,右上角有一個“保存”按鈕,可以保存內容,假設是這樣。USA28資訊網(wǎng)——每日最新資訊28at.com

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

現(xiàn)在,產(chǎn)品又提出一個要求,希望在寫作時,按 Ctrl + S也能保存內容。USA28資訊網(wǎng)——每日最新資訊28at.com

那么,你會怎么處理呢?把保存方法封裝一下?全局通信?USA28資訊網(wǎng)——每日最新資訊28at.com

其實,我們要做的事情很簡單,只需要主動去觸發(fā)一下保存按鈕的點擊事件就可以了,當然需要獲取到這個按鈕,所以要加個ID。USA28資訊網(wǎng)——每日最新資訊28at.com

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

然后在寫作組件中直接通過觸發(fā)click事件就好了。USA28資訊網(wǎng)——每日最新資訊28at.com

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

當然,我更習慣于用dispatch的方式來觸發(fā)。USA28資訊網(wǎng)——每日最新資訊28at.com

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

這樣的好處是不限類型,任意事件都可以觸發(fā),而不僅僅是點擊事件。USA28資訊網(wǎng)——每日最新資訊28at.com

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

關于dispatchEvent,下面還有更靈活的運用。USA28資訊網(wǎng)——每日最新資訊28at.com

三、dispatchEvent 和 addEventListener

dispatchEvent不僅可以觸發(fā)常見的點擊事件,也能夠觸發(fā)任意自定義事件。USA28資訊網(wǎng)——每日最新資訊28at.com

舉個例子,有兩個相互獨立的功能區(qū),有兩個按鈕,分別點擊后,會做一些操作,比如請求接口,最后會彈出同一個獎勵彈窗USA28資訊網(wǎng)——每日最新資訊28at.com

USA28資訊網(wǎng)——每日最新資訊28at.com

如果按照組件話的思維來考慮,可能需要將獎勵彈窗的狀態(tài)放在一個公共的父級,然后依次回調,或者用全局狀態(tài)管理庫區(qū)管理這些狀態(tài)。USA28資訊網(wǎng)——每日最新資訊28at.com

但是,如果從原生 web 來考慮,其實不必那么麻煩,下面是一些偽代碼。USA28資訊網(wǎng)——每日最新資訊28at.com

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

然后還有功能區(qū) B。USA28資訊網(wǎng)——每日最新資訊28at.com

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

然后還有獎勵彈窗。USA28資訊網(wǎng)——每日最新資訊28at.com

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

那么,怎么讓其他功能區(qū)的組件打開獎勵彈窗呢?USA28資訊網(wǎng)——每日最新資訊28at.com

這就需要用自定義事件了,很簡單,直接觸發(fā)一個自定義事件,假設就叫做prize。USA28資訊網(wǎng)——每日最新資訊28at.com

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

放在業(yè)務組件中就是。USA28資訊網(wǎng)——每日最新資訊28at.com

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

然后,我們可以在頁面任意地方都監(jiān)聽到這個事件,直接通過addEventListener就可以了。USA28資訊網(wǎng)——每日最新資訊28at.com

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

所以,我們可以把這個監(jiān)聽直接放在獎勵彈窗組件中。USA28資訊網(wǎng)——每日最新資訊28at.com

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

這樣,無論組件是什么樣的嵌套關系,都可以隨心所欲地通信了。USA28資訊網(wǎng)——每日最新資訊28at.com

四、最后總結一下

本文更多的還是提供一種思路,實際開發(fā)中可以自己權衡,什么方式比較合適,下面總結一下這三種方式USA28資訊網(wǎng)——每日最新資訊28at.com

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

當然,這些方式也不能濫用,畢竟用多了就顯得邏輯混亂,如果全局通信的情況比較多,還是建議使用傳統(tǒng)的組件化方式就行管理。USA28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-23634-0.html原生“跨組件”通信方式

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: CSS @scope 如何取代 BEM

下一篇: 用了這么多年Docker,殊不知你還有這么多彎彎繞!

標簽:
  • 熱門焦點
  • 鴻蒙OS 4.0公測機型公布:甚至連nova6都支持

    華為全新的HarmonyOS 4.0操作系統(tǒng)將于今天下午正式登場,官方在發(fā)布會之前也已經(jīng)正式給出了可升級的機型產(chǎn)品,這意味著這些機型會率先支持升級享用。這次的HarmonyOS 4.0支持
  • 6月安卓手機好評榜:魅族20 Pro蟬聯(lián)冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數(shù)據(jù)來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創(chuàng)建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態(tài)工廠方法模式,不屬于GoF 23種設計
  • 不容錯過的MSBuild技巧,必備用法詳解和實踐指南

    一、MSBuild簡介MSBuild是一種基于XML的構建引擎,用于在.NET Framework和.NET Core應用程序中自動化構建過程。它是Visual Studio的構建引擎,可在命令行或其他構建工具中使用
  • 多線程開發(fā)帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數(shù)據(jù)期間,該數(shù)據(jù)被其他的線程所修改,那么對于當前線程而言,該線程
  • 從零到英雄:高并發(fā)與性能優(yōu)化的神奇之旅

    作者 | 波哥審校 | 重樓作為公司的架構師或者程序員,你是否曾經(jīng)為公司的系統(tǒng)在面對高并發(fā)和性能瓶頸時感到手足無措或者焦頭爛額呢?筆者在出道那會為此是吃盡了苦頭的,不過也得
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現(xiàn)百度,功能雖然實現(xiàn)了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 到手價3099元起!iQOO Neo8 Pro今日首銷:安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發(fā)布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
  • 華為舉行春季智慧辦公新品發(fā)布會 首次推出電子墨水屏平板

    北京時間2月27日晚,華為在巴塞羅那舉行春季智慧辦公新品發(fā)布會,在海外市場推出之前已經(jīng)在中國市場上市的筆記本、平板、激光打印機等辦公產(chǎn)品,并首次推出搭載
Top 主站蜘蛛池模板: 南雄市| 司法| 尼玛县| 兰州市| 六盘水市| 克东县| 莆田市| 和静县| 安泽县| 昌黎县| 广汉市| 河西区| 沂南县| 聂荣县| 句容市| 邹城市| 凤山县| 南雄市| 五指山市| 天全县| 华亭县| 衡山县| 永川市| 大渡口区| 梧州市| 太湖县| 凤凰县| 阳江市| 西华县| 宝清县| 绥德县| 黄山市| 静宁县| 德兴市| 滨州市| 比如县| 永登县| 井冈山市| 天全县| 壶关县| 永德县|