記錄--9個封裝Vue組件的小技巧

来源:https://www.cnblogs.com/smileZAZ/archive/2023/05/12/17395927.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 組件是前端框架的基本構建塊。把它們設計得更好會使我們的應用程式更容易改變和理解。在這節課中,分享一下在過去幾年中工作中學到的 9 個技巧。 1. 你可能不需要創建一個組件 在創建一個組件之前,看看它是為了可重用性和為某些UI添加一個狀態, ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

組件是前端框架的基本構建塊。把它們設計得更好會使我們的應用程式更容易改變和理解。在這節課中,分享一下在過去幾年中工作中學到的 9 個技巧。

1. 你可能不需要創建一個組件

在創建一個組件之前,看看它是為了可重用性和為某些UI添加一個狀態,還是僅僅為了組織和劃分代碼。

如果是後者,那麼你就不需要創建它,因為它只會增加更多不必要的工作,比如傳遞props和發射事件。

不僅如此,它還要求我們跳轉到該文件以查看它所包含的內容,而不是直接在父組件中看到它,這就乾凈多了。

2. 使用插槽而不是 prop 來顯示內容

假設有一個可重覆使用的按鈕組件,它通過props獲取文本。

<BaseButton label="Delete Item"/>

如果想在其中顯示一個圖標,必須添加更多的道具,如<BaseButton label="Delete Item" icon="delete" />並更新組件以顯示該圖標。

但有了插槽,我們就可以在每次使用該組件時,以想要的方式顯示標簽:

<BaseButton>
  Delete Item <Icon name="delete" />
</BaseButton>

或者你只需要把某個單詞加粗。對於插槽,可以直接在文本中使用<strong>標記,而不是在組件中解析它。

3. 將該組件與觸發它的因素分組

有時有兩個獨立的組件在某種情況下一起使用。最好把它們放在一個新的組件中,這樣重覆使用和移動它們更容易。

一個常見的例子是 Modal 組件。我們通常在點擊一個特定的按鈕時顯示Modal。與其在每次我們想重用它(或把它移到其他地方)時添加showModal狀態和導入modal與它的按鈕,不如有一個單一的組件來顯示按鈕,當用戶點擊時,它顯示相關的modal。

<!-- CreateItemButton.vue -->
<template>
  <Modal v-if="showModal" @close="showModal = false" />
  <BaseButton @click="showModal = true">
    Create Item
  </BaseButton>
</template>

<script setup>
const showModal = false
</script>

4. 使用 teleport,從任何地方顯示固定位置的元素

繼續前面的例子,如果我們想正確地顯示 modal ,我們需要確保模態使用正確的z-index,並且它在HTML代碼中顯示在正確的位置,所以它總是顯示在頁面上所有東西的上面。

我們可以通過直接將 modal 顯示為<body>元素的一個子元素來輕鬆地避免這個問題,無論我們在組件結構中使用它。

Teleport組件使我們能夠做到這一點。

我們所要做的就是用 <Teleport to="body"> 來包裝 modal 組件。

<!-- BaseModal.vue -->
<template>
  <Teleport to="body">
    <div class="modal"></div>
  </Teleport>
</template>

這個組件是Vue 3內置組件的一部分。如果你使用的是Vue 2,請查看PortalVue

5. 在一個對象中分組相關的 props

組件的 prop 列表是組件界面的一個主要部分。介面越清晰,就越容易使用和推理。

改進 prop 列表的一個方法是將相關的屬性分組在一起。以這個組件為例:

<PostCard
  :title="post.title"
  :date="post.date"
  :layout="currentLayout"
  :image="post.imageUrl"
  <!-- more props -->
/>
我們需要花幾秒鐘時間來瞭解這裡有哪些 props 與帖子(post )相關。但我們可以像這樣把與帖子相關的 props 分組,使之更加清晰。
<PostCard :post="post" :layout="currentLayout" />

所以現在我們很快就知道,layout 不是 post 數據的一部分。

不僅如此,我們還通過這種方法使更新 props 變得更加容易。例如,添加或刪除與帖子相關的props ,不需要我們更新組件的 props 列表。

6. 賦予每個迴圈item,賦予自己的狀態

創建一個新的組件的一個很好的理由是給一塊用戶界面提供它自己的狀態。我們需要這樣做的一個常見的地方是在v-for迴圈中:

<template>
  <div>
    <div v-for="(item, index) in items" :key="item.id">
      <input type="checkbox" v-model="checkedItems[index]">
    </div>
  </div>
</template>
<script setup>
const checkedItems = ref(items.map(item => item.checked))
</script>

為了跟蹤檢查過的 items,我們不得不創建一個數組,並用 items 的初始值來填充它。但是這段代碼還不夠強大。為了讓它變得更好,我們必須讓 items 通過它們的id而不是index 來訪問,因為 index 是不可靠的,可以改變。例如,如果你添加一個支持通過拖放來重新排列items 的功能呢?

為了簡化這段代碼,我們可以引入一個新的組件,為每個 item 保存一個狀態。像這樣:

<template>
  <div>
    <Item v-for="item in items" :key="item.id" :item="item" />
  </div>
</template>
Item 組件內容如下:
<template>
  <div>
    <input type="checkbox" v-model="checked">
  </div>
</template>

<script setup>
const props = defineProps({ item: Object })
const checked = ref(props.item.checked)
</script>

這種方法的另一個好處是,我們把所有 item 的相關數據、計算屬性和方法都加在一個地方,便於理解和改變。

