You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

241 lines
6.2 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="tm-password ">
<view @click="show=!show" class="flex-center flex-between">
<view class="tm-password-item flex-center "
:class="[
width>0?'':'mx-12',
`round-${round}`,
`shadow-${color_tmeme}-${shadow}`,
model==='line'?black_tmeme?(strVal.length==index?' grey-darken-3 ':'border-grey-a-1 grey-darken-3 '):`border-${color_tmeme}-b-3`:'',
model==='box'?(black_tmeme?(strVal.length==index?'grey-darken-3 ':'border-grey-a-1 grey-darken-3 '):(strVal.length==index?'':`border-${color_tmeme}-a-1 `)):'',
model==='fill'?black_tmeme?'grey-darken-3 ':bgColor:'',
]"
v-for="(item,index) in strLength"
:key="index"
:style="{
width:width>0?'auto':(100/strLength)+'%',
height:height+'rpx'
}"
>
<view
:style="{width:width>0?width+'rpx':'atuo'}"
:class="[
`round-${round}`,
strVal.length==index?'aniOn '+(model!=='line'&&model!=='box'?`border-${color_tmeme}-a-2 shadow-${color_tmeme}-6`:''):'',
strVal.length==index?(model=='box'?`border-${color_tmeme}-a-2 shadow-${color_tmeme}-6`:''):'',
strVal.length==index?(model=='line'&&black_tmeme?`border-${color_tmeme}-a-2 shadow-${color_tmeme}-6`:''):'',
]" class=" fulled fulled-height flex-center">
<text v-if="strVal[index]&&showVal"
class="text-weight-b text-size-lg"
:class="[
black_tmeme?'text-white':`text-${textColor_tmeme}`
]"
>
{{strVal[index]?strVal[index]:""}}
</text>
<view
v-if="(strVal[index]&&!showVal)||(!strVal[index]&&showVal)"
class="tm-password-item-middle "
:class="[
noval==='mline'?'mline round-5 ':'',
noval==='round'?'mround rounded':'',
'tm-password-item-middle-w',
textColor_tmeme
]"
></view>
</view>
</view>
</view>
<tm-keyborad @confirm="$emit('confirm',strVal)" :ok-color="color_tmeme" :model="keyboradModel" :black="black_tmeme" v-model="strVal" :decimal="false" :show.sync="show"></tm-keyborad>
</view>
</template>
<script>
/**
* 密码、验证码输入框
* @property {String|Number} value = [] 默认:'',待输入内容推荐使用v-model,或者value.sync
* @property {String|Number} round = [] 默认4,圆角
* @property {String|Number} width = [] 默认0,项目的宽,默认使用百分比的宽度。
* @property {String|Number} height = [] 默认100,项目的宽
* @property {String|Number} shadow = [] 默认0,投影
* @property {Number} code-length = [] 默认4,输入框数
* @property {String} model = [line|box|fill] 默认fill,外框的样式。line|box|fill
* @property {String} noval = [mline|round] 默认round,中间未填充数据的样式。。mline|round
* @property {Boolean} show-val = [] 默认false,是否展现/隐藏输入内容
* @property {Boolean} black = [] 默认false,暗黑模式
* @property {String} color = [] 默认primary,主题色
* @property {String} bg-color = [] 默认grey-lighten-4,输入背景主题色
* @property {String} text-color = [] 默认primary,文字颜色。
* @property {String} keyborad-model = [number|password] 默认number,键盘类型:number|password
* @property {Function} input 输入内容时触发。
* @property {Function} confirm 输入完内容,点击确认时触发
* @example <tm-password v-model="num"></tm-password>
*/
import tmKeyborad from "@/tm-vuetify/components/tm-keyborad/tm-keyborad.vue"
export default {
components:{tmKeyborad},
name:"tm-password",
model:{
prop:'value',
event:'input'
},
props:{
value:{
type:String|Number,
default:''
},
codeLength:{
type:Number,
default:4
},
round:{
type:Number,
default:4
},
shadow:{
type:Number,
default:0
},
bgColor:{
type:String,
default:'grey-lighten-4'
},
height:{
type:Number,
default:100
},
width:{
type:Number,
default:0
},
// 外框的样式。
model:{
type:String,
default:'fill' //外形形状 line|box|fill
},
// 中间未填充数据的样式。
noval:{
type:String,
default:'round' //mline|round
},
// 是否展现内容
showVal:{
type:Boolean,
default:false
},
black:{
type:Boolean|String,
default:null
},
color:{
type:String,
default:'primary'
},
textColor:{
type:String,
default:'grey-darken-3'
},
keyboradModel:{
type:String,
default:'number' //number|password
},
// 跟随主题色的改变而改变。
fllowTheme:{
type:Boolean|String,
default:false
}
},
computed:{
black_tmeme: function() {
if (this.black !== null) return this.black;
return this.$tm.vx.state().tmVuetify.black;
},
color_tmeme:function(){
if(this.$tm.vx.state().tmVuetify.color!==null&&this.$tm.vx.state().tmVuetify.color && this.fllowTheme){
return this.$tm.vx.state().tmVuetify.color;
}
return this.color;
},
textColor_tmeme:function(){
if(this.$tm.vx.state().tmVuetify.color!==null&&this.$tm.vx.state().tmVuetify.color && this.fllowTheme){
return this.$tm.vx.state().tmVuetify.color;
}
return this.textColor;
},
strLength:function(){
if(this.codeLength==0||!this.codeLength) return 1;
return this.codeLength;
},
strVal:{
get:function(){
return this.value;
},
set:function(val){
let p = val;
if(val.length > this.strLength){
p = val.substr(0,this.strLength);;
}
this.$emit("input",p )
this.$emit("update:value",p )
}
},
// strCode:function(){
// let val = this.strVal;
// let strlen = this.strLength - this.strVal.length;
// for(let i=0;i<strlen;i++){
// }
// }
},
data() {
return {
show:false
};
}
}
</script>
<style lang="scss">
.tm-password{
.tm-password-item{
height: 100rpx;
.aniOn{
animation: easinOut 1.5s infinite linear;
}
.tm-password-item-middle{
&.mline{
width: 100%;
height: 10upx;
}
&.mround{
width: 20upx;
height: 20upx;
}
&.tm-password-item-middle-w{
width: 20upx;
}
}
}
}
@keyframes easinOut {
0% {
opacity: 1;
}
50% {
opacity: 0.4;
}
100% {
opacity: 1;
}
}
</style>