微信小程序:自定义验证码或者密码输入框组件

## 前言

微信小程序中,需要为用户输入提供安全密码,用于后续的操作。例如支付密码的初始设置、修改、手机号的更换、支付金额等操作。绝大部分的设计都会如图所示:

密码输入框

这里我就来简单的说说如何实现这个《微信小程序:自定义验证码或者密码输入框组件》。

由于一个项目中会多次使用,所以这里决定把它做成一个组件的形式。

## code(****代码****)

wxml:(代码中注释的部分是另一种写法,如果开启,请把 input 模式注释掉,样式什么的无需修改)


<view class="indep-password-box">

 <view class="indep-password-box__wrapper">

 <block wx:for="{{inputLength}}" wx:key="*this">

  <!-- input模式 -->

 <input class="indep-password-box__item"

 type="number"

 catchtap="_focusInput"

 password="{{!showValue}}"

 disabled

 value="{{currentValue.length >= index + 1 ? currentValue[index] : ''}}"

 style="width: {{inputWidth}}; height: {{inputHeight}};"

 ></input>

  <!-- 自定义模式:隐藏密码时,小圆点(自定义)\显示密码时,显示对应的值 -->

  <!-- <view class="indep-password-box__item"

 catchtap="_focusInput"

 style="width: {{inputWidth}}; height: {{inputHeight}}"

 >

 <view wx:if="{{!showValue && currentValue.length >= index + 1}}" class="indep-password-box__item-hidden"></view>

 <view wx:if="{{showValue}}"

 class="indep-password-box__item-show"

 >{{currentValue.length >= index + 1 ? currentValue[index] : ''}}</view>

 </view> -->

 </block>

 <input class="indep-password-box__input-hidden"

 type="number"

 password="{{true}}"

 value="{{currentValue}}"

 maxlength="{{inputLength}}"

 focus="{{inputFocus}}"

 bindinput="_setCurrentValue"

 bindblur="_onInputFocus"

 ></input>

 </view>

</view>

json:


{

  "component": true,

  "usingComponents": {}

}

js:


Component({

 properties: {

 // 输入框的数量

 inputLength: {

 type: Number,

 value: 6

 },

 // 单个输入框的宽度

 inputWidth: {

 type: String,

 value: '100rpx'

 },

 inputHeight: {

 type: String,

 value: '100rpx'

 },

 // 是否显示输入的值,默认隐藏

 showValue: {

 type: Boolean,

 value: false

 }

 },

 data: {

 // input是否获取焦点

 inputFocus: false,

 // 初始input值为空

 currentValue: ''

 },

 methods: {

 // 设置当前的值

 _setCurrentValue (e) {

 // 在此处判断满6(inputLength)位,把值返回给上级父组件或页面

 let currentValue = e.detail.value

 // 改变时,派发一个事件,如果父组件或页面中需要实时获取改变后的值,可以监听这个事件。

 this.triggerEvent('change', e.detail.value)

 this.setData({ currentValue })

 if (currentValue.length >= this.data.inputLength) {

 this._complete(e.detail.value)

 return

 }

 },

 // 点击伪装的input时,让隐藏的input获得焦点

 _focusInput (event) {

 console.log('点击伪装的input时,让隐藏的input获得焦点', event)

 this.setData({ inputFocus: true })

 },

 // 派发完成事件

 _complete (value) {

 console.log('派发完成事件', value)

 this.triggerEvent('complete', value)

 this.setData({ inputFocus: false })

 },

 // 处理文本框失焦

 _onInputFocus (event) {

 console.log('处理文本框失焦', event)

 this.setData({ inputFocus: false })

 },

 // 提供给外部调用的方法,显示/隐藏密码。接收一个参数,可以显性修改展示的状态。

 toggleValue (state) {

 this.setData({ showValue: state != undefined ? state : !this.data.showValue })

 },

 // 清除input当前的值

 clearCurrentValue () {

 this.setData({ currentValue: '' })

 }

 }

})

wxss:


.indep-password-box {

 display: flex;

 justify-content: center;

 align-items: center;

}

.indep-password-box__wrapper {

 display: flex;

 flex-direction: row;

}

/* 子项 */

.indep-password-box__wrapper .indep-password-box__item {

  /* 自定义模式 */

 position: relative;

 display: flex;

 justify-content: center;

 align-items: center;

  /* input模式 */

 border: 1px solid #999;

 box-sizing: border-box;

 font-size: 12px;

 text-align: center;

}

/* 边框重叠 */

.indep-password-box__wrapper .indep-password-box__item + .indep-password-box__item {

 margin-left: -1rpx;

}

/* 小圆点 */

.indep-password-box .indep-password-box__wrapper .indep-password-box__item-hidden {

 width: 14rpx;

 height: 14rpx;

 border-radius: 50%;

 background: #999;

}

/* 对应值 */

.indep-password-box .indep-password-box__wrapper .indep-password-box__item-show {

 color: #087b46;

}

/* 隐藏的输入框 */

.indep-password-box__wrapper .indep-password-box__input-hidden {

 width: 0;

 height: 0;

}

app.json:不要忘记在app.json中注册组件,(本人是在根目录下创建的/components/目录)


// ...

"usingComponents": {

// ...

"indep-password-box": "/components/password-box/password-box",

// ...

}

## used(****使用****)

上面是组件的定义,接下来看看如何在页面中使用它。


<indep-password-box id="passwordBox"

 inputLength="{{6}}"

 inputWidth="100rpx"

 inputHeight="100rpx"

 showValue="{{false}}"

 bind:complete="setupPasswordComplete"

 ></indep-password-box>


onShow: function () {

this.passwordBox = this.selectComponent('#passwordBox') // 获取密码框组件,用来操作组件内部的方法

},

methods: {

// 设置密码

setupPasswordComplete (event) {

// console.log('setupPasswordComplete', event.detail)

this.setData({ 'password': event.detail })

},

// 清除密码

clearPassword() {

this.passwordBox.clearCurrentValue() // 调用组件内部的清除方法,清空输入的值

},

}

## 设计思路

设置宽高为0的方式隐藏文本框,并把隐藏的文本框作为输入的来源,通过选中单个框的点击事件,为隐藏的文本框获得焦点,再以此文本框的输入值,作为循环进行展示。

提示:后面还有精彩敬请期待,请大家关注我的专题:web前端。如有意见可以进行评论,每一条评论我都会认真对待。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • create by jsliang on 2018-9-17 17:58:56 Recently revised...
    梁_飘阅读 1,573评论 0 6
  • 来南京几个月还没有休息时间去休闲看看,最近工作结束了,今天有时间去玄武湖坐一下,让内心深处静一下……
    青春羊入虎口阅读 228评论 0 1
  • 字里行间流出她对谣言的无奈。但这简短有力的回复,可谓让谣言不攻自破。 评论更是倒向赵丽颖这边。
    恒约阅读 254评论 0 0
  • 豆瓣高分电影的诱惑,让我尽管推迟几天,依然要去一探究竟。我在看之前心中一直有疑问‘什么是无双?无双的什么?是人还是...
    常能珲阅读 463评论 2 1
  • 墨语添香阅读 772评论 6 13