el-tabs添加按鈕增加點擊禁止樣式

前置文章

一、vue使用element-ui自定義樣式思路分享【實操】
二、vue3&ts&el-tabs多個tab表單校驗

現狀確認

  • 點擊添加按鈕,沒有點擊樣式,用戶感知不明顯
  • 沒有限制最大的tab添加數量,可以無限添加
    請添加圖片描述

調整目標&代碼編寫

調整目標

  • 點擊添加按鈕,按鈕背景變成藍色,加號圖標變成白色
  • 限制最大的tab添加數量為10,超過10添加按鈕設置為灰色不可點擊

代碼編寫

點擊添加按鈕,按鈕背景變成藍色

在vue使用element-ui自定義樣式思路分享【實操】提到了如何給el-tabs按鈕自定義樣式,文本在按鈕已經設置了自定義樣式的基礎上進行,首先實現點擊按鈕時,背景顏色變成藍色,考慮使用偽類選擇器active來實現。
藍色保持與element框架默認提供的一致,可以通過Snipaste來拾取:F1開啟截屏,鼠標移動到藍色區域,Shift切換顏色數據類型,按C完整復制。
在這里插入圖片描述
代碼調整如下

/*添加按鈕點擊顯示藍色*/
.asset-tab :deep(.el-tabs__new-tab):active {background: #409eff;
}

效果
請添加圖片描述

點擊添加按鈕,加號圖標變成白色

觀察svg的樣式選擇器,觀察到通過fill設置顏色不生效,修改color顏色才生效,例如下圖中設置為紅色
在這里插入圖片描述
添加代碼

/*設置svg點擊顏色顯示白色*/
.asset-tab :deep(.el-tabs__new-tab):active .is-icon-plus svg {color: white;
}

效果
請添加圖片描述

js動態禁止按鈕點擊&設置按鈕禁止樣式

添加禁止樣式(主要關注前面三行)

/*禁止樣式*/
.asset-tab :deep(.el-tabs__new-tab.disabled) {pointer-events: none;opacity: 0.8;background: lightgray;height: 30px;width: 30px;border-radius: 15px;font-size: 16px;
}

操作document動態添加或去除禁止樣式,注意document.querySelector()選擇器不需要加:deep(),并將修改邏輯抽取成方法setAddBtnStatus,在增減tab邏輯后調用即可

const setAddBtnStatus = function () {const newTab = document.querySelector('.asset-tab .el-tabs__new-tab')console.log('newTab', newTab)const index = tabs.value.lengthif (index >= 10) {newTab?.classList.add('disabled')} else {newTab?.classList.remove('disabled')}
}

最終效果&完整代碼

請添加圖片描述
完整代碼:

<!--AssetCreate.vue-->
<template><div style="margin-bottom: 10px"><h3>數據源選擇:</h3><el-switch v-model="isUseLocalFlag" active-text="使用本地服務數據" inactive-text="使用mock數據"/><el-button @click="setTabData" style="margin-left: 10px;">給tab賦值</el-button><el-button @click="clearTabData" >清空tab賦值</el-button></div><div class="asset-tab"><el-tabs v-model="activeTab" type="card" editable class="demo-tabs" @edit="handleTabsEdit"><el-tab-pane v-for="tab in tabs" :key="tab.name" :label="tab.label" :name="tab.name"><AssetItem ref="assetItemRefs" :insertForm="tab.insertForm"/></el-tab-pane></el-tabs></div><div class="bottom-btn"><el-button @click="submitAsset" type="primary">提交</el-button></div>
</template><script setup lang="ts">
import { ref } from 'vue'
import axios from 'axios'
import type { TabPaneName } from 'element-plus'
import { removeRedundantFields } from '@/utils/methodUtil'
import AssetItem from '@/components/asset/AssetItem.vue'
import type { AssetFormData } from '@/types'
import { ElMessage } from 'element-plus'
// 當前激活的tab
const activeTab = ref('表單 1')
// tabs初始數據
const tabs = ref([{ label: '表單 1', name: '表單 1', insertForm: {} }
])
const isUseLocalFlag = ref(true)
const clearTabData = function () {tabs.value = [{ label: '表單 1', name: '表單 1', insertForm: {} }]activeTab.value = '表單 1'setAddBtnStatus()
}
const setTabData = async function () {const bizId = '0777c40218114c35a29b0d4d84355668'if (isUseLocalFlag.value) {await axios.post(`/asset/assetInfo/${bizId}/byBizId`).then(result => {if (result.status === 200) {tabs.value = []const assetInfoList = result?.data?.data?.assetInfoListconst removeResult = removeRedundantFields(assetInfoList, ['extAttribute11', 'extAttribute12','extAttribute13', 'extAttribute14', 'extAttribute15', 'extAttribute16', 'extAttribute17', 'extAttribute18','extAttribute19', 'extAttribute20'])removeResult.forEach((item, index) => {const newTabName = `表單 ${index + 1}`tabs.value.push({label: newTabName,name: newTabName,insertForm: item})setAddBtnStatus()activeTab.value = newTabName})}})} else {// 請求mock數據await axios.post('/mock/asset/assetInfo', { bizId }).then(result => {const assetInfoList: Array<AssetFormData> = result?.data?.data?.assetInfoListtabs.value = []assetInfoList.forEach((asset, idx) => {const newTabName = `表單 ${idx + 1}`tabs.value.push({label: newTabName,name: newTabName,insertForm: asset})setAddBtnStatus()activeTab.value = newTabName})})}
}
const assetItemRefs = ref<InstanceType<typeof AssetItem>[]>([])
const handleTabsEdit = (targetName: TabPaneName | undefined,action: 'remove' | 'add'
) => {if (action === 'add') {let index = tabs.value.lengthif (index >= 10) returnconst newTabName = `表單 ${++index}`tabs.value.push({label: newTabName,name: newTabName,insertForm: {}})activeTab.value = newTabName} else if (action === 'remove') {const activeName = activeTab.valueif (tabs.value.length === 1) returntabs.value = tabs.value.filter((tab) => tab.name !== targetName)tabs.value.forEach((item, index) => {item.name = `表單 ${++index}`item.label = item.name})const currentExist = tabs.value.some((item, index) => {if (item.name === activeName) {return index}return false})if (!currentExist) activeTab.value = tabs.value[tabs.value.length - 1].name}setAddBtnStatus()
}
const setAddBtnStatus = function () {const newTab = document.querySelector('.asset-tab .el-tabs__new-tab')const index = tabs.value.lengthif (index >= 10) {newTab?.classList.add('disabled')} else {newTab?.classList.remove('disabled')}
}
const verifyPass = ref(true)
const submitAsset = async function () {for (const index in assetItemRefs.value) {const verifyResult = await assetItemRefs.value[index].submitForm()// 定位到第一個校驗失敗的tabif (!verifyResult) {verifyPass.value = falseactiveTab.value = `表單 ${Number(index) + 1}`break} else {verifyPass.value = true}}if (verifyPass.value) ElMessage({ message: '表單校驗通過', type: 'success' })
}
</script><style scoped>
/*禁止樣式*/
.asset-tab :deep(.el-tabs__new-tab.disabled) {pointer-events: none;opacity: 0.8;background: lightgray;height: 30px;width: 30px;border-radius: 15px;font-size: 16px;
}
.asset-tab :deep(.el-tabs__new-tab) {height: 30px;width: 30px;border-radius: 15px;font-size: 16px;
}/*添加按鈕點擊顯示藍色*/
.asset-tab :deep(.el-tabs__new-tab):active {background: #409eff;
}
/*設置svg點擊顏色顯示白色*/
.asset-tab :deep(.el-tabs__new-tab):active .is-icon-plus svg {color: white;
}
.bottom-btn {text-align: center;margin-bottom: 10px;
}
</style>

代碼倉:hello_vue3

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75855.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75855.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DB-Mysql中TIMESTAMP與DATETIME的區別

文章目錄 ?存儲范圍??時區處理?存儲空間?默認值和自動更新??零值處理?適用場景?總結 在MySQL中&#xff0c;TIMESTAMP和DATETIME是兩種常用的日期時間數據類型&#xff0c;它們雖然都用于存儲日期和時間&#xff0c;但在多個方面存在顯著差異。以下是它們的主要區別&a…

Spring 中有哪些設計模式?

&#x1f9e0; 一、Spring 中常見的設計模式 設計模式類型Spring 中的應用場景單例模式創建型默認 Bean 是單例的工廠模式創建型BeanFactory、FactoryBean抽象工廠模式創建型ApplicationContext 提供多個工廠接口代理模式結構型AOP 動態代理&#xff08;JDK/CGLIB&#xff09;…

C# Winform 入門(3)之尺寸同比例縮放

放大前 放大后 1.定義當前窗體的寬度和高度 private float x;//定義當前窗體的寬度private float y;//定義當前窗臺的高度 2.接收當前窗體的尺寸大小 x this.Width;//存儲原始寬度ythis.Height;//存儲原始高度setTag(this);//為控件設置 Tag 屬性 3.聲明方法&#xff0c;獲…

從零開始的編程-java篇1.6.3

前言&#xff1a; 通過實踐而發現真理&#xff0c;又通過實踐而證實真理和發展真理。從感性認識而能動地發展到理性認識&#xff0c;又從理性認識而能動地指導革命實踐&#xff0c;改造主觀世界和客觀世界。實踐、認識、再實踐、再認識&#xff0c;這種形式&#xff0c;循環往…

【Redis】數據的淘汰策略

目錄 淘汰策略方案&#xff08;8種&#xff09; LRU和LFU策略的區別 使用建議 手搓LRU算法 方式一 方式二 大家好&#xff0c;我是jstart千語。今天和大家回來聊一下redis&#xff0c;這次要講的是它的淘汰策略。為什么需要淘汰策略呢&#xff0c;就是當redis里面的內存占…

【前端】Node.js一本通

近兩天更新完畢&#xff0c;建議關注收藏點贊。 目錄 復習Node.js概述使用fs文件系統模塊path路徑模塊 http模塊 復習 為什么JS可以在瀏覽器中執行 原理&#xff1a;待執行的JS代碼->JS解析引擎 不同的瀏覽器使用不同的 JavaScript 解析引擎&#xff1a;其中&#xff0c;C…

【AI論文】JavisDiT: 具備層次化時空先驗同步機制的聯合音視頻擴散Transformer

摘要&#xff1a;本文介紹了一種新型的聯合音頻-視頻擴散變換器JavisDiT&#xff0c;該變換器專為同步音頻-視頻生成&#xff08;JAVG&#xff09;而設計。 基于強大的擴散變換器&#xff08;DiT&#xff09;架構&#xff0c;JavisDiT能夠根據開放式用戶提示同時生成高質量的音…

Java-實現公有字段自動注入(創建人、創建時間、修改人、修改時間)

文章目錄 Mybatis-plus實現自動注入定義 MetaObjectHandler配置 MyBatis-Plus 使用 MetaObjectHandler實體類字段注解使用服務類進行操作測試 Jpa啟用審計功能實現自動注入添加依賴啟動類啟用審計功能實現AuditorAware接口實體類中使用審計注解 總結 自動注入創建人、創建時間、…

金融機構開源軟件風險管理體系建設

開源軟件為金融行業帶來了創新活力的同時&#xff0c;也引入了一系列獨特的風險。金融機構需要構建系統化的風險管理體系&#xff0c;以識別和應對開源軟件在全生命周期中的各種風險點。下面我們將解析開源軟件在金融場景下的主要風險類別&#xff0c;并探討如何建立健全的風險…

圖形渲染中的定點數和浮點數

三種API的NDC區別 NDC全稱&#xff0c;Normalized Device Coordinates Metal、Vulkan、OpenGL的區別如下&#xff1a; featureOpenGL NDCMetal NDCVulkan NDC坐標系右手左手右手z值范圍[-1,1][0,1][0,1]xy視口范圍[-1,1][-1,1][-1,1] GPU渲染的定點數和浮點數 定點數類型&a…

同花順客戶端公司財報抓取分析

目標客戶端下載地址:https://ft.51ifind.com/index.php?c=index&a=download PC版本 主要難點在登陸,獲取token中的 jgbsessid (每次重新登錄這個字段都會立即失效,且有效期應該是15天的) 抓取jgbsessid 主要通過安裝mitmproxy 使用 mitmdump + 下邊的腳本實現監聽接口…

QT工程建立

打開軟件新建一個工程 選擇chose 工程命名&#xff0c;選擇保存路徑&#xff0c;可以自己選擇&#xff0c;但是不要有中文路徑 默認的直接下一步 任意選一個下一步 點擊完成 之后是這個界面&#xff0c;點擊右下角的綠色三角形編譯一下 實驗內容 添加類 第一個是建立cpp和.h文件…

【NLP 53、投機采樣加速推理】

目錄 一、投機采樣 二、投機采樣改進&#xff1a;美杜莎模型 流程 改進 三、Deepseek的投機采樣 流程 Ⅰ、輸入文本預處理 Ⅱ、引導模型預測 Ⅲ、候選集篩選&#xff08;可選&#xff09; Ⅳ、主模型驗證 Ⅴ、生成輸出與循環 騙你的&#xff0c;其實我在意透了 —— 25.4.4 一、…

ffmpeg時間基與時間戳

時間基、時間戳 時間基&#xff1a;表示時間單位的分數&#xff0c;用來定義視頻或音頻流中時間的精度。其形式是一個分數&#xff0c;分子通常為 1&#xff0c;而分母則表示每秒的單位數。 時間戳&#xff1a;代表在時間軸里占了多少個格子&#xff0c;是特定的時間點。 時間…

激光加工中平面傾斜度的矯正

在激光加工中&#xff0c;加工平面的傾斜度矯正至關重要&#xff0c;直接影響加工精度和材料處理效果。以下是系統的矯正方法和步驟&#xff1a; 5. 驗證與迭代 二次測量&#xff1a;加工后重新檢測平面度&#xff0c;確認殘余誤差。 反饋優化&#xff1a;根據誤差分布修正補償…

算法刷題記錄——LeetCode篇(2.2) [第111~120題](持續更新)

更新時間&#xff1a;2025-04-04 算法題解目錄匯總&#xff1a;算法刷題記錄——題解目錄匯總技術博客總目錄&#xff1a;計算機技術系列博客——目錄頁 優先整理熱門100及面試150&#xff0c;不定期持續更新&#xff0c;歡迎關注&#xff01; 114. 二叉樹展開為鏈表 給你二…

C語言學習筆記-9

九、結構體 構造類型&#xff1a; 不是基本類型的數據結構也不是指針類型&#xff0c; 它是若干個相同或不同類型的數據構成的集合 結構體類型&#xff1a; 結構體是一種構造類型的數據結構&#xff0c;是一種或多種基本類型或構造類型的數據的集合。 1.結構體類型定義 定…

Test——BUG篇

目錄 一軟件測試的生命周期 二BUG 1概念 2描述Bug 3Bug級別 4Bug的生命周期 三與開發人員發生爭執怎么辦 ?編輯1先自省&#xff1a;是否Bug描述不清晰 2站在用戶角度考慮并拋出問題 3Bug定級有理有據 4不僅要提出問題&#xff0c;還要給出解決方案 5Bug評審 5.1…

【Block總結】HWAB,半小波注意力塊|即插即用

論文信息 標題: HALF WAVELET ATTENTION ON M-NET+ FOR LOW-LIGHT IMAGE ENHANCEMENT 地址: arXiv:2203.01296 日期: 2022年3月 創新點 改進的分層架構 M-Net+: 提出了一個專為低光圖像增強設計的改良分層模型 M-Net+。該架構旨在緩解采樣過程中的空間信息損失問題。通過采用…

Spring 中的事務

&#x1f9fe; 一、什么是事務&#xff1f; &#x1f9e0; 通俗理解&#xff1a; 事務 一組操作&#xff0c;要么全部成功&#xff0c;要么全部失敗&#xff0c;不能只做一半。 比如你轉賬&#xff1a; A 賬戶扣錢B 賬戶加錢 如果 A 扣了錢但 B 沒收到&#xff0c;那就出問…