uniapp -- 驗證碼倒計時按鈕組件

jia-countdown-verify 驗證碼倒計時按鈕組件

一個用于發送短信驗證碼的倒計時按鈕組件,支持自定義樣式、倒計時時間和文本內容。適用于各種需要驗證碼功能的表單場景。

代碼已經 發布到插件市場 可以自行下載 下載地址

特性

  • 支持自定義按鈕樣式(顏色、大小、圓角等)
  • 支持自定義倒計時時間
  • 支持自定義按鈕文本
  • 支持手動觸發和自動開始倒計時
  • 支持重置倒計時狀態
  • 提供多種事件回調(發送、倒計時變化、結束)
  • 支持傳遞參數到事件回調中

安裝方法

在 uni-app 插件市場中搜索 jia-countdown-verify 并導入到項目中。

基礎用法

<template><view><jia-countdown-verify ref="countdownBtn" @send="onSend" /></view>
</template><script>
export default {methods: {onSend() {// 發送驗證碼邏輯// 成功后調用組件的 success 方法開始倒計時this.$refs.countdownBtn.success();}}
}
</script>

高級用法

使用 successVal 和 resetVal 控制倒計時

<template><view><input type="text" v-model="phone" placeholder="請輸入手機號" /><jia-countdown-verify@send="sendCode":successVal="successCount":resetVal="resetCount"/></view>
</template><script>
export default {data() {return {phone: "",successCount: 0, // 成功計數器resetCount: 0, // 重置計數器};},methods: {sendCode() {// 驗證手機號if (!/^1\d{10}$/.test(this.phone)) {uni.showToast({title: "請輸入正確的手機號",icon: "none",});// 增加重置計數器觸發重置this.resetCount++;return;}// 模擬API請求setTimeout(() => {// 發送成功,增加成功計數器觸發倒計時this.successCount++;}, 1000);}}
}
</script>

API

Props

屬性名類型默認值說明
textString“發送驗證碼”按鈕默認文本
sendTextString“請稍候…”發送中的按鈕文本
countdownTextString“s后獲取”倒計時文本后綴
secondsNumber60倒計時秒數
widthString“182rpx”按鈕寬度
heightString“56rpx”按鈕高度
paddingString“0”按鈕內邊距
marginString“0”按鈕外邊距
radiusString“6rpx”按鈕圓角
sizeNumber24字體大小(rpx)
colorString“#5677fc”字體顏色
backgroundString“transparent”背景顏色
borderWidthString“1px”邊框寬度
borderColorString“#5677fc”邊框顏色
isOpacityBooleantrue倒計時狀態是否透明
hoverBooleantrue是否有點擊效果
successValNumber/String0觸發倒計時的值,值變化時開始倒計時
resetValNumber/String0重置倒計時的值,值變化時重置倒計時
startBooleanfalse是否自動開始倒計時
paramsNumber/String0傳遞給事件的參數
disabledColorString“”禁用狀態的背景顏色

Events

事件名說明回調參數
send點擊發送按鈕時觸發{ params: 傳入的params值 }
countdown倒計時變化時觸發{ seconds: 剩余秒數, params: 傳入的params值 }
end倒計時結束時觸發{ params: 傳入的params值 }

Methods

方法名說明參數
success開始倒計時-
reset重置倒計時狀態-

使用示例

默認使用

<jia-countdown-verify ref="sms1" @send="onSend" />

默認為倒計時狀態

<jia-countdown-verify :start="true" @send="onSend" />

設置圓角

<jia-countdown-verify :radius="'20rpx'" @send="onSend" />

設置顏色

<jia-countdown-verifycolor="#fff"background="#000"borderWidth="0"@send="onSend"
/>

設置大小

<jia-countdown-verify:width="'300rpx'":height="'60rpx'"@send="onSend"
/>

設置秒數

<jia-countdown-verify :seconds="120" @send="onSend" />

改變倒計時狀態下顏色

<jia-countdown-verifybackground="#02B653"borderWidth="0"color="#fff"@send="onSend"disabledColor="#999"
/>

設置文本

<jia-countdown-verifytext="發送驗證碼短信"countdownText="秒后可重發"@send="onSend"
/>

注意事項

  1. 當使用 ref 手動控制倒計時時,需要在發送驗證碼成功后調用 success() 方法開始倒計時
  2. 當使用 successValresetVal 控制倒計時時,只需改變這兩個值即可觸發相應操作
  3. 組件內部會在銷毀時自動清除定時器,無需手動處理
  4. 倒計時過程中按鈕會自動禁用,防止重復點擊

組件封裝中細節點總結

  • 微信小程序兼容:style=“[styleObj]” 需要 統一使用數組包裹樣式對象
  • 慎用 upx 單位:僅在維護老項目或已有組件庫時,才需繼續使用 upx;新開發應盡量避免使用 upx,并可逐步將 upx 單位改為 rpx,如果確實需要動態計算 upx 值,可調用 uni.upx2px()。
  • 在 Vue3 中為所有自定義事件聲明 emits,避免與原生事件沖突
  • 生命周期兼容處理 vue2 beforeDestroy vue3 unmounted 使用注釋做環境區分 // #ifdef VUE2, // #endif

完整代碼

建議通過插件市場下載小編持續維護

<template><!-- 驗證碼倒計時按鈕 --><buttonclass="sms-btn":disabled="isDisabled":hover-class="hover ? 'button-hover' : 'none'"@click="handleClick":style="[buttonStyle]">{{ buttonText }}</button>
</template><script>
/*** 驗證碼倒計時按鈕組件* @description 用于發送短信驗證碼的倒計時按鈕,支持自定義樣式和倒計時時間* @property {String} text - 按鈕默認文本* @property {String} sendText - 發送中的按鈕文本* @property {String} countdownText - 倒計時文本后綴* @property {Number} seconds - 倒計時秒數* @property {String} width - 按鈕寬度* @property {String} height - 按鈕高度* @property {String} padding - 按鈕內邊距* @property {String} margin - 按鈕外邊距* @property {String} radius - 按鈕圓角* @property {Number} size - 字體大小* @property {String} color - 字體顏色* @property {String} background - 背景顏色* @property {String} borderWidth - 邊框寬度* @property {String} borderColor - 邊框顏色* @property {Boolean} isOpacity - 倒計時狀態是否透明* @property {Boolean} hover - 是否有點擊效果* @property {Number/String} successVal - 觸發倒計時的值,值變化時開始倒計時* @property {Number/String} resetVal - 重置倒計時的值,值變化時重置倒計時* @property {Boolean} start - 是否自動開始倒計時* @property {Number/String} params - 傳遞給事件的參數* @event {Function} send - 點擊發送按鈕時觸發* @event {Function} countdown - 倒計時變化時觸發* @event {Function} end - 倒計時結束時觸發*/
export default {name: "SmsCountdownButton",/*** Vue3 現在提供了一個emits選項,類似于現有props選項。此選項可用于定義組件可以向其父對象發出的事件強烈建議使用emits記錄每個組件發出的所有事件。這一點特別重要,因為去除了.native修飾符。emits 現在在未使用聲明的事件的所有偵聽器都將包含在組件的中$attrs,默認情況下,該偵聽器將綁定到組件的根節點。*/emits: ["countdown", "send", "end"], // 顯式聲明自定義事件props: {text: { type: String, default: "發送驗證碼" }, // 按鈕默認文本sendText: { type: String, default: "請稍候..." }, // 發送中的按鈕文本countdownText: { type: String, default: "s后獲取" }, // 倒計時文本后綴seconds: { type: Number, default: 60 }, // 倒計時秒數width: { type: String, default: "182rpx" }, // 按鈕寬度height: { type: String, default: "56rpx" }, // 按鈕高度padding: { type: String, default: "0" }, // 按鈕內邊距margin: { type: String, default: "0" }, // 按鈕外邊距radius: { type: String, default: "6rpx" }, // 按鈕圓角size: { type: Number, default: 24 }, // 字體大小color: { type: String, default: "#5677fc" }, // 字體顏色background: { type: String, default: "transparent" }, // 背景顏色borderWidth: { type: String, default: "1px" }, // 邊框寬度borderColor: { type: String, default: "#5677fc" }, // 邊框顏色isOpacity: { type: Boolean, default: true }, // 倒計時狀態是否透明hover: { type: Boolean, default: true }, // 是否有點擊效果successVal: { type: [Number, String], default: 0 }, // 觸發倒計時的值resetVal: { type: [Number, String], default: 0 }, // 重置倒計時的值start: { type: Boolean, default: false }, // 是否自動開始倒計時params: { type: [Number, String], default: 0 }, // 傳遞給事件的參數disabledColor: { type: String, default: "" }, // 禁用狀態的字體顏色},data() {return {state: "idle", // 按鈕狀態:idle(空閑)、pending(發送中)、countdown(倒計時)remaining: this.seconds, // 剩余秒數timer: null, // 定時器};},computed: {/*** 按鈕是否禁用* @return {Boolean} 非空閑狀態時禁用按鈕*/isDisabled() {return this.state !== "idle";},/*** 按鈕文本* @return {String} 根據狀態返回不同的按鈕文本*/buttonText() {// 空閑狀態if (this.state === "idle") {return this.text;// 發送狀態} else if (this.state === "pending") {return this.sendText;// 倒計時狀態} else if (this.state === "countdown") {return `${this.remaining}${this.countdownText}`;}},/*** 按鈕樣式* @return {Object} 樣式對象*/buttonStyle() {const style = {width: this.width,height: this.height,padding: this.padding,margin: this.margin,color: this.color,background: this.background,borderWidth: this.borderWidth,borderColor: this.borderColor,borderRadius: this.radius,fontSize: this.size + "rpx",borderStyle: "solid",textAlign: "center",};// 倒計時狀態且需要透明時設置透明度if (this.state === "countdown" && this.isOpacity) {style.opacity = 0.5;}// 倒計時狀態且需要禁用時設置背景顏色if (this.disabledColor && this.state === "countdown") {style.background = this.disabledColor;}return style;},},watch: {/*** 監聽成功值變化,觸發倒計時*/successVal(newVal, oldVal) {if (newVal !== oldVal) {this.success();}},/*** 監聽重置值變化,重置倒計時*/resetVal(newVal, oldVal) {if (newVal !== oldVal) {this.reset();}},},mounted() {// 如果設置了自動開始,則立即開始倒計時if (this.start) {this.success();}},// 在 Vue3 中組件卸載的生命周期被重新命名  destroyed 修改為 unmounted// #ifdef VUE2beforeDestroy() {// 組件銷毀前清除定時器if (this.timer) {clearInterval(this.timer);this.timer = null;}},// #endif// #ifdef VUE3unmounted() {// 組件銷毀前清除定時器if (this.timer) {clearInterval(this.timer);this.timer = null;}},// #endifmethods: {/*** 開始倒計時*/startCountdown() {// 清除可能存在的定時器if (this.timer) {clearInterval(this.timer);}// 設置狀態為倒計時this.state = "countdown";this.remaining = this.seconds;// 觸發倒計時事件 {因為倒計時事件是每秒觸發一次,最開始要觸發一次}this.$emit("countdown", { seconds: this.remaining, params: this.params });// 設置定時器this.timer = setInterval(() => {// 倒計時this.remaining--;if (this.remaining > 0) {// 每秒觸發倒計時事件this.$emit("countdown", {seconds: this.remaining,params: this.params,});} else {// 倒計時結束,清除定時器clearInterval(this.timer);this.timer = null;// 設置狀態為空閑this.state = "idle";// 觸發結束事件this.$emit("end", { params: this.params });}}, 1000);},/*** 成功發送驗證碼,開始倒計時*/success() {// 如果按鈕狀態不為倒計時,則開始倒計時 [空閑狀態|發送中狀態都可以進入]// 自動開始時是空閑,手動點擊時是發送中if (this.state !== "countdown") {this.startCountdown();}},/*** 重置按鈕狀態*/reset() {// 清除定時器if (this.timer) {clearInterval(this.timer);this.timer = null;}// 重置狀態this.state = "idle";// 重置剩余秒數this.remaining = this.seconds;},/*** 按鈕點擊處理*/handleClick() {// 如果按鈕狀態為空閑,則設置狀態為發送中,并觸發發送事件if (this.state === "idle") {// 設置狀態為發送中this.state = "pending";// 觸發發送事件this.$emit("send", { params: this.params });}},},
};
</script><style scoped>
/* 按鈕基本樣式 */
.sms-btn {display: inline-block; /* 內聯塊級元素 */text-align: center; /* 文本居中 */cursor: pointer; /* 鼠標樣式 */
}
/* 禁用狀態樣式 */
.sms-btn:disabled {cursor: not-allowed; /* 禁用狀態的鼠標樣式 */
}
.button-hover {transform: scale(0.98); /* 按鈕懸停時的縮放 */box-shadow: 0 2px 5px rgba(0,0,0,0.2); /* 按鈕懸停時的陰影 */
}</style>

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

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

相關文章

知識圖譜重構電商搜索:下一代AI搜索引擎的底層邏輯

1. 搜索引擎的進化論 從雅虎目錄式搜索到Google的PageRank算法&#xff0c;搜索引擎經歷了三次技術躍遷。而AI搜索引擎正在掀起第四次革命&#xff1a;在電商場景中&#xff0c;傳統的「關鍵詞匹配」已無法滿足個性化購物需求&#xff0c;MOE搜索等新一代架構開始融合知識圖譜…

深度學習 自然語言處理(RNN) day_02

1. 感知機與神經網絡 1.1 感知機 生物神經元&#xff1a; 1.1.1 感知機的概念 感知機&#xff08;Perceptron&#xff09;&#xff0c;又稱神經元&#xff08;Neuron&#xff0c;對生物神經元進行了模仿&#xff09;是神 經網絡&#xff08;深度學習&#xff09;的起源算法&am…

PYTHON訓練營DAY25

BUG與報錯 一、try else try:# 可能會引發異常的代碼 except ExceptionType: # 最好指定具體的異常類型&#xff0c;例如 ZeroDivisionError, FileNotFoundError# 當 try 塊中發生 ExceptionType 類型的異常時執行的代碼 except: # 不推薦&#xff1a;捕獲所有類型的異常&…

LU分解求解線性方程組

L U LU LU分解 前言 L U LU LU分解 由以下定理得以保證&#xff1a; 設 A \boldsymbol{A} A為 n n n階方陣&#xff0c;若其各界階順序主子式都不為 0 0 0&#xff0c;那么它可以 被唯一的上下三角矩陣積分解。 步驟 確定各矩陣形式 A L U \mathbf{A}\mathbf{LU} ALU ( a 1…

Linux——數據庫備份與恢復

一&#xff0c;Mysql數據庫備份概述 1&#xff0c;數據庫備份的重要性 數據災難恢復&#xff1a;數據庫可能會因為各種原因出現故障&#xff0c;如硬件故障、軟件錯誤、誤操作、病毒攻擊、自然災害等。這些情況都可能導致數據丟失或損壞。如果有定期的備份&#xff0c;就可以…

SVM在醫療設備故障維修服務決策中的應用:策略、技術與實踐

SVM在醫療設備故障維修服務決策中的應用&#xff1a;策略、技術與實踐 醫療設備的高可靠性、安全性及嚴格合規性要求&#xff0c;使其故障維修決策具有顯著的特殊性。支持向量機&#xff08;SVM&#xff09;憑借小樣本學習、非線性建模及高精度分類能力&#xff0c;可有效解決…

WEB安全--Java安全--CC1利用鏈

一、梳理基本邏輯 WEB后端JVM通過readObject()的反序列化方式接收用戶輸入的數據 用戶編寫惡意代碼并將其序列化為原始數據流 WEB后端JVM接收到序列化后惡意的原始數據并進行反序列化 當調用&#xff1a; ObjectInputStream.readObject() JVM 內部邏輯&#xff1a; → 反…

FlashInfer - 介紹 LLM服務加速庫 地基的一塊石頭

FlashInfer - 介紹 LLM服務加速庫 地基的一塊石頭 flyfish 大型語言模型服務中的注意力機制 大型語言模型服務&#xff08;LLM Serving&#xff09;迅速成為重要的工作負載。Transformer中的算子效率——尤其是矩陣乘法&#xff08;GEMM&#xff09;、自注意力&#xff08;S…

反向操作:如何用AI檢測工具優化自己的論文“人味”?

大家好&#xff0c;這里是論文寫手的一線自救指南&#x1f624; 在AIGC橫行的今天&#xff0c;誰還沒偷偷用過AI寫幾段論文內容&#xff1f;但問題來了&#xff1a;學校越來越會“識AI”了&#xff01; 有的學校甚至不看重復率&#xff0c;只盯AIGC率報告&#xff0c;一句“AI…

關于單片機的基礎知識(一)

成長路上不孤單&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///計算機愛好者&#x1f60a;///持續分享所學&#x1f60a;///如有需要歡迎收藏轉發///&#x1f60a;】 今日分享關于單片機基礎知識的相關內容&#xf…

AWS技術助力企業滿足GDPR合規要求

GDPR(通用數據保護條例)作為歐盟嚴格的數據保護法規,給許多企業帶來了合規挑戰。本文將探討如何利用AWS(亞馬遜云服務)的相關技術來滿足GDPR的核心要求,幫助企業實現數據保護合規。 一、GDPR核心要求概覽 GDPR的主要目標是保護歐盟公民的個人數據和隱私權。其核心要求包括: 數…

FFplay 音視頻同步機制解析:以音頻為基準的時間校準與動態幀調整策略

1.?視頻同步基礎 1.2 簡介 看視頻時&#xff0c;要是聲音和畫面不同步&#xff0c;體驗會大打折扣。之所以會出現這種情況&#xff0c;和音視頻數據的處理過程密切相關。音頻和視頻的輸出不在同一個線程&#xff0c;就像兩個工人在不同車間工作&#xff0c;而且不一定會同時…

車載網關--- 職責邊界劃分與功能解耦設計

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

最優化方法Python計算:有約束優化應用——近似線性可分問題支持向量機

二分問題的數據集 { ( x i , y i ) } \{(\boldsymbol{x}_i,y_i)\} {(xi?,yi?)}&#xff0c; i 1 , 2 , ? , m i1,2,\cdots,m i1,2,?,m中&#xff0c;特征數據 { x i } \{\boldsymbol{x}_i\} {xi?}未必能被一塊超平面按其標簽值 y i ∈ { ? 1 , 1 } y_i\in\{-1,1\} yi?∈…

aardio - 將文本生成CSS格式顯示

import win.ui; /*DSG{{*/ var winform win.form(text"aardio form";right759;bottom469) winform.add( button{cls"button";text"Button";left340;top130;right430;bottom180;z3}; edit{cls"edit";text"我是一串文本";lef…

數字IC后端設計實現 | 如何自動刪除Innovus 中冗余的hold buffer?

我們都知道在postCTS階段做optDesign時序優化時需要進行hold violation的fixing。所以這個過程勢必要通過插hold buffer來解決hold violation。這類hold buffer的名字帶有"PHC"的關鍵詞。 select_obj [dbGet top.insts.name PHC] llength [dbGet top.insts.name PH…

c# 倒序方法

在C#中&#xff0c;有幾種方法可以對List進行倒序排列&#xff1a; 1. 使用List的Reverse()方法&#xff08;原地反轉&#xff09; List<int> numbers new List<int> { 1, 2, 3, 4, 5 };numbers.Reverse(); // 直接修改原列表// 結果&#xff1a;5, 4, 3, 2, 1 …

【內網滲透】——S4u2擴展協議提權以及KDC欺騙提權

【內網滲透】——S4u2擴展協議提權以及KDC欺騙提權 文章目錄 【內網滲透】——S4u2擴展協議提權以及KDC欺騙提權[toc]一&#xff1a;Kerberos 委派攻擊原理之 S4U2利用1.1原理1.2兩種擴展協議**S4U2Self (Service for User to Self)****S4U2Proxy (Service for User to Proxy)*…

AD 間距規則與布線規則

1. 打開在線規則檢查 2. 間距規則 一般來說最小間距設為6mil 注意&#xff1a; AD22 也提供類似低版本那樣的、多個間距規則疊加的方法&#xff0c;通過選擇第一個適配對象和第二個適配對象來篩選對象和范圍。 ① Where The First Object Matches &#xff1a;選擇規則第一個…

Android Studio 安裝與配置完全指南

文章目錄 第一部分&#xff1a;Android Studio 簡介與安裝準備1.1 Android Studio 概述1.2 系統要求Windows 系統&#xff1a;macOS 系統&#xff1a;Linux 系統&#xff1a; 1.3 下載 Android Studio 第二部分&#xff1a;安裝 Android Studio2.1 Windows 系統安裝步驟2.2 mac…