123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- <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>
|