7. 儘可能地將載入數據移至其用戶界面附近

無論你是用GraphQL還是其他API載入,最好把代碼放在儘可能接近使用它的用戶界面的地方。這有兩個原因:

  1. 移動帶有數據的UI組件變得更加容易。只需移動該組件,而無需尋找其依賴關係。

  2. 當所有的碎片被放在一個地方時,總是更容易理解代碼--可以看到用戶界面和它的數據來自哪裡。

有時,有多個組件使用同一個獲取的數據。在這種情況下,可以將獲取的代碼上移一級。因此,會有一個父組件,在那裡獲取數據,還有一個子組件,然後把數據傳遞給它。

但一定要確保它是一個單一的層次。如果不是,那就尋找一種方法來改進你的組件設計和它們之間的關係。

8. 純粹的UI組件不應訪問應用程式的狀態

有兩種類型的前端組件:純UI組件和特定應用組件。

純粹的UI組件是像按鈕、輸入框等。它們不應該知道關於應用程式的任何事情。它們的工作僅僅是為了顯示UI--它們通過 props 獲取數據。

特定於應用程式的組件是知道應用程式狀態的組件,無論是本地狀態還是全局狀態(通過狀態管理庫,如Pinia)。

分離這些組件使得在應用程式的其他地方,甚至在其他應用程式中重用UI組件更加容易。

如果你正在構建自己的UI組件,這個技巧也適用。如果你使用的是外部庫,如 Vuetify 或Quasar,那麼你就不必擔心這個問題--這些組件在設計時就考慮到了這一點。

9. 不要在組件中指定 width 或 margin

當創建一個組件時,你應該把它看作是一塊UI,可以像其他本地元素一樣使用。

讓用戶指定組件周圍的空間是實現這一目標的好方法。

假設你的組件在其根元素上有一個頂部邊距,而用戶想把它顯示在某個元素下麵,但沒有頂部邊距。要做到這一點,用戶必須設置一個與組件的margin相同的負margin,比如margin-top: -50px;更不用說在某些情況下,用戶必須與選擇器的特異性相匹配(或者可能使用!important)。

而寬度也是如此。如果用戶想讓該組件具有響應性,他們必須覆蓋其寬度和最大寬度。

因此,通過不在組件內部設置寬度和邊距,總是給用戶這種控制是有意義的。

代碼部署後可能存在的BUG沒法實時知道,事後為瞭解決這些BUG,花了大量的時間進行log 調試,這邊順便給大家推薦一個好用的BUG監控工具 Fundebug

來源:tahazsh.com/blog/vue-co…

本文轉載於:

https://juejin.cn/post/7158969880362876964

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 考前說明:所有項目運行過程中出現紅色字體的報錯信息是正常的,運行完成後看 “failed=0” 就代表執行成功,如果在執行任務期間暫停並且報錯那麼代表項目內部書寫格式或者命令輸入錯誤,請認真檢查 此文檔為考前模擬不代表真實考試環境及內容。 環境說明: | system | IP Address | ...
  • macOS系統中預設的C/C++編譯器是clang/clang++,命令行使用gcc/g++或者clang/clang++來執行命令時,都是調用clang/clang++編譯器,想使用gcc/g++編譯器的話,我們可以自己安裝。 查看一下gcc和clang 1. 安裝Homebrew,官網鏈接,複製 ...
  • 摘要:在實際使用過程中,資料庫集群級的故障並非高概率事件,如何安全高效地幫助客戶備份恢復一部分資料庫元素,才是更加實際的需求,這也是細粒度備份恢復的意義所在。 本文分享自華為雲社區《GaussDB(DWS)之物理細粒度備份恢復》,作者:我的橘子呢 。 1. 認識物理細粒度備份恢復 相對於集群級備份恢 ...
  • ACID :如果一個資料庫支持事務的操作,那麼該資料庫必須要具備以下四個特性 1、原子性(Atomicity) 事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響 2、一致性(Consistency) 事務必須使數據 ...
  • 這段時間,我們對產品本身以及客戶反饋的一些問題進行了持續的更新和優化,包括對離線平臺數據同步功能的更新,數據資產平臺血緣問題的優化等,力求滿足不同行業用戶的更多需求,為用戶帶來極致的產品使用體驗。 以下為袋鼠雲產品功能更新報告第五期內容,更多探索,請繼續閱讀。 離線開發平臺 1.支持工作流參數 背景 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者:Yejinrong/葉金榮 文章來源:GreatSQL社區原創 繼續吹MySQL 8.0~ 在以前,當需要對MySQL資料庫進行維護操作時,通常需 ...
  • (資料庫定時備份linux篇) 1 序言 相信大家都還記得這則新聞吧,歐洲雲計算巨頭 OVH 位於法國斯特拉斯堡的機房發生嚴重火災,大火徹底摧毀了五層高、占地 500 平方米的 SBG2 數據中心。 當地報紙稱 115 位消防員投入 6 個小時才將其撲滅。經過長達 6 個小時的持續燃燒,SBG2 內 ...
  • 摘要:本文以華為雲圖引擎 GES 為例,來介紹如何使用圖查詢語言 Cypher 表達一些需要做數據局部遍歷的場景。 本文分享自華為雲社區《使用 Cypher 子查詢進行圖探索 -- 以華為雲圖引擎 GES 為例》,作者:蜉蝣與海。 在圖資料庫/圖計算領域,很多查詢可以使用圖查詢語言Cypher、Gr ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...