記錄--elementui源碼學習之仿寫一個el-button

来源:https://www.cnblogs.com/smileZAZ/archive/2023/03/07/17189050.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 本篇文章記錄仿寫一個el-button組件細節,從而有助於大家更好理解餓了麽ui對應組件具體工作細節。本文是elementui源碼學習仿寫系列的又一篇文章,後續空閑了會不斷更新並仿寫其他組件。源碼在github上,大家可以拉下來,npm ...


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

elementui源碼學習之仿寫一個el-button

本篇文章記錄仿寫一個el-button組件細節,從而有助於大家更好理解餓了麽ui對應組件具體工作細節。本文是elementui源碼學習仿寫系列的又一篇文章,後續空閑了會不斷更新並仿寫其他組件。源碼在github上,大家可以拉下來,npm start運行跑起來,結合註釋有助於更好的理解

網站效果演示:ashuai.work:8888/#/myButton

GitHub倉庫地址:github.com/shuirongshu…

什麼是Button組件

按鈕用於點擊,一般是做事件的響應。

按鈕封裝效果圖

1111.gif

按鈕分類

  • 單一按鈕
    • 預設按鈕
    • 主題按鈕(primary、success、warning、error)
    • 按鈕大小(small、middle、big)
    • 按鈕禁用(disabled)
    • 按鈕載入(loading)
    • 按鈕的圖標位置(預設圖標在按鈕文字左側)
    • 圖標按鈕(沒有按鈕文字)
    • 單一文字按鈕
  • 按鈕組(按鈕組中有多個按鈕)

預設按鈕

預設按鈕很簡單,只是寫一個最普通的樣式即可

<button :class="[ 'myButton' ]" />

.myButton {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  white-space: nowrap;
  box-sizing: border-box;
  padding: 12px 16px;
  background-color: rgba(0, 0, 0, 0.1);
  color: #222;
  border: none;
  cursor: pointer;
  user-select: none; // 不讓選中文字
  transition: all 0.3s;
  font-size: 14px;
}
// 懸浮效果
.myButton:hover {
  background-color: rgba(0, 0, 0, 0.2);
}
// 按中效果
.myButton:active {
  background-color: rgba(0, 0, 0, 0.3);
}

筆者這裡是將懸浮的效果和按中的效果,設置背景色越來越深。這樣的話,看著效果比較明顯

主題按鈕

所謂按鈕的主題,就是添加不同的類名,比如primary主題的按鈕,就加上.primary類名、success主題的按鈕,就加上.success類名。然後使用動態class去添加即可(這裡使用動態class的數組用法)。如:

<button :class="[ 'myButton', type ]" />

變數type的值源自於使用按鈕組件時,傳遞進來的type參數

const typeArr = [
  "",
  "primary",
  "success",
  "warning",
  "error",
  "text",
  "dangerText",
];

props:{
    type: { // 按鈕主題類型
      type: String,
      validator(val) {
        return typeArr.includes(val); // 這裡可以加一個校驗函數,其實不加也行
      },
    },
}

然後給不同type值加上對應的樣式即可。如下:

// primary樣式
.primary {
  background-color: #1867c0;
  color: #fff;
}
.primary:hover {
  background-color: #0854ac;
}
.primary:active {
  background-color: #033d7f;
}

// success樣式
.success {
  background-color: #19be6b;
  color: #fff;
}
.success:hover {
  background-color: #0ea459;
}
.success:active {
  background-color: #008140;
}

// warning樣式
.warning {
  background-color: #ffc163;
  color: #fff;
}
.warning:hover {
  background-color: #db952d;
}
.warning:active {
  background-color: #b97b1d;
}

// 等等type值樣式...

按鈕大小

按鈕大小可以使用padding值的大小去控制,也可以直接使用zoom縮放做控制

這裡使用動態style搭配計算屬性的方式去控制,如下代碼:

// 不同的大小指定不同的縮放程度
const sizeObj = {
  small: 0.85,
  middle: 1,
  big: 1.2,
};

props:{ size: String }

<button :style="styleCal" />

computed: {
    styleCal() {
        return {
            zoom: sizeObj[this.size] // zoom縮放的值大小取決於傳遞進來的size值
        }
    }
}

按鈕禁用

按鈕禁用disable沒啥好說的,主要是要註意loading的時候,也要禁用掉,loading載入的時候,不允許用戶再點擊。

<button :disabled="disabled || loading" />

props:{
    loading:Boolean
}

這裡註意一下,按鈕禁用的樣式也是通過動態class加上的,請往下看

按鈕載入

註意載入時樣式和載入按鈕圖標出來的時候,將其他的圖標給隱藏起來。(同一時刻,只能有一個按鈕圖標,這樣保證按鈕載入時簡潔一些)

  <button
    :class="[
      'myButton', // 預設樣式
      disabled ? 'disabledBtn' : '', // 動態加上禁用按鈕樣式
      loading ? 'loadingBtn' : '', // 動態加上loading載入中按鈕樣式
      type, // 主題樣式
    ]"
    :disabled="disabled || loading" // 禁用時禁用,載入時也禁用
  >
    <i class="el-icon-loading" v-if="loading"></i>
    <!-- 使用傳進來的圖標,通過動態style控製圖標和文字見的間隔,同一時刻下,
    只能有一個圖標出現,所以有loading圖標了,就不能有別的圖標了 -->
    <i :class="icon" :style="styleGap" v-if="icon && !loading"></i>
    <slot></slot>
  </button>

