limingtao 11 months ago
parent 1394352f6c
commit 2893cfa8d3
  1. 25
      pages/investigation/index.vue
  2. 30
      pages/mine/password.vue
  3. 115
      uni_modules/uni-easyinput/changelog.md
  4. 54
      uni_modules/uni-easyinput/components/uni-easyinput/common.js
  5. 676
      uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue
  6. 88
      uni_modules/uni-easyinput/package.json
  7. 11
      uni_modules/uni-easyinput/readme.md
  8. 180
      uni_modules/uni-icons/components/uni-icons/uni-icons.uvue
  9. 218
      uni_modules/uni-icons/components/uni-icons/uni-icons.vue
  10. 36
      uni_modules/uni-icons/components/uni-icons/uniicons_file.ts
  11. 6
      uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js

@ -26,7 +26,7 @@
<text>正在办理</text> <text>正在办理</text>
<text class="number">{{ totalData.InGovernance }}</text> <text class="number">{{ totalData.InGovernance }}</text>
</view> --> </view> -->
<view class="tab-item" :class="tab === 3 ? 'active' : ''" @click='handleTabClick(3)'> <view class="tab-item" :class="tab === 3 ? 'active' : ''" @click='handleTabClick(3,true)'>
<text>已完成</text> <text>已完成</text>
<text class="number">{{ totalData.InGovernance }}</text> <text class="number">{{ totalData.InGovernance }}</text>
</view> </view>
@ -125,8 +125,10 @@
// tabFun.tabbar() // tabFun.tabbar()
this.getData() this.getData()
let pageStatus = this.$.getData('pageStatus') let pageStatus = this.$.getData('pageStatus')
this.pageStatus = pageStatus
this.queryType = this.$.getData('pageType') this.queryType = this.$.getData('pageType')
this.pageStatus = pageStatus
console.log(this.$.getData('pageType'))
if (pageStatus == 1) { if (pageStatus == 1) {
this.handleTabClick(1) this.handleTabClick(1)
this.$.setData('pageStatus', '0') this.$.setData('pageStatus', '0')
@ -157,7 +159,7 @@
this.isMore = true this.isMore = true
this.getList() this.getList()
}, },
handleTabClick(tab) { handleTabClick(tab, falg = false) {
this.tab = tab; this.tab = tab;
this.page = 1; this.page = 1;
this.list = []; this.list = [];
@ -171,7 +173,10 @@
// this.status = '20'; // this.status = '20';
// break; // break;
case 3: case 3:
this.queryType = '1' if (falg) {
this.queryType = '1'
}
this.status = '20'; this.status = '20';
break; break;
} }
@ -224,11 +229,11 @@
} else { } else {
this.$.toast(res.message) this.$.toast(res.message)
} }
if(this.status==10){ if (this.status == 10) {
this.$set(this.totalData,'UnderInvestigation',res.result.total) this.$set(this.totalData, 'UnderInvestigation', res.result.total)
} }
if(this.status==20){ if (this.status == 20) {
this.$set(this.totalData,'InGovernance',res.result.total) this.$set(this.totalData, 'InGovernance', res.result.total)
} }
}).catch((err) => { }).catch((err) => {
this.loadmorestatus = 'nomore' this.loadmorestatus = 'nomore'
@ -250,7 +255,7 @@
'&deptId=' + row.handleDept + '&deptId=' + row.handleDept +
'&pcType=' + row.pcType + '&pcType=' + row.pcType +
'&type=' + (this.tab == 1 ? 'edit' : 'view') + '&sectionName=' + row.sectionName + '&type=' + (this.tab == 1 ? 'edit' : 'view') + '&sectionName=' + row.sectionName +
'&sectionCode=' + row.sectionCode) '&sectionCode=' + row.sectionCode + '&taskName=' + row.name)
// this.$.open('/pages/map/index?businessId=' + row.businessId) // this.$.open('/pages/map/index?businessId=' + row.businessId)
} }
@ -438,7 +443,7 @@
} }
.Unit { .Unit {
padding:20rpx 12rpx; padding: 20rpx 12rpx;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;

@ -1,25 +1,25 @@
<template> <template>
<view id="page" class="password-box"> <view id="page" class="password-box">
<view class="Width100 Box BorderBox"> <view class="Width100 Box BorderBox">
<u--form labelPosition="left" :model="form" :rules="rules" ref="uForm" class="form" labelWidth="100"> <u--form labelPosition="left" :model="form" :rules="rules" ref="uForm" class="form" labelWidth="80">
<!-- <u-form-item label="原密码" prop="password" borderBottom> <!-- <u-form-item label="原密码" prop="password" borderBottom>
<u--input v-model="form.password" border="none"></u--input> <u--input v-model="form.password" border="none"></u--input>
</u-form-item> --> </u-form-item> -->
<u-form-item label="新密码" prop="password" borderBottom> <u-form-item label="新密码" prop="password" borderBottom style="position: relative;">
<u--input v-model="form.password" border="none" :password="isPassword"> <uni-easyinput type="password" v-model="form.password" :clearable="false"></uni-easyinput>
<template slot="suffix"> <!-- <u--input v-model="form.password" border="none" :password="isPassword">
<u-icon name="eye-off" v-if="isPassword" @click="isPassword=!isPassword"></u-icon>
<u-icon name="eye-fill" v-else @click="isPassword=!isPassword"></u-icon> </u--input> -->
</template> <!-- <u-icon size="20" name="eye-off" v-if="isPassword" @click.native="isPassword=!isPassword" style="position: absolute;right: 30rpx;"></u-icon>
</u--input> <u-icon size="20" name="eye-fill" v-else @click.native="isPassword=!isPassword" style="position: absolute;right: 30rpx;"></u-icon> -->
</u-form-item> </u-form-item>
<u-form-item label="确认密码" prop="confirmPassword" borderBottom> <u-form-item label="确认密码" prop="confirmPassword" borderBottom style="position: relative;">
<u--input v-model="form.confirmPassword" border="none" :password="isPassword"> <uni-easyinput type="password" v-model="form.confirmPassword" :clearable="false"></uni-easyinput>
<template slot="suffix"> <!-- <u--input v-model="form.confirmPassword" border="none" :password="isPassword">
<u-icon name="eye-off" v-if="isPassword" @click="isPassword=!isPassword"></u-icon>
<u-icon name="eye-fill" v-else @click="isPassword=!isPassword"></u-icon> </u--input> -->
</template> <!-- <u-icon size="20" name="eye-off" v-if="isPassword" @click.native="isPassword=!isPassword" style="position: absolute;right: 30rpx;"></u-icon>
</u--input> <u-icon size="20" name="eye-fill" v-else @click.native="isPassword=!isPassword" style="position: absolute;right: 30rpx;"></u-icon> -->
</u-form-item> </u-form-item>
<text class="tip"> 密码需要包含数字大小写字母特殊符号中3种以上组合</text> <text class="tip"> 密码需要包含数字大小写字母特殊符号中3种以上组合</text>
</u--form> </u--form>

@ -0,0 +1,115 @@
## 1.1.19(2024-07-18)
- 修复 初始值传入 null 导致input报错的bug
## 1.1.18(2024-04-11)
- 修复 easyinput组件双向绑定问题
## 1.1.17(2024-03-28)
- 修复 在头条小程序下丢失事件绑定的问题
## 1.1.16(2024-03-20)
- 修复 在密码输入情况下 清除和小眼睛覆盖bug 在edge浏览器下显示双眼睛bug
## 1.1.15(2024-02-21)
- 新增 左侧插槽:left
## 1.1.14(2024-02-19)
- 修复 onBlur的emit传值错误
## 1.1.12(2024-01-29)
- 补充 adjust-position文档属性补充
## 1.1.11(2024-01-29)
- 补充 adjust-position属性传递值:(Boolean)当键盘弹起时,是否自动上推页面
## 1.1.10(2024-01-22)
- 去除 移除无用的log输出
## 1.1.9(2023-04-11)
- 修复 vue3 下 keyboardheightchange 事件报错的bug
## 1.1.8(2023-03-29)
- 优化 trim 属性默认值
## 1.1.7(2023-03-29)
- 新增 cursor-spacing 属性
## 1.1.6(2023-01-28)
- 新增 keyboardheightchange 事件,可监听键盘高度变化
## 1.1.5(2022-11-29)
- 优化 主题样式
## 1.1.4(2022-10-27)
- 修复 props 中背景颜色无默认值的bug
## 1.1.0(2022-06-30)
- 新增 在 uni-forms 1.4.0 中使用可以在 blur 时校验内容
- 新增 clear 事件,点击右侧叉号图标触发
- 新增 change 事件 ,仅在输入框失去焦点或用户按下回车时触发
- 优化 组件样式,组件获取焦点时高亮显示,图标颜色调整等
## 1.0.5(2022-06-07)
- 优化 clearable 显示策略
## 1.0.4(2022-06-07)
- 优化 clearable 显示策略
## 1.0.3(2022-05-20)
- 修复 关闭图标某些情况下无法取消的 bug
## 1.0.2(2022-04-12)
- 修复 默认值不生效的 bug
## 1.0.1(2022-04-02)
- 修复 value 不能为 0 的 bug
## 1.0.0(2021-11-19)
- 优化 组件 UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-easyinput](https://uniapp.dcloud.io/component/uniui/uni-easyinput)
## 0.1.4(2021-08-20)
- 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug
## 0.1.3(2021-08-11)
- 修复 在 uni-forms 中重置表单,错误信息无法清除的问题
## 0.1.2(2021-07-30)
- 优化 vue3 下事件警告的问题
## 0.1.1
- 优化 errorMessage 属性支持 Boolean 类型
## 0.1.0(2021-07-13)
- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
## 0.0.16(2021-06-29)
- 修复 confirmType 属性(仅 type="text" 生效)导致多行文本框无法换行的 bug
## 0.0.15(2021-06-21)
- 修复 passwordIcon 属性拼写错误的 bug
## 0.0.14(2021-06-18)
- 新增 passwordIcon 属性,当 type=password 时是否显示小眼睛图标
- 修复 confirmType 属性不生效的问题
## 0.0.13(2021-06-04)
- 修复 disabled 状态可清出内容的 bug
## 0.0.12(2021-05-12)
- 新增 组件示例地址
## 0.0.11(2021-05-07)
- 修复 input-border 属性不生效的问题
## 0.0.10(2021-04-30)
- 修复 ios 遮挡文字、显示一半的问题
## 0.0.9(2021-02-05)
- 调整为 uni_modules 目录规范
- 优化 兼容 nvue 页面

@ -0,0 +1,54 @@
/**
* @desc 函数防抖
* @param func 目标函数
* @param wait 延迟执行毫秒数
* @param immediate true - 立即执行 false - 延迟执行
*/
export const debounce = function(func, wait = 1000, immediate = true) {
let timer;
return function() {
let context = this,
args = arguments;
if (timer) clearTimeout(timer);
if (immediate) {
let callNow = !timer;
timer = setTimeout(() => {
timer = null;
}, wait);
if (callNow) func.apply(context, args);
} else {
timer = setTimeout(() => {
func.apply(context, args);
}, wait)
}
}
}
/**
* @desc 函数节流
* @param func 函数
* @param wait 延迟执行毫秒数
* @param type 1 使用表时间戳在时间段开始的时候触发 2 使用表定时器在时间段结束的时候触发
*/
export const throttle = (func, wait = 1000, type = 1) => {
let previous = 0;
let timeout;
return function() {
let context = this;
let args = arguments;
if (type === 1) {
let now = Date.now();
if (now - previous > wait) {
func.apply(context, args);
previous = now;
}
} else if (type === 2) {
if (!timeout) {
timeout = setTimeout(() => {
timeout = null;
func.apply(context, args)
}, wait)
}
}
}
}

@ -0,0 +1,676 @@
<template>
<view class="uni-easyinput" :class="{ 'uni-easyinput-error': msg }" :style="boxStyle">
<view class="uni-easyinput__content" :class="inputContentClass" :style="inputContentStyle">
<uni-icons v-if="prefixIcon" class="content-clear-icon" :type="prefixIcon" color="#c0c4cc" @click="onClickIcon('prefix')" size="22"></uni-icons>
<slot name="left">
</slot>
<!-- #ifdef MP-ALIPAY -->
<textarea :enableNative="enableNative" v-if="type === 'textarea'" class="uni-easyinput__content-textarea" :class="{ 'input-padding': inputBorder }" :name="name" :value="val" :placeholder="placeholder" :placeholderStyle="placeholderStyle" :disabled="disabled" placeholder-class="uni-easyinput__placeholder-class" :maxlength="inputMaxlength" :focus="focused" :autoHeight="autoHeight" :cursor-spacing="cursorSpacing" :adjust-position="adjustPosition" @input="onInput" @blur="_Blur" @focus="_Focus" @confirm="onConfirm" @keyboardheightchange="onkeyboardheightchange"></textarea>
<input :enableNative="enableNative" v-else :type="type === 'password' ? 'text' : type" class="uni-easyinput__content-input" :style="inputStyle" :name="name" :value="val" :password="!showPassword && type === 'password'" :placeholder="placeholder" :placeholderStyle="placeholderStyle" placeholder-class="uni-easyinput__placeholder-class" :disabled="disabled" :maxlength="inputMaxlength" :focus="focused" :confirmType="confirmType" :cursor-spacing="cursorSpacing" :adjust-position="adjustPosition" @focus="_Focus" @blur="_Blur" @input="onInput" @confirm="onConfirm" @keyboardheightchange="onkeyboardheightchange" />
<!-- #endif -->
<!-- #ifndef MP-ALIPAY -->
<textarea v-if="type === 'textarea'" class="uni-easyinput__content-textarea" :class="{ 'input-padding': inputBorder }" :name="name" :value="val" :placeholder="placeholder" :placeholderStyle="placeholderStyle" :disabled="disabled" placeholder-class="uni-easyinput__placeholder-class" :maxlength="inputMaxlength" :focus="focused" :autoHeight="autoHeight" :cursor-spacing="cursorSpacing" :adjust-position="adjustPosition" @input="onInput" @blur="_Blur" @focus="_Focus" @confirm="onConfirm" @keyboardheightchange="onkeyboardheightchange"></textarea>
<input v-else :type="type === 'password' ? 'text' : type" class="uni-easyinput__content-input" :style="inputStyle" :name="name" :value="val" :password="!showPassword && type === 'password'" :placeholder="placeholder" :placeholderStyle="placeholderStyle" placeholder-class="uni-easyinput__placeholder-class" :disabled="disabled" :maxlength="inputMaxlength" :focus="focused" :confirmType="confirmType" :cursor-spacing="cursorSpacing" :adjust-position="adjustPosition" @focus="_Focus" @blur="_Blur" @input="onInput" @confirm="onConfirm" @keyboardheightchange="onkeyboardheightchange" />
<!-- #endif -->
<template v-if="type === 'password' && passwordIcon">
<!-- 开启密码时显示小眼睛 -->
<uni-icons v-if="isVal" class="content-clear-icon" :class="{ 'is-textarea-icon': type === 'textarea' }" :type="showPassword ? 'eye-slash-filled' : 'eye-filled'" :size="22" :color="focusShow ? primaryColor : '#c0c4cc'" @click="onEyes"></uni-icons>
</template>
<template v-if="suffixIcon">
<uni-icons v-if="suffixIcon" class="content-clear-icon" :type="suffixIcon" color="#c0c4cc" @click="onClickIcon('suffix')" size="22"></uni-icons>
</template>
<template v-else>
<uni-icons v-if="clearable && isVal && !disabled && type !== 'textarea'" class="content-clear-icon" :class="{ 'is-textarea-icon': type === 'textarea' }" type="clear" :size="clearSize" :color="msg ? '#dd524d' : focusShow ? primaryColor : '#c0c4cc'" @click="onClear"></uni-icons>
</template>
<slot name="right"></slot>
</view>
</view>
</template>
<script>
/**
* Easyinput 输入框
* @description 此组件可以实现表单的输入与校验包括 "text" "textarea" 类型
* @tutorial https://ext.dcloud.net.cn/plugin?id=3455
* @property {String} value 输入内容
* @property {String } type 输入框的类型默认text password/text/textarea/..
* @value text 文本输入键盘
* @value textarea 多行文本输入键盘
* @value password 密码输入键盘
* @value number 数字输入键盘注意iOS上app-vue弹出的数字键盘并非9宫格方式
* @value idcard 身份证输入键盘支付宝百度QQ小程序
* @value digit 带小数点的数字键盘 App的nvue页面微信支付宝百度头条QQ小程序支持
* @property {Boolean} clearable 是否显示右侧清空内容的图标控件点击可清空输入框内容默认true
* @property {Boolean} autoHeight 是否自动增高输入区域type为textarea时有效默认true
* @property {String } placeholder 输入框的提示文字
* @property {String } placeholderStyle placeholder的样式(内联样式字符串)"color: #ddd"
* @property {Boolean} focus 是否自动获得焦点默认false
* @property {Boolean} disabled 是否禁用默认false
* @property {Number } maxlength 最大输入长度设置为 -1 的时候不限制最大长度默认140
* @property {String } confirmType 设置键盘右下角按钮的文字仅在type="text"时生效默认done
* @property {Number } clearSize 清除图标的大小单位px默认15
* @property {String} prefixIcon 输入框头部图标
* @property {String} suffixIcon 输入框尾部图标
* @property {String} primaryColor 设置主题色默认#2979ff
* @property {Boolean} trim 是否自动去除两端的空格
* @property {Boolean} cursorSpacing 指定光标与键盘的距离单位 px
* @property {Boolean} ajust-position 当键盘弹起时是否上推内容默认值true
* @value both 去除两端空格
* @value left 去除左侧空格
* @value right 去除右侧空格
* @value start 去除左侧空格
* @value end 去除右侧空格
* @value all 去除全部空格
* @value none 不去除空格
* @property {Boolean} inputBorder 是否显示input输入框的边框默认true
* @property {Boolean} passwordIcon type=password时是否显示小眼睛图标
* @property {Object} styles 自定义颜色
* @event {Function} input 输入框内容发生变化时触发
* @event {Function} focus 输入框获得焦点时触发
* @event {Function} blur 输入框失去焦点时触发
* @event {Function} confirm 点击完成按钮时触发
* @event {Function} iconClick 点击图标时触发
* @example <uni-easyinput v-model="mobile"></uni-easyinput>
*/
function obj2strClass(obj) {
let classess = '';
for (let key in obj) {
const val = obj[key];
if (val) {
classess += `${key} `;
}
}
return classess;
}
function obj2strStyle(obj) {
let style = '';
for (let key in obj) {
const val = obj[key];
style += `${key}:${val};`;
}
return style;
}
export default {
name: 'uni-easyinput',
emits: [
'click',
'iconClick',
'update:modelValue',
'input',
'focus',
'blur',
'confirm',
'clear',
'eyes',
'change',
'keyboardheightchange'
],
model: {
prop: 'modelValue',
event: 'update:modelValue'
},
options: {
// #ifdef MP-TOUTIAO
virtualHost: false,
// #endif
// #ifndef MP-TOUTIAO
virtualHost: true
// #endif
},
inject: {
form: {
from: 'uniForm',
default: null
},
formItem: {
from: 'uniFormItem',
default: null
}
},
props: {
name: String,
value: [Number, String],
modelValue: [Number, String],
type: {
type: String,
default: 'text'
},
clearable: {
type: Boolean,
default: true
},
autoHeight: {
type: Boolean,
default: false
},
placeholder: {
type: String,
default: ' '
},
placeholderStyle: String,
focus: {
type: Boolean,
default: false
},
disabled: {
type: Boolean,
default: false
},
maxlength: {
type: [Number, String],
default: 140
},
confirmType: {
type: String,
default: 'done'
},
clearSize: {
type: [Number, String],
default: 24
},
inputBorder: {
type: Boolean,
default: true
},
prefixIcon: {
type: String,
default: ''
},
suffixIcon: {
type: String,
default: ''
},
trim: {
type: [Boolean, String],
default: false
},
cursorSpacing: {
type: Number,
default: 0
},
passwordIcon: {
type: Boolean,
default: true
},
adjustPosition: {
type: Boolean,
default: true
},
primaryColor: {
type: String,
default: '#2979ff'
},
styles: {
type: Object,
default () {
return {
color: '#333',
backgroundColor: 'rgba(0,0,0,0)',
disableColor: 'rgba(0,0,0,0)',
borderColor: 'rgba(0,0,0,0)'
};
}
},
errorMessage: {
type: [String, Boolean],
default: ''
},
// #ifdef MP-ALIPAY
enableNative: {
type: Boolean,
default: false
}
// #endif
},
data() {
return {
focused: false,
val: '',
showMsg: '',
border: false,
isFirstBorder: false,
showClearIcon: false,
showPassword: false,
focusShow: false,
localMsg: '',
isEnter: false // 使
};
},
computed: {
//
isVal() {
const val = this.val;
// fixed by mehaotian 00
if (val || val === 0) {
return true;
}
return false;
},
msg() {
// console.log('computed', this.form, this.formItem);
// if (this.form) {
// return this.errorMessage || this.formItem.errMsg;
// }
// TODO formItem errMsg
return this.localMsg || this.errorMessage;
},
// uniappinputmaxlength
inputMaxlength() {
return Number(this.maxlength);
},
// style
boxStyle() {
return `color:${
this.inputBorder && this.msg ? '#e43d33' : this.styles.color
};`;
},
// input
inputContentClass() {
return obj2strClass({
// 'is-input-border': this.inputBorder,
'is-input-error-border': this.inputBorder && this.msg,
'is-textarea': this.type === 'textarea',
'is-disabled': this.disabled,
'is-focused': this.focusShow
});
},
inputContentStyle() {
const focusColor = this.focusShow ?
this.primaryColor :
this.styles.borderColor;
const borderColor =
this.inputBorder && this.msg ? '#dd524d' : focusColor;
return obj2strStyle({
'border-color': borderColor || '#e5e5e5',
'background-color': this.disabled ?
this.styles.disableColor : this.styles.backgroundColor
});
},
// input
inputStyle() {
const paddingRight =
this.type === 'password' || this.clearable || this.prefixIcon ?
'' :
'10px';
return obj2strStyle({
'padding-right': paddingRight,
'padding-left': this.prefixIcon ? '' : '10px'
});
}
},
watch: {
value(newVal) {
// fix by mehaotian nullinputbug
if (newVal === null) {
this.val = '';
return
}
this.val = newVal;
},
modelValue(newVal) {
if (newVal === null) {
this.val = '';
return
}
this.val = newVal;
},
focus(newVal) {
this.$nextTick(() => {
this.focused = this.focus;
this.focusShow = this.focus;
});
}
},
created() {
this.init();
// TODO vue3 computed inject formItem.errMsg
if (this.form && this.formItem) {
this.$watch('formItem.errMsg', newVal => {
this.localMsg = newVal;
});
}
},
mounted() {
this.$nextTick(() => {
this.focused = this.focus;
this.focusShow = this.focus;
});
},
methods: {
/**
* 初始化变量值
*/
init() {
if (this.value || this.value === 0) {
this.val = this.value;
} else if (
this.modelValue ||
this.modelValue === 0 ||
this.modelValue === ''
) {
this.val = this.modelValue;
} else {
// fix by ht nullinput
this.val = '';
}
},
/**
* 点击图标时触发
* @param {Object} type
*/
onClickIcon(type) {
this.$emit('iconClick', type);
},
/**
* 显示隐藏内容密码框时生效
*/
onEyes() {
this.showPassword = !this.showPassword;
this.$emit('eyes', this.showPassword);
},
/**
* 输入时触发
* @param {Object} event
*/
onInput(event) {
let value = event.detail.value;
//
if (this.trim) {
if (typeof this.trim === 'boolean' && this.trim) {
value = this.trimStr(value);
}
if (typeof this.trim === 'string') {
value = this.trimStr(value, this.trim);
}
}
if (this.errMsg) this.errMsg = '';
this.val = value;
// TODO vue2
this.$emit('input', value);
// TODO  vue3
this.$emit('update:modelValue', value);
},
/**
* 外部调用方法
* 获取焦点时触发
* @param {Object} event
*/
onFocus() {
this.$nextTick(() => {
this.focused = true;
});
this.$emit('focus', null);
},
_Focus(event) {
this.focusShow = true;
this.$emit('focus', event);
},
/**
* 外部调用方法
* 失去焦点时触发
* @param {Object} event
*/
onBlur() {
this.focused = false;
this.$emit('blur', null);
},
_Blur(event) {
let value = event.detail.value;
this.focusShow = false;
this.$emit('blur', event);
// eventstring
if (this.isEnter === false) {
this.$emit('change', this.val);
}
//
if (this.form && this.formItem) {
const { validateTrigger } = this.form;
if (validateTrigger === 'blur') {
this.formItem.onFieldChange();
}
}
},
/**
* 按下键盘的发送键
* @param {Object} e
*/
onConfirm(e) {
this.$emit('confirm', this.val);
this.isEnter = true;
this.$emit('change', this.val);
this.$nextTick(() => {
this.isEnter = false;
});
},
/**
* 清理内容
* @param {Object} event
*/
onClear(event) {
this.val = '';
// TODO vue2
this.$emit('input', '');
// TODO vue2
// TODO  vue3
this.$emit('update:modelValue', '');
//
this.$emit('clear');
},
/**
* 键盘高度发生变化的时候触发此事件
* 兼容性微信小程序2.7.0+App 3.1.0+
* @param {Object} event
*/
onkeyboardheightchange(event) {
this.$emit('keyboardheightchange', event);
},
/**
* 去除空格
*/
trimStr(str, pos = 'both') {
if (pos === 'both') {
return str.trim();
} else if (pos === 'left') {
return str.trimLeft();
} else if (pos === 'right') {
return str.trimRight();
} else if (pos === 'start') {
return str.trimStart();
} else if (pos === 'end') {
return str.trimEnd();
} else if (pos === 'all') {
return str.replace(/\s+/g, '');
} else if (pos === 'none') {
return str;
}
return str;
}
}
};
</script>
<style lang="scss">
$uni-error: #e43d33;
$uni-border-1: #dcdfe6 !default;
.uni-easyinput {
/* #ifndef APP-NVUE */
width: 100%;
/* #endif */
flex: 1;
position: relative;
text-align: left;
color: #333;
font-size: 14px;
}
.uni-easyinput__content {
flex: 1;
/* #ifndef APP-NVUE */
width: 100%;
display: flex;
box-sizing: border-box;
// min-height: 36px;
/* #endif */
flex-direction: row;
align-items: center;
// border
border-color: #fff;
transition-property: border-color;
transition-duration: 0.3s;
}
.uni-easyinput__content-input {
/* #ifndef APP-NVUE */
width: auto;
/* #endif */
position: relative;
overflow: hidden;
flex: 1;
line-height: 1;
font-size: 14px;
height: 35px;
// min-height: 36px;
/*ifdef H5*/
& ::-ms-reveal {
display: none;
}
& ::-ms-clear {
display: none;
}
& ::-o-clear {
display: none;
}
/*endif*/
}
.uni-easyinput__placeholder-class {
color: #999;
font-size: 12px;
// font-weight: 200;
}
.is-textarea {
align-items: flex-start;
}
.is-textarea-icon {
margin-top: 5px;
}
.uni-easyinput__content-textarea {
position: relative;
overflow: hidden;
flex: 1;
line-height: 1.5;
font-size: 14px;
margin: 6px;
margin-left: 0;
height: 80px;
min-height: 80px;
/* #ifndef APP-NVUE */
min-height: 80px;
width: auto;
/* #endif */
}
.input-padding {
padding-left: 10px;
}
.content-clear-icon {
padding: 0 5px;
}
.label-icon {
margin-right: 5px;
margin-top: -1px;
}
//
.is-input-border {
/* #ifndef APP-NVUE */
display: flex;
box-sizing: border-box;
/* #endif */
flex-direction: row;
align-items: center;
border: 1px solid $uni-border-1;
border-radius: 4px;
/* #ifdef MP-ALIPAY */
overflow: hidden;
/* #endif */
}
.uni-error-message {
position: absolute;
bottom: -17px;
left: 0;
line-height: 12px;
color: $uni-error;
font-size: 12px;
text-align: left;
}
.uni-error-msg--boeder {
position: relative;
bottom: 0;
line-height: 22px;
}
.is-input-error-border {
border-color: $uni-error;
.uni-easyinput__placeholder-class {
color: mix(#fff, $uni-error, 50%);
}
}
.uni-easyinput--border {
margin-bottom: 0;
padding: 10px 15px;
// padding-bottom: 0;
border-top: 1px #eee solid;
}
.uni-easyinput-error {
padding-bottom: 0;
}
.is-first-border {
/* #ifndef APP-NVUE */
border: none;
/* #endif */
/* #ifdef APP-NVUE */
border-width: 0;
/* #endif */
}
.is-disabled {
background-color: #f7f6f6;
color: #d5d5d5;
.uni-easyinput__placeholder-class {
color: #d5d5d5;
font-size: 12px;
}
}
</style>

@ -0,0 +1,88 @@
{
"id": "uni-easyinput",
"displayName": "uni-easyinput 增强输入框",
"version": "1.1.19",
"description": "Easyinput 组件是对原生input组件的增强",
"keywords": [
"uni-ui",
"uniui",
"input",
"uni-easyinput",
"输入框"
],
"repository": "https://github.com/dcloudio/uni-ui",
"engines": {
"HBuilderX": ""
},
"directories": {
"example": "../../temps/example_temps"
},
"dcloudext": {
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
"type": "component-vue"
},
"uni_modules": {
"dependencies": [
"uni-scss",
"uni-icons"
],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y",
"alipay": "n"
},
"client": {
"App": {
"app-vue": "y",
"app-nvue": "y"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "y",
"Edge": "y",
"Firefox": "y",
"Safari": "y"
},
"小程序": {
"微信": "y",
"阿里": "y",
"百度": "y",
"字节跳动": "y",
"QQ": "y"
},
"快应用": {
"华为": "u",
"联盟": "u"
},
"Vue": {
"vue2": "y",
"vue3": "y"
}
}
}
}
}

@ -0,0 +1,11 @@
### Easyinput 增强输入框
> **组件名:uni-easyinput**
> 代码块: `uEasyinput`
easyinput 组件是对原生input组件的增强 ,是专门为配合表单组件[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)而设计的,easyinput 内置了边框,图标等,同时包含 input 所有功能
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-easyinput)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839

