mirror of
https://github.com/ialley-workshop-open/uni-halo.git
synced 2026-06-11 12:49:30 +08:00
v1.0.0-beta 源码正式开源
This commit is contained in:
@@ -0,0 +1,533 @@
|
||||
<template>
|
||||
<view class="d-block tm-input overflow"
|
||||
:class="[
|
||||
|
||||
black_tmeme?(bgTheme?'grey-darken-5':''):bgTheme,
|
||||
flat?'':`px-${padding[0]}`,
|
||||
'round-'+ bgRound,
|
||||
`shadow-${color}-${bgShadow}`
|
||||
]"
|
||||
>
|
||||
<view
|
||||
:class="(flat?'':` py-${padding[1]} `)+` ${borderBottom?black_tmeme?'border-grey-darken-4-b-1 ':'border-grey-lighten-4-b-1':''}`"
|
||||
>
|
||||
<view @click="onclickInput" :class="[vertical?'tm-input-col':'flex-between ']" :style="{
|
||||
width: '100%',height: 'auto',
|
||||
alignItems:inputType=='textarea'?'flex-start':'center'
|
||||
}">
|
||||
<!-- 左边内容。 -->
|
||||
<view v-if="leftIcon||title" class="tm-input-left flex-start flex-shrink" :class="[vertical?'pb-24':'']">
|
||||
<!-- icon -->
|
||||
<view v-if="leftIcon" class="pr-16 vertical-align-middle flex-center">
|
||||
<tm-icons dense :name="leftIcon" :color="color_tmeme"></tm-icons>
|
||||
</view>
|
||||
<!-- 标题 -->
|
||||
<view v-if="title" class="d-inline-block "
|
||||
:style="{fontSize:title_size}"
|
||||
:class="[titleClass,black_tmeme?'bk text-grey-lighten-3':'']">
|
||||
<text v-if="required" class="text-red">*</text>
|
||||
<slot name="default" :title="title">
|
||||
{{title}}
|
||||
</slot>
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex-between " :class="[disabled?'opacity-6':'',]" style="width: 100%;">
|
||||
|
||||
<!-- input主体 -->
|
||||
<view class="tm-input-center relative fulled" >
|
||||
<view class="flex-start tm-input-center-wk"
|
||||
:class="['round-'+round,showIndent?'px-16':'',
|
||||
black_tmeme?(bgColor?'grey-darken-4 text-grey-lighten-3':'text-grey-lighten-3'):bgColor,
|
||||
`text-${textColor}`,isFocus&&focusShow?(black_tmeme?`border-${color_tmeme}-a-1`:`${color_tmeme} outlined `):``,
|
||||
`border-${black_tmeme?(borderColor?'grey-darken-4':''):borderColor}-a-1`,
|
||||
|
||||
]">
|
||||
<view class="flex-shrink px-16 flex-center" v-if="prefixpIcon" style="line-height: 0;">
|
||||
<tm-icons dense :name="prefixpIcon" :size="28" :color="(prefixpIconColor||color_tmeme)" ></tm-icons>
|
||||
</view>
|
||||
<view :style="{fontSize:font_size}" class="flex-shrink pr-24" :class="[titleClass,black_tmeme?'bk text-grey-lighten-3':'']" v-if="prefixpText">
|
||||
{{prefixpText}}
|
||||
</view>
|
||||
|
||||
|
||||
<input always-embed v-if="inputType!='textarea'" @confirm="$emit('confirm',$event)" @input="input"
|
||||
@keyboardheightchange="$emit('keyboardheightchange',$event)" @blur="blur"
|
||||
@focus="focusFun" :focus="focus_fs" :maxlength="maxlength" :adjust-position="adjustPosition"
|
||||
:auto-focus="autoFocus" :confirm-type="confirmType" :disabled="disabled"
|
||||
:password="password" :type="inputType" :value="value" class="tm-input-center-input "
|
||||
:class="['text-align-'+align,showError?'text-red':'',' py-5 ']" :placeholder="placeholder"
|
||||
:placeholder-class="black_tmeme? 'text-grey-darken-1 ':' ' +` text-size-n ` + placeholderClass"
|
||||
:style="{
|
||||
fontSize:font_size,
|
||||
height:height_rpx+'rpx'
|
||||
}"
|
||||
/>
|
||||
<!-- uniapp的bug,当输入框禁用时,点击此处来获取新的焦点,以让键盘收起。 -->
|
||||
<view v-if="disabled" class="absolute fulled t-0 r-0" :style="{
|
||||
height:height_rpx+'rpx'
|
||||
}"></view>
|
||||
|
||||
<textarea always-embed v-if="inputType=='textarea'" @confirm="$emit('confirm',$event)" @input="input"
|
||||
@keyboardheightchange="$emit('keyboardheightchange',$event)" @blur="blur"
|
||||
@focus="focusFun" :focus="focus_fs" :maxlength="maxlength" :adjust-position="adjustPosition"
|
||||
:auto-focus="autoFocus" :confirm-type="confirmType" :disabled="disabled"
|
||||
:value="value" class="tm-input-center-input " :style="{
|
||||
height:height_rpx+'rpx',
|
||||
fontSize:font_size,
|
||||
}"
|
||||
:class="[maxlength>0?'pb-46':'','text-align-'+align,showError?'text-red':'','pt-16 fulled']" :placeholder="placeholder"
|
||||
:placeholder-class="black_tmeme? 'text-grey-darken-1 ':' text-grey-lighten-1 ' +` text-size-n `+ placeholderClass" >
|
||||
</textarea>
|
||||
<!-- 清除图标 -->
|
||||
<view v-if="clear&&valdata.length!=''" class="flex-center pl-16">
|
||||
<tm-icons @click.stop="clearVal" name="icon-times-circle-fill" :color="color_tmeme"></tm-icons>
|
||||
</view>
|
||||
|
||||
<view v-if="suffixIcon" class="flex-center">
|
||||
<tm-icons :size="26" :name="suffixIcon" :color="(suffixIconColor||color_tmeme)"></tm-icons>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="maxlength>0&&inputType=='textarea'"
|
||||
:style="{bottom:'16rpx',right:'16rpx'}"
|
||||
class="tm-input-center-numXz text-align-right text-size-xxs pt-12 text-grey absolute fulled">{{valueLen}}/{{maxlength}}</view>
|
||||
|
||||
</view>
|
||||
<!-- 右边。 -->
|
||||
<view class="tm-input-right flex-end flex-shrink">
|
||||
<!-- 后缀文字,比如单位,等 -->
|
||||
<text v-if="suffix" class=" text-grey-darken-4 pl-10" :style="{fontSize:font_size}">{{suffix}}</text>
|
||||
<!-- 后台图标。 -->
|
||||
<view v-if="rightIcon" class="pl-10" style="line-height: 0;">
|
||||
<tm-icons dense :name="rightIcon" color="grey-lighten-1"></tm-icons>
|
||||
</view>
|
||||
<!-- 插入的按钮等内容。 -->
|
||||
<slot name="rightBtn"></slot>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
<!-- detail出错成功等信息。 -->
|
||||
<view v-if="showError" class="text-size-xs text-red pt-12">{{errorText}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
/**
|
||||
* 输入框
|
||||
* @property {Number} maxlength = [-1] 默认:-1,最大输入字符数。
|
||||
* @property {Boolean} black = [] 默认:false,暗黑模式。
|
||||
* @property {Function} verify = [] 默认: (val) => {check: val.length <= 0 ? false : true,text: "必填项不能为空。"},校验规则函数。
|
||||
* @property {String} title-class = [] 默认: text-grey-darken-4,自定左边标题或者上标题的类。
|
||||
* @property {Boolean} required = [] 默认: false, 是否是必填。如果必填写将会触发基础的校验,不能为空。
|
||||
* @property {Boolean} adjust-position = [] 默认: false, 是否上推键盘。
|
||||
* @property {Boolean} auto-focus = [] 默认: false, 自动获得焦点。
|
||||
* @property {String} confirm-type = [done|go|next|send|search] 默认: done, 键盘右下角确认按钮文字。
|
||||
* @property {Boolean} disabled = [] 默认: false, 禁用。
|
||||
* @property {Boolean} focus-show = [] 默认: false, 是否显示聚焦状态。
|
||||
* @property {Boolean} show-indent = [] 默认: false, 是滞使输入框内容两边缩进。默认是。
|
||||
* @property {Boolean} password = [] 默认: false, 密码模式
|
||||
* @property {String} input-type = [digit|text|number|password|idcard|textarea] 默认: text, 输入模式
|
||||
* @property {String} value = [] 默认: "", 输入内容,同v-model
|
||||
* @property {String} right-icon = [] 默认: "", 后缀图标
|
||||
* @property {String} left-icon = [] 默认: "", 外层前缀图标
|
||||
* @property {String} prefixp-icon = [] 默认: "", 输入框内部前缀图标
|
||||
* @property {String} prefixp-icon-color = [] 默认: "", 默认空,使用主题color颜色
|
||||
* @property {String} suffix = [] 默认: "", 后缀文字
|
||||
* @property {String} suffix-icon = [] 默认: "", 输入框内后缀图标
|
||||
* @property {String} suffix-icon-color = [] 默认: "", 默认使用主题图标
|
||||
* @property {String} title = [] 默认: "", 左边标题。
|
||||
* @property {String} title-font-size = [xxs/xs/s/n/g/lg/xl] 默认: "n",同类的字号,xxs,xs,s,n,g,lg,xl
|
||||
* @property {Number|String} font-size = [xxs/xs/s/n/g/lg/xl/任意数字] 默认: "n",同类的字号,xxs,xs,s,n,g,lg,xl,也可以是数字单位rpx
|
||||
* @property {String} align = [left|center|right] 默认: "", 输入框文字对齐方式。left,center,right
|
||||
* @property {Boolean} clear = [false|true] 默认: false, 显示清除图标。
|
||||
* @property {String} color = [] 默认: primary, 主题色名称
|
||||
* @property {String} bg-color = [grey-lighten-5|white] 默认: grey-lighten-5, 输入框背景色。
|
||||
* @property {String} border-color = [] 默认: "", 输入框边框类型主题颜色名称。
|
||||
* @property {Boolean} border-bottom = [false|true] 默认: true, 是否显示下划线
|
||||
* @property {String} text-color = [black|primary] 默认: black, 输入框文字颜色。
|
||||
* @property {String} placeholder = [] 默认: 请输入, 占位文字
|
||||
* @property {Boolean} vertical = [false|true] 默认: false, 是否上下排列
|
||||
* @property {Number} round = [] 默认: 2, 输入框圆角。
|
||||
* @property {Boolean} showIndent = [] 默认: true, 是否输入框内部两边缩进
|
||||
* @property {Number} bg-round = [] 默认: 0, 整体框圆角。
|
||||
* @property {Number} bg-shadow = [] 默认: 0, 整体框投影。
|
||||
* @property {String} bg-theme = [] 默认:white, 整体框背景
|
||||
* @property {Boolean} flat = [] 默认: false, 是否去除所有边框
|
||||
* @property {Number|String} height = [] 默认: 68,
|
||||
* @property {String} name = [] 默认:'',提交表单时的的字段名称标识
|
||||
* @property {String} prefixp-text = [] 默认:'',输入框内前缀文字
|
||||
* @property {String} placeholder-class = [] 默认:'',点位符的自定义类。
|
||||
* @property {Array} padding = [] 默认:[32,12],左右,上下内间距。
|
||||
* @property {Function} click 点击输入框时触发发的函数。
|
||||
* @property {Function} clear 清空时触发携带相关数据
|
||||
* @property {Function} input 输入时触发携带相关数据
|
||||
* @example <tm-input ></tm-input>
|
||||
*
|
||||
*/
|
||||
import tmSheet from "@/tm-vuetify/components/tm-sheet/tm-sheet.vue"
|
||||
import tmIcons from "@/tm-vuetify/components/tm-icons/tm-icons.vue"
|
||||
export default {
|
||||
components:{tmSheet,tmIcons},
|
||||
name:"tm-input",
|
||||
props: {
|
||||
//提交表单时的的字段名称
|
||||
name:{
|
||||
type:String,
|
||||
default:''
|
||||
},
|
||||
prefixpText:{
|
||||
type:String,
|
||||
default:''
|
||||
},
|
||||
flat: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//是否输入框内部两边缩进。默认是
|
||||
showIndent:{
|
||||
type:Boolean,
|
||||
default:true
|
||||
},
|
||||
maxlength: {
|
||||
type: Number,
|
||||
default: -1
|
||||
},
|
||||
black: {
|
||||
type:Boolean|String,
|
||||
default:null
|
||||
},
|
||||
//是否显示聚焦状态
|
||||
focusShow: {
|
||||
type:Boolean|String,
|
||||
default:false
|
||||
},
|
||||
titleFontSize:{
|
||||
type:String,
|
||||
default:'n',//同类的字号,xxs,xs,s,n,g,lg,xl
|
||||
},
|
||||
height:{
|
||||
type:Number|String,
|
||||
default:68
|
||||
},
|
||||
// 校验规则函数。
|
||||
verify: {
|
||||
type: Function,
|
||||
default: ()=>{
|
||||
return (val) => {
|
||||
return {
|
||||
check: val?.length <= 0 ? false : true,
|
||||
text: "必填项不能为空。"
|
||||
};
|
||||
}
|
||||
}
|
||||
},
|
||||
titleClass: {
|
||||
type: String,
|
||||
default: 'text-grey-darken-4'
|
||||
},
|
||||
// 是否是必填。如果必填写将会触发基础的校验,不能为空。
|
||||
required: Boolean,
|
||||
adjustPosition: Boolean,
|
||||
autoFocus: Boolean,
|
||||
confirmType: String,
|
||||
disabled: Boolean,
|
||||
password: Boolean,
|
||||
inputType: {
|
||||
type: String,
|
||||
default: 'text'
|
||||
},
|
||||
value: {
|
||||
type: String|Number,
|
||||
default: ''
|
||||
},
|
||||
// 右边外层后缀图标。
|
||||
rightIcon: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
// 输入框内部前缀图标。
|
||||
prefixpIcon: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
prefixpIconColor: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
// 左边外层图标。
|
||||
leftIcon: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
// 后缀文字
|
||||
suffix: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
// 输入框后缀图标
|
||||
suffixIcon: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
suffixIconColor:{
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
// 左边标题。
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
fontSize:{
|
||||
type:Number|String,
|
||||
default:'n'
|
||||
},
|
||||
// 输入框文字对齐方式。left,center,right
|
||||
align: {
|
||||
type: String,
|
||||
default: 'left'
|
||||
},
|
||||
// 显示清除图标。
|
||||
clear: Boolean,
|
||||
// 主题色名称。
|
||||
color: {
|
||||
type: String,
|
||||
default: 'primary'
|
||||
},
|
||||
//输入框背景色。grey-lighten-5
|
||||
bgColor: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
// 输入框边框类型主题颜色名称。
|
||||
borderColor: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
// 是否显示下划线
|
||||
borderBottom: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
// text输入框文字颜色。
|
||||
textColor: {
|
||||
type: String,
|
||||
default: 'black'
|
||||
},
|
||||
placeholder: {
|
||||
type: String,
|
||||
default: "请输入"
|
||||
},
|
||||
placeholderClass:{
|
||||
type:String,
|
||||
default:'text-grey-lighten-1'
|
||||
},
|
||||
// 是否上下排列输入框。
|
||||
vertical: Boolean,
|
||||
round:{
|
||||
type:Number|String,
|
||||
default:2
|
||||
},
|
||||
bgRound:{
|
||||
type:Number|String,
|
||||
default:0
|
||||
},
|
||||
bgShadow:{
|
||||
type:Number|String,
|
||||
default:0
|
||||
},
|
||||
bgTheme:{
|
||||
type:String,
|
||||
default:'white'
|
||||
},
|
||||
//获取焦点。
|
||||
focus:{
|
||||
type:Boolean,
|
||||
default:false
|
||||
},
|
||||
padding:{
|
||||
type:Array,
|
||||
default:()=>{
|
||||
return [32,12];
|
||||
}
|
||||
},
|
||||
// 跟随主题色的改变而改变。
|
||||
fllowTheme:{
|
||||
type:Boolean|String,
|
||||
default:true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showError: false,
|
||||
errorText: "请正确填写",
|
||||
FOCUS_Auto:false,
|
||||
isFocus:false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
height_rpx:function(){
|
||||
return this.height;
|
||||
},
|
||||
font_size:function () {
|
||||
|
||||
let font = {
|
||||
'xxs':'20rpx',
|
||||
'xs':'22rpx',
|
||||
's':'24rpx',
|
||||
'm':'26rpx',
|
||||
'n':'28rpx',
|
||||
'g':'32rpx',
|
||||
'lg':'36rpx',
|
||||
'xl':'40rpx'
|
||||
}
|
||||
if(typeof this.fontSize=='string') return font[this.fontSize];
|
||||
return this.fontSize+'rpx';
|
||||
},
|
||||
title_size:function () {
|
||||
let font = {
|
||||
'xxs':'20rpx',
|
||||
'xs':'22rpx',
|
||||
's':'24rpx',
|
||||
'm':'26rpx',
|
||||
'n':'28rpx',
|
||||
'g':'32rpx',
|
||||
'lg':'36rpx',
|
||||
'xl':'40rpx'
|
||||
}
|
||||
if(typeof this.titleFontSize=='string') return font[this.titleFontSize];
|
||||
return this.titleFontSize+'rpx';
|
||||
},
|
||||
focus_fs:{
|
||||
get:function(){
|
||||
return this.FOCUS_Auto;
|
||||
},
|
||||
set:function(val){
|
||||
this.FOCUS_Auto = val;
|
||||
}
|
||||
},
|
||||
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;
|
||||
},
|
||||
valueLen:function(){
|
||||
// 为了兼容ios不能使用this.valdata.length.
|
||||
let p = String(this.valdata);
|
||||
return p?.split('').length||0 ;
|
||||
},
|
||||
valdata:{
|
||||
get:function(){
|
||||
return this.value;
|
||||
},
|
||||
set:function(val){
|
||||
this.$emit('input', val)
|
||||
this.$emit('update:value', val)
|
||||
if (this.required) {
|
||||
this.$nextTick(function(){
|
||||
this.verifyInput();
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
mounten(){
|
||||
this.FOCUS_Auto = this.focus;
|
||||
},
|
||||
methods: {
|
||||
onclickInput(e){
|
||||
this.$emit('click',e)
|
||||
},
|
||||
input(e) {
|
||||
this.valdata = e.target.value;
|
||||
},
|
||||
// 校验是否通过。
|
||||
verifyInput() {
|
||||
|
||||
let verify = this.verify.bind(this, this.valdata||'');
|
||||
verify = verify.call(this,this.valdata||'')
|
||||
if(typeof verify ==='function'){
|
||||
verify = verify.call(this,this.valdata||'')
|
||||
}
|
||||
|
||||
if (typeof verify !== 'object') verify = {};
|
||||
this.showError = !(verify.check??true);
|
||||
this.errorText = verify.text??"";
|
||||
return verify.check??true;
|
||||
},
|
||||
//清除校验显示 的内容。
|
||||
clearVerify() {
|
||||
this.showError = false;
|
||||
this.errorText = "";
|
||||
},
|
||||
blur(e) {
|
||||
this.isFocus=false;
|
||||
this.$emit('blur', e)
|
||||
},
|
||||
focusFun(e){
|
||||
this.isFocus=true;
|
||||
this.$emit('focus',e)
|
||||
},
|
||||
clearVal(e){
|
||||
this.valdata ="";
|
||||
this.$emit('clear', this.valdata)
|
||||
}
|
||||
},
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.tm-input {
|
||||
|
||||
.tm-input-center {
|
||||
width: 100%;
|
||||
.tm-input-center-wk{
|
||||
transition: all 0.2s;
|
||||
}
|
||||
.tm-input-center-input {
|
||||
border: none;
|
||||
background: none;
|
||||
box-shadow: 0;
|
||||
width: 100%;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.tm-input-left {
|
||||
flex-shrink: 0;
|
||||
height: 100%;
|
||||
|
||||
min-width: 80rpx;
|
||||
padding-right: 24rpx;
|
||||
}
|
||||
|
||||
.tm-input-col {
|
||||
.tm-input-left {
|
||||
max-width: inherit;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.tm-input-center {
|
||||
|
||||
.tm-input-center-input {
|
||||
|
||||
height: 76upx;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tm-input-right {
|
||||
height: 100%;
|
||||
// width: 300upx;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user