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

239 lines
5.1 KiB

<template>
<view class="input-com">
<view :class="'input-wrapper'+(errormsg?' error':'')">
<view class="top-wrapper flex">
<view class="left PfScMedium">
<view>{{label}}</view>
<image v-if="required" class="required" :src="cssUrl + 'required.svg'" />
</view>
<view class="right">
<textarea class="textarea" v-if="autoHeight" :auto-height="true" :value="value" :placeholder="holder" @blur="handleBlur" @input="handleInput"></textarea>
<input class="input" v-else :value="value" :placeholder="holder" @blur="handleBlur" @input="handleInput"></input>
</view>
</view>
<view class="bottom-wrapper" v-if="errormsg">
<view class="errmsg" >*{{errormsg}}</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: "inputBox",
props: {
value: {
type: String,
default: ""
},
autoHeight: {
type: Boolean,
default: false
},
label: {
type: String,
default: ""
},
holder: {
type: String,
default: ''
},
rule: {
type: String,
default: ''
},
required: {
type: Boolean,
default: true
}
},
data() {
return {
errormsg:'',
cssUrl:this.cssUrl
}
},
methods: {
handleBlur(e) {
var value = e.detail.value
var res = this.check(value);
if(!res){
this.$emit('blurEvent', value, false)
return
}
this.$emit('blurEvent', value, true)
},
handleInput(e){
if(!this.errormsg) return;
var value = e.detail.value
var res = this.check(value);
if(!res){
this.$emit('blurEvent', value, false)
return
}
this.$emit('blurEvent', value, true)
},
check(value){
var noEmptyVal = this.$trim.trim(value)
if(this.required && noEmptyVal.length<=0){
this.errormsg = this.label+'不能为空'
return false
}
if(this.rule == 'phone' && !/^1[3-9]\d{9}$/.test(noEmptyVal)){
this.errormsg = '手机号格式不正确'
return false
}
if(this.rule == 'idcardext' && (!/[a-z0-9A-Z]{4}/.test(noEmptyVal) || noEmptyVal.length!=4)){
this.errormsg = this.label+'格式不正确'
return false
}
if(this.rule == 'idcard' && !this.validateChineseIDCard(noEmptyVal)){
this.errormsg = this.label+'格式不正确'
return false
}
this.errormsg = ''
return true
},
validateChineseIDCard(idCard) {
const pattern = /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/;
if (!pattern.test(idCard)) {
return false;
}
const modWeight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const modCheckDigit = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
const idArray = idCard.split('');
let sum = 0;
for (let i = 0; i < 17; i++) {
sum += parseInt(idArray[i]) * modWeight[i];
}
const mod = sum % 11;
const checkDigit = modCheckDigit[mod];
return idArray[17] === checkDigit.toString();
}
}
};
</script>
<style lang="scss" scoped>
.input-com{
.input-wrapper{
min-height: 100rpx;
background: #FFFFFF;
border-radius: 12rpx;
margin: 0 auto;
width: calc(100% - 48rpx);
border-bottom: 2rpx solid rgba(151, 151, 151, 0.1457);
box-sizing: border-box;
margin: 0 auto;
font-size: 32rpx;
line-height: 32rpx;
letter-spacing: 1rpx;
padding: 36rpx 0;
.top-wrapper{
display: flex;
background: #FFFFFF;
box-sizing: border-box;
width:100%;
margin: 0 auto;
font-size: 32rpx;
line-height: 32rpx;
letter-spacing: 1rpx;
align-items: center;
margin: 0;
}
&.error{
padding-bottom: 16rpx !important;
}
.left{
display: flex;
align-items: center;
min-width: 158rpx;
max-width: 238rpx;
text{
color: #F55555;
margin-right: 16rpx;
}
view{
color: #000000;
letter-spacing: 2rpx;
font-family: PingFang SC;
font-size: 32rpx;
font-weight: 500;
line-height: 44rpx;
color: #000000;
}
.hide-start{
opacity: 0;
}
}
.right{
flex-grow: 1;
color: #242833;
text-align: right;
padding-left: 10rpx;
box-sizing: border-box;
position: relative;
.input{
color: #222222;
&::placeholder{
font-size: 32rpx;
font-weight: normal;
line-height: 44rpx;
text-align: right;
letter-spacing: 0.24rpx;
color: #999999;
}
}
.textarea{
width: 100%;
height: 45rpx;
color: #222222;
&::placeholder{
font-size: 32rpx;
font-weight: normal;
line-height: 44rpx;
text-align: right;
letter-spacing: 0.24rpx;
color: #999999;
}
}
}
}
.required {
margin-left: 8rpx;
color: #f56c6c;
font-size: 12px;
width: 16rpx;
height: 16rpx;
}
.errmsg{
margin: 0 auto;
width: 100%;
display: flex;
justify-content: flex-end;
flex-wrap: wrap;
font-size: 24rpx;
font-weight: normal;
line-height: 44rpx;
letter-spacing: 0.24rpx;
color: #FF0000;
}
.hua{
width: 20rpx;
height: 20rpx;
}
}
</style>