@ -1,91 +1,91 @@
<template> <template>
<text class="uni-icons" :style="styleObj"> <text class="uni-icons" :style="styleObj">
<slot>{{unicode}}</slot> <slot>{{unicode}}</slot>
</text> </text>
</template> </template>
<script> <script>
import { fontData, IconsDataItem } from './uniicons_file' import { fontData, IconsDataItem } from './uniicons_file'
/** /**
* Icons 图标 * Icons 图标
* @description 用于展示 icon 图标 * @description 用于展示 icon 图标
* @tutorial https://ext.dcloud.net.cn/plugin?id=28 * @tutorial https://ext.dcloud.net.cn/plugin?id=28
* @property {Number,String} size 图标大小 * @property {Number,String} size 图标大小
* @property {String} type 图标图案,参考示例 * @property {String} type 图标图案,参考示例
* @property {String} color 图标颜色 * @property {String} color 图标颜色
* @property {String} customPrefix 自定义图标 * @property {String} customPrefix 自定义图标
* @event {Function} click 点击 Icon 触发事件 * @event {Function} click 点击 Icon 触发事件
*/ */
export default { export default {
name: "uni-icons", name: "uni-icons",
props: { props: {
type: { type: {
type: String, type: String,
default: '' default: ''
}, },
color: { color: {
type: String, type: String,
default: '#333333' default: '#333333'
}, },
size: { size: {
type: [Number, String], type: [Number, String],
default: 16 default: 16
}, },
fontFamily: { fontFamily: {
type: String, type: String,
default: '' default: ''
} }
}, },
data() { data() {
return {}; return {};
}, },
computed: { computed: {
unicode() : string { unicode() : string {
let codes = fontData.find((item : IconsDataItem) : boolean => { return item.font_class == this.type }) let codes = fontData.find((item : IconsDataItem) : boolean => { return item.font_class == this.type })
if (codes !== null) { if (codes !== null) {
return codes.unicode return codes.unicode
} }
return '' return ''
}, },
iconSize() : string { iconSize() : string {
const size = this.size const size = this.size
if (typeof size == 'string') { if (typeof size == 'string') {
const reg = /^[0-9]*$/g const reg = /^[0-9]*$/g
return reg.test(size as string) ? '' + size + 'px' : '' + size; return reg.test(size as string) ? '' + size + 'px' : '' + size;
// return '' + this.size // return '' + this.size
} }
return this.getFontSize(size as number) return this.getFontSize(size as number)
}, },
styleObj() : UTSJSONObject { styleObj() : UTSJSONObject {
if (this.fontFamily !== '') { if (this.fontFamily !== '') {
return { color: this.color, fontSize: this.iconSize, fontFamily: this.fontFamily } return { color: this.color, fontSize: this.iconSize, fontFamily: this.fontFamily }
} }
return { color: this.color, fontSize: this.iconSize } return { color: this.color, fontSize: this.iconSize }
} }
}, },
created() { }, created() { },
methods: { methods: {
/** /**
* 字体大小 * 字体大小
*/ */
getFontSize(size : number) : string { getFontSize(size : number) : string {
return size + 'px'; return size + 'px';
}, },
}, },
} }
</script> </script>
<style scoped> <style scoped>
@font-face { @font-face {
font-family: UniIconsFontFamily; font-family: UniIconsFontFamily;
src: url('./uniicons.ttf'); src: url('./uniicons.ttf');
} }
.uni-icons { .uni-icons {
font-family: UniIconsFontFamily; font-family: UniIconsFontFamily;
font-size: 18px; font-size: 18px;
font-style: normal; font-style: normal;
color: #333; color: #333;
} }
</style> </style>

@ -1,110 +1,110 @@
<template> <template>
<!-- #ifdef APP-NVUE --> <!-- #ifdef APP-NVUE -->
<text :style="styleObj" class="uni-icons" @click="_onClick">{{unicode}}</text> <text :style="styleObj" class="uni-icons" @click="_onClick">{{unicode}}</text>
<!-- #endif --> <!-- #endif -->
<!-- #ifndef APP-NVUE --> <!-- #ifndef APP-NVUE -->
<text :style="styleObj" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick"> <text :style="styleObj" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick">
<slot></slot> <slot></slot>
</text> </text>
<!-- #endif --> <!-- #endif -->
</template> </template>
<script> <script>
import { fontData } from './uniicons_file_vue.js'; import { fontData } from './uniicons_file_vue.js';
const getVal = (val) => { const getVal = (val) => {
const reg = /^[0-9]*$/g const reg = /^[0-9]*$/g
return (typeof val === 'number' || reg.test(val)) ? val + 'px' : val; return (typeof val === 'number' || reg.test(val)) ? val + 'px' : val;
} }
// #ifdef APP-NVUE // #ifdef APP-NVUE
var domModule = weex.requireModule('dom'); var domModule = weex.requireModule('dom');
import iconUrl from './uniicons.ttf' import iconUrl from './uniicons.ttf'
domModule.addRule('fontFace', { domModule.addRule('fontFace', {
'fontFamily': "uniicons", 'fontFamily': "uniicons",
'src': "url('" + iconUrl + "')" 'src': "url('" + iconUrl + "')"
}); });
// #endif // #endif
/** /**
* Icons 图标 * Icons 图标
* @description 用于展示 icons 图标 * @description 用于展示 icons 图标
* @tutorial https://ext.dcloud.net.cn/plugin?id=28 * @tutorial https://ext.dcloud.net.cn/plugin?id=28
* @property {Number} size 图标大小 * @property {Number} size 图标大小
* @property {String} type 图标图案参考示例 * @property {String} type 图标图案参考示例
* @property {String} color 图标颜色 * @property {String} color 图标颜色
* @property {String} customPrefix 自定义图标 * @property {String} customPrefix 自定义图标
* @event {Function} click 点击 Icon 触发事件 * @event {Function} click 点击 Icon 触发事件
*/ */
export default { export default {
name: 'UniIcons', name: 'UniIcons',
emits: ['click'], emits: ['click'],
props: { props: {
type: { type: {
type: String, type: String,
default: '' default: ''
}, },
color: { color: {
type: String, type: String,
default: '#333333' default: '#333333'
}, },
size: { size: {
type: [Number, String], type: [Number, String],
default: 16 default: 16
}, },
customPrefix: { customPrefix: {
type: String, type: String,
default: '' default: ''
}, },
fontFamily: { fontFamily: {
type: String, type: String,
default: '' default: ''
} }
}, },
data() { data() {
return { return {
icons: fontData icons: fontData
} }
}, },
computed: { computed: {
unicode() { unicode() {
let code = this.icons.find(v => v.font_class === this.type) let code = this.icons.find(v => v.font_class === this.type)
if (code) { if (code) {
return code.unicode return code.unicode
} }
return '' return ''
}, },
iconSize() { iconSize() {
return getVal(this.size) return getVal(this.size)
}, },
styleObj() { styleObj() {
if (this.fontFamily !== '') { if (this.fontFamily !== '') {
return `color: ${this.color}; font-size: ${this.iconSize}; font-family: ${this.fontFamily};` return `color: ${this.color}; font-size: ${this.iconSize}; font-family: ${this.fontFamily};`
} }
return `color: ${this.color}; font-size: ${this.iconSize};` return `color: ${this.color}; font-size: ${this.iconSize};`
} }
}, },
methods: { methods: {
_onClick() { _onClick() {
this.$emit('click') this.$emit('click')
} }
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss">
/* #ifndef APP-NVUE */ /* #ifndef APP-NVUE */
@import './uniicons.css'; @import './uniicons.css';
@font-face { @font-face {
font-family: uniicons; font-family: uniicons;
src: url('./uniicons.ttf'); src: url('./uniicons.ttf');
} }
/* #endif */ /* #endif */
.uni-icons { .uni-icons {
font-family: uniicons; font-family: uniicons;
text-decoration: none; text-decoration: none;
text-align: center; text-align: center;
} }
</style> </style>

@ -1,19 +1,19 @@
export type IconsData = { export type IconsData = {
id : string id : string
name : string name : string
font_family : string font_family : string
css_prefix_text : string css_prefix_text : string
description : string description : string
glyphs : Array<IconsDataItem> glyphs : Array<IconsDataItem>
} }
export type IconsDataItem = { export type IconsDataItem = {
font_class : string font_class : string
unicode : string unicode : string
} }
export const fontData = [ export const fontData = [
{ {
"font_class": "arrow-down", "font_class": "arrow-down",
@ -659,6 +659,6 @@ export const fontData = [
"font_class": "weixin", "font_class": "weixin",
"unicode": "\ue691" "unicode": "\ue691"
} }
] as IconsDataItem[] ] as IconsDataItem[]
// export const fontData = JSON.parse<IconsDataItem>(fontDataJson) // export const fontData = JSON.parse<IconsDataItem>(fontDataJson)

@ -1,4 +1,4 @@
export const fontData = [ export const fontData = [
{ {
"font_class": "arrow-down", "font_class": "arrow-down",
@ -644,6 +644,6 @@ export const fontData = [
"font_class": "weixin", "font_class": "weixin",
"unicode": "\ue691" "unicode": "\ue691"
} }
] ]
// export const fontData = JSON.parse<IconsDataItem>(fontDataJson) // export const fontData = JSON.parse<IconsDataItem>(fontDataJson)

Loading…
Cancel
Save