本文分享的Input组件为uni-app的内置组件Input,非扩展组件,两者在用法上其实大同小异,只是扩展组件的属性以及事件更多…没有本质上的区别~
《uni-app》表单组件-Input组件
一. 简介
input,输入框组件,表单届的扛把子,几乎所有的表单都离不开input,一个表单可以没有radio,可以没有checkbox,但是几乎不大可能没有输入框,它 是表单组件中属于使用频率最高的一种,常见的业务场景包括登录时的用户名,密码以及注册时一大堆信息填写,只要是信息录入的功能第一选择基本都是输入框;
由于 input属性事件众多,本文仅仅针对实际应用频率较高的作详细分享,对于应用场景较少属性和事件会相对简略,耐心看完,你一定有所收获~
二. 基础用法
基础用法如下:
<input />
非常简单,值得注意的是 input是一个单标签元素,使用闭合标签会在控制台报错~其表现形态 效果图 如下,可以在输入框中输入文字:
三. value属性与双向绑定
value值,用于 设置input中显示的默认值,具体说明如下:
属性名 | 类型 | 默认值 | 说明 | 平台差异说明 |
---|---|---|---|---|
value | String | 输入框的初始内容 |
换句话说,设置了value值的input组件将在加载的时候同步在输入框内显示对应的值,示例代码如下:
<input :value="value" />
<script>
export default {
data() {
return {
value: '默认value属性'
};
}
};
</script>
其表现形态 效果图 如下:
但此时如果在输入框中输入值 并不会反向改变value的值,可以理解成这是一种 单向的数据流,input组件只能 被动显示value值对应的信息,如果想要 实现双向绑定,那么就需要借助vue中的 v-model指令
,示例代码如下:
<!-- value属性与双向绑定 -->
<view class="input-group">
<h4>value属性与双向绑定</h4>
<input v-model="value" />
{{ value }}
</view>
通过 v-model双向绑定了value,并且在input的下方同步显示value对应的值,这样通过判断下方的显示值即可判断是否实现了数据流的双向绑定,其表现形态 效果图 如下:
四. type属性与password属性
type属性,用于控制输入框的类型,我们知道输入框的类型有很多种,最常见的就是登陆、注册界面的 用户名 和 密码 了,密码输入框中输入的所有值都会被替换成小圆点显示;
type值的具体说明如下:
值 | 说明 | 平台差异说明 |
---|---|---|
text | 文本输入键盘 | |
number | 数字输入键盘 | 均支持,App平台、H5平台 3.1.22 以下版本 vue 页面在 iOS 平台显示的键盘包含负数和小数。 |
idcard | 身份证输入键盘 | 微信、支付宝、百度、QQ小程序、快手小程序、京东小程序 |
digit | 带小数点的数字键盘 | 均支持,App平台、H5平台 vue 页面在 iOS 平台显示的键盘包含负数。 |
tel | 电话输入键盘 | 仅App的nvue页面支持 |
safe-password | 密码安全输入键盘 | 微信小程序 |
nickname | 昵称输入键盘 | 微信小程序 |
以 number
为例,示例代码如下:
<view class="input-group">
<h4>type number</h4>
<input v-model="value" type="number" />
{{ value }}
</view>
<script>
export default {
data() {
return {
value: '默认value属性'
};
}
};
</script>
type="number"
的input框只能输入数字,对于非数字的值将会被过滤掉,其表现形态 效果图 如下:
默认的 value值为不可被转为数字的字符串,因此值将不会被显示在输入框中;
除了以上的type值外,还有一个比较特殊的值 password
,该属性特殊在其并 不是直接设置在type中,而是直接 作为一个属性添加在input上,示例代码如下:
<input v-model="value" password />
其表现形态 效果图 如下:
五. placeholder、placeholder-style、placeholder-class属性
placeholder属性、placeholder-style属性、placeholder-class,用于控制input框无内容时的显示内容以及其样式,具体说明如下:
属性名 | 类型 | 默认值 | 说明 | 平台差异说明 |
---|---|---|---|---|
placeholder | String | 输入框为空时占位符 | ||
placeholder-style | String | 指定 placeholder 的样式 | ||
placeholder-class | String | “input-placeholder” | 指定 placeholder 的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/ | 字节跳动小程序、飞书小程序、快手小程序不支持 |
看个例子吧
<input v-model="value" placeholder="这是一段测试默认文字" />
其表现形态 效果图 如下:
当输入框内无输入内容时,会显示这段默认文字,存在内容时,内容文字覆盖默认文字,而
placeholder-style 和 placeholder-class 则是为这个默认文字 添加样式,这两个属性等同于html中的style属性 以及 class属性,用法几乎一致:
<input
v-model="value"
placeholder="这是一段测试默认文字"
placeholder-style="color:#e1e1e1;font-size:20px" />
其表现形态 效果图 如下:
六. disabled属性
disabled属性,用于将input设定为不可编辑状态,属性说明如下:
属性名 | 类型 | 默认值 | 说明 | 平台差异说明 |
---|---|---|---|---|
disabled | Boolean | false | 是否禁用 |
disabled 接收一个布尔值作为参数,当值为 true
的时候,该输入框将处于不可编辑的状态
<input v-model="value" placeholder="这是一段测试默认文字" :disabled="true" />
当然,这个值可以放在data中作为一个变量
<input v-model="value" placeholder="这是一段测试默认文字" :disabled="disabled" />
<script>
export default {
data() {
return {
disabled: true
};
}
};
</script>
七. maxlength属性
maxlength属性,用于将input输入内容的上限,属性说明如下:
属性名 | 类型 | 默认值 | 说明 | 平台差异说明 |
---|---|---|---|---|
maxlength | Number | 140 | 最大输入长度,设置为 -1 的时候不限制最大长度 |
比如,我们限定该输入框的内容长度不可超过5,那么就可以如下设定属性
<input v-model="value" placeholder="这是一段测试默认文字" :maxlength="5" />
当输入内容长度超过5时,输入框将不可再输入内容
八. confirm-type属性与confirm-hold属性
confirm-type属性 与 confirm-hold属性,这两个属性主要 用于对键盘的控制,先看一下confirm-hold属性,该属性说明如下
属性名 | 类型 | 默认值 | 说明 | 平台差异说明 |
---|---|---|---|---|
confirm-hold | Boolean | false | 点击键盘右下角按钮时是否保持键盘不收起 | App(3.3.7+)、H5 (3.3.7+)、微信小程序、支付宝小程序、百度小程序、QQ小程序、京东小程序 |
设置该属性后,键盘点击右下按钮 将不会被收起,示例代码如下:
<input v-model="value" placeholder="这是一段测试默认文字" :confirm-hold="true" />
这里可能会有小伙伴不明白什么是键盘右下角的按钮,简单的说就是我们手机在输入的时候在小键盘右下角的按钮,这个按钮一般是类似于:发送,完成,搜索这种,如何设置这个按钮,这就是另外一个属性:confirm-type属性,它存在以下这些值
值 | 说明 | 平台差异说明 |
---|---|---|
send | 右下角按钮为“发送” | 微信、支付宝、百度小程序、快手小程序、京东小程序、app-nvue、app-vue和h5(2.9.9+,且要求设备webview内核Chrome81+、Safari13.7+) |
search | 右下角按钮为“搜索” | |
next | 右下角按钮为“下一个” | 微信、支付宝、百度小程序、快手小程序、京东小程序、app-nvue、app-vue和h5(2.9.9+,且要求设备webview内核Chrome81+、Safari13.7+) |
go | 右下角按钮为“前往” | |
done | 右下角按钮为“完成” | 微信、支付宝、百度小程序、快手小程序、京东小程序、app-nvue、app-vue和h5(2.9.9+,且要求设备webview内核Chrome81+、Safari13.7+) |
通过设置 confirm-type的值,可以控制键盘显示对应的文字内容,示例代码如下:
<input
v-model="value"
placeholder="这是一段测试默认文字"
:confirm-hold="true"
confirm-type="send"/>
这个示例就是将右下角的文字设置成 “发送”
九. @input事件
@input事件,该事件会在输入框内 输入内容时实时触发,事件官方说明如下:
属性名 | 类型 | 默认值 | 说明 | 平台差异说明 |
---|---|---|---|---|
@input | EventHandle | |||
当键盘输入时,触发input事件,event.detail = {value} | 差异见下方 Tips |
举个例子,搜索框的联想功能像百度这种,每当用户输入一个单词都需要请求一次匹配最合适的搜索结果,那么就可以使用@input事件,示例代码如下:
<input placeholder="这是一段测试默认文字" @input="handleInput" />
{{ value }}
<script>
export default {
methods: {
handleInput(event) {
this.value = event.detail.value;
}
}
};
</script>
其表现形态 效果图 如下:
看到这里,可能有小伙伴发现,这个效果怎么和上面的双向绑定这么像,其实v-model这个双向绑定针对input控件,内部也是通过@input事件实现的,大致实现如下:
<input placeholder="这是一段测试默认文字" :value="value" @input="handleInput" />
在绑定input事件的基础上额外给其增加了一个value属性
十. @focus事件与@blur事件
@focus事件 与 @blur事件,聚焦事件 与 失焦事件,我们知道输入框是有焦点的(简单的说就是是否有光标),获得焦点与失去焦点就会触发 @focus事件 与 @blur事件,事件说明如下:
属性名 | 类型 | 默认值 | 说明 | 平台差异说明 |
---|---|---|---|---|
@focus | EventHandle | 输入框聚焦时触发,event.detail = { value, height },height 为键盘高度 | 仅微信小程序、京东小程序、App(2.2.3+) 、QQ小程序支持 height | |
@blur | EventHandle | 输入框失去焦点时触发,event.detail = {value: value} | 快手小程序不支持 |
接着,我们看一下示例代码:
<input
placeholder="这是一段测试默认文字"
@focus="handleFocus"
@blur="handleBlur" />
<script>
export default {
methods: {
handleFocus(event) {
console.log('聚焦事件');
},
handleBlur(event) {
console.log('失焦事件');
}
}
};
</script>
其表现形态 效果图 如下:
通过控制台,我们可以看到 当输入框获得焦点与失去焦点时,分别触发了 @focus事件 与 @blur事件
十一. @confirm事件
@confirm事件,用于点击完成时触发,事件说明如下:
属性名 | 类型 | 默认值 | 说明 | 平台差异说明 |
---|---|---|---|---|
@confirm | EventHandle | |||
点击完成按钮时触发,event.detail = {value: value} | 快手小程序不支持 |
当我们 点击小键盘上的完成按钮 时,会 触发该事件,在业务场景上我们一般视这个操作等同于点击“确认”按钮,比如当处于登陆界面时,输入完用户名与密码,在小键盘上直接点击完成,即可触发登陆事件,不需要关闭小键盘,点击“登录”按钮进行账户的验证;
示例代码如下:
<input placeholder="这是一段测试默认文字" @confirm="handleConfirm" />
<script>
export default {
methods: {
handleConfirm(event) {
console.log('点击完成按钮,触发事件');
}
}
};
</script>
十二. demo示例演示
12.1 示例说明
本节将实现一个demo,信息的编辑与预览,当信息处于编辑状态时输入框处于可编辑可输入的状态,当输入框处于预览状态时输入框处于不可编辑不可输入状态;
这个场景其实非常常见,举个例子,产品信息当登陆用户为管理员时,可以对产品信息进行修改编辑,但当登陆的用户为普通用户时,该信息不可编辑不可修改;
因此,本示例要实现的具体功能如下:一个button控制一个变量type,这个type将决定input是否可以处于可编辑状态;
12.2 实现代码
<view class="input-group">
<h4>产品说明</h4>
<input placeholder="产品说明" v-model="value" :disabled="type" />
</view>
<button @click="type = !type">{{ type ? '不可编辑' : '可编辑' }}</button>
<script>
export default {
data() {
return {
value: '',
type: false
};
},
methods: {
handleConfirm(event) {
console.log('点击完成按钮,触发事件');
}
}
};
</script>
其表现形态 效果图 如下:
十三. 全属性详细说明
属性名 | 类型 | 默认值 | 说明 | 平台差异说明 |
---|---|---|---|---|
value | String | 输入框的初始内容 | ||
type | String | text | input 的类型 | H5 暂未支持动态切换,详见下方 Tips,请使用 v-if 进行整体切换 |
text-content-type | String | 文本区域的语义,根据类型自动填充 | 仅 App-nvue-iOS 支持 | |
password | Boolean | false | 是否是密码类型 | H5和App写此属性时,type失效 |
placeholder | String | 输入框为空时占位符 | ||
placeholder-style | String | 指定 placeholder 的样式 | ||
placeholder-class | String | “input-placeholder” | 指定 placeholder 的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/ | 字节跳动小程序、飞书小程序、快手小程序不支持 |
disabled | Boolean | false | 是否禁用 | |
maxlength | Number | 140 | 最大输入长度,设置为 -1 的时候不限制最大长度 | |
cursor-spacing | Number | 0 | 指定光标与键盘的距离,单位 px 。取 input 距离底部的距离和 cursor-spacing 指定的距离的最小值作为光标与键盘的距离 | App、微信小程序、百度小程序、QQ小程序、京东小程序 |
focus | Boolean | false | 获取焦点。 | 在 H5 平台能否聚焦以及软键盘是否跟随弹出,取决于当前浏览器本身的实现。nvue 页面不支持,需使用组件的 focus()、blur() 方法控制焦点 |
confirm-type | String | done | 设置键盘右下角按钮的文字,仅在 type=“text” 时生效。 | 微信小程序、App、H5、快手小程序、京东小程序 |
confirm-hold | Boolean | false | 点击键盘右下角按钮时是否保持键盘不收起 | App(3.3.7+)、H5 (3.3.7+)、微信小程序、支付宝小程序、百度小程序、QQ小程序、京东小程序 |
cursor | Number | 指定focus时的光标位置 | ||
selection-start | Number | -1 | 光标起始位置,自动聚集时有效,需与selection-end搭配使用 | |
selection-end | Number | -1 | 光标结束位置,自动聚集时有效,需与selection-start搭配使用 | |
adjust-position | Boolean | true | 键盘弹起时,是否自动上推页面 | App-Android(vue 页面 softinputMode 为 adjustResize 时无效,使用 x5 内核时无效)、微信小程序、百度小程序、QQ小程序、京东小程序 |
auto-blur | Boolean | false | 键盘收起时,是否自动失去焦点 | App-Vue 3.0.0+ |
ignoreCompositionEvent | Boolean | true | 是否忽略组件内对文本合成系统事件的处理。为 false 时将触发 compositionstart、compositionend、compositionupdate 事件,且在文本合成期间会触发 input 事件 | App-vue (3.4.4+)、H5 (3.4.4+)、App-nvue不支持 |
always-embed | Boolean | false | 强制 input 处于同层状态,默认 focus 时 input 会切到非同层状态 (仅在 iOS 下生效) | 微信小程序 2.10.4+ |
hold-keyboard | Boolean | false | focus时,点击页面的时候不收起键盘 | 微信小程序 2.8.2+ |
safe-password-cert-path | String | 安全键盘加密公钥的路径,只支持包内路径 | 微信小程序 2.18.0+ | |
safe-password-length | Number | 安全键盘输入密码长度 | 微信小程序 2.18.0+ | |
safe-password-time-stamp | Number | 安全键盘加密时间戳 | 微信小程序 2.18.0+ | |
safe-password-nonce | String | 安全键盘加密盐值 | 微信小程序 2.18.0+ | |
safe-password-salt | String | 安全键盘计算 hash 盐值,若指定custom-hash 则无效 | 微信小程序 2.18.0+ | |
safe-password-custom-hash | String | 安全键盘计算 hash 的算法表达式,如 md5(sha1(‘foo’ + sha256(sm3(password + ‘bar’)))) | 微信小程序 2.18.0+ | |
random-number | Boolean | false | 当 type 为 number, digit, idcard 数字键盘是否随机排列 | 支付宝小程序 1.9.0+ |
controlled | Boolean | false | 是否为受控组件。为 true 时,value 内容会完全受 setData 控制 | 支付宝小程序 1.9.0+ |
always-system | Boolean | false | 是否强制使用系统键盘和 Web-view 创建的 input 元素。为 true 时,confirm-type、confirm-hold 可能失效 | 支付宝小程序 2.7.3+ |
@input | EventHandle | 当键盘输入时,触发input事件,event.detail = {value} | 差异见下方 Tips | |
@focus | EventHandle | 输入框聚焦时触发,event.detail = { value, height },height 为键盘高度 | 仅微信小程序、京东小程序、App(2.2.3+) 、QQ小程序支持 height | |
@blur | EventHandle | 输入框失去焦点时触发,event.detail = {value: value} | 快手小程序不支持 | |
@confirm | EventHandle | 点击完成按钮时触发,event.detail = {value: value} | 快手小程序不支持 | |
@keyboardheightchange | eventhandle | 键盘高度发生变化的时候触发此事件,event.detail = {height: height, duration: duration} | 微信小程序基础库2.7.0+、App 3.1.0+ |
十四. 小结
由于使用频率的关系,本文主要分享了uni-app中内置组件input的一些主要属性,input组件中其实 最重要 的属性是 value属性 与双向绑定,从业务场景看,input承担的职责绝大多数都是信息录入的功能,那么如何获取输入的内容自然而然就变得最重要;
input作为表单组件中最为重要的基石之一,可以说掌握它起码就掌握了一半实际开发中的场景了,因此input组件一定要仔细学习;
(PS:都已经看到这里了,点个赞,求个关注吧,万分感谢~)