按鈕的圖標位置

預設從左往右排列(圖標在左側、文字在右側),這裡我們可以使用彈性盒的方向flexDirection屬性,來控制從左往右還是從右往左排列

<button :style="styleCal"/>

styleCal() {
  // 控制縮放和指定預設圓角以及設置圖標在文字左側還是右側
  let styleObj = {
    zoom: sizeObj[this.size],
    borderRadius: "5px",
    flexDirection: this.rightIcon ? "row-reverse" : "row",
  };
  return styleObj;
},

圖標按鈕和單一文字按鈕

這兩個也很簡單,

  • 圖標按鈕註意加圓角的時機
  • 單一文字按鈕的樣式要預留設置一份即可

然後動態控制一下即可

按鈕組

按鈕組註意事項:

  • 首先將所有的按鈕的圓角全部去掉(這樣的話,所有的按鈕都是方方正正的按鈕了)
  • 然後單獨給第一個按鈕:first-of-type的左上角和左下角的圓角設置一下
  • 然後再給最後一個按鈕last-of-type的右上角和右下角的圓角設置一下
  • 最後,按鈕組之間需要有間隔,這裡使用border-right做分割線
  • 最最後,再把最後一個按鈕的右邊框去掉即可,如下css代碼
// 附上按鈕組樣式
.myButtonGroup > .myButton {
  border-radius: unset !important; // 給所有的按鈕都去掉圓角
  border-right: 1px solid #fff; // 給按鈕加上分隔線條
}
// 第一個按鈕左側圓角
.myButtonGroup > .myButton:first-of-type {
  border-top-left-radius: 5px !important; 
  border-bottom-left-radius: 5px !important;
}
// 最後一個按鈕的右側圓角
.myButtonGroup > .myButton:last-of-type {
  border-top-right-radius: 5px !important;
  border-bottom-right-radius: 5px !important;
  border-right: none; // 同時,清除最後一個按鈕的右側邊框
}

代碼

複製粘貼即可使用,如果道友覺得代碼幫忙到了您,歡迎給咱github倉庫一個star哈

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

-Advertisement-
Play Games
更多相關文章
  • 1. 什麼是HTTPS? HTTPS(全稱:Hypertext Transfer Protocol Secure),是以安全為目標的 HTTP 通道,在HTTP的基礎上通過傳輸加密和身份認證保證了傳輸過程的安全性。HTTPS在HTTP的基礎下加入SSL,HTTPS的安全基礎是SSL,因此加密的詳細內 ...
  • element-plus官網實在是太不穩定了,所以自己搭建了一套在本地,流程如下: 環境安裝 yum install node yum install npm node install -g pnpm 從gitee拉取代碼 wget -P /opt/element-plus https://gite ...
  • 無論你是後端程式員還是前端程式員,都避免不了和Linux打交道。Linux的命令有很多,這裡僅介紹常用的20個,方便快速查看,也歡迎大家作補充。 1.mkdir 命令 make directories的縮寫,用來創建目錄創建目錄 語法格式 : mkdir [參數] [目錄] 常用參數: | 參數 | ...
  • Ubuntu 18.04.2 server LTS安裝1、第一行安裝Ubuntu2、語言選英語,安裝過程中使用的語言,也是安裝完後系統預設語言3、跳最後一項選other;然後選Asia(亞洲);選China(中國)4、語言環境選en_US.UTF-85、鍵盤佈局檢查,選擇NO6、鍵盤佈局選擇美式En ...
  • 導讀 一條事務由、開始事務、執行事務(增刪改查操作)、提交事務或回滾,三個步驟組成。 級別:讀未提交 其他事務修改欄位後 - 提交事務前,此期間,當前事務能讀到,該欄位修改後未提交的值 ,所以叫讀未提交,由此會產生臟讀問題。 問題:臟讀 1.A欄位 值為 1 2.事務A 修改 A欄位 為 2 3.事 ...
  • 以製作生產質量數據可視化看板為例,介紹用excel製作可視化看板的思路以及數據透視表、Vlookup、sumif、rank等常用函數的用法。提供完整數據和製作可視化看板的思路以及建立可視化看板的操作步驟,足夠支撐大家復現類似的可視化看板。 ...
  • 前言:最近幾年用MYSQL資料庫挺多的,發現了一些非常有用的小玩意,今天拿出來分享到大家,希望對你會有所幫助。 ...
  • 好家伙,本篇為《JS高級程式設計》第十章“期約與非同步函數”學習筆記 ES8 的 async/await 旨在解決利用非同步結構組織代碼的問題。 為為此增加了兩個新關鍵字:async 和 await。 1.async關鍵字 1.1.使用說明 async 關鍵字用於聲明非同步函數。 函數聲明、函數表達式、箭 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...