UNPKG

nutui-uniapp

Version:

京东风格的轻量级移动端 Uniapp、Vue3 组件库(支持小程序开发)

182 lines (177 loc) 5.51 kB
import type { BaseEvent, InputOnBlurEvent, InputOnConfirmEvent, InputOnFocusEvent, InputOnInputEvent, } from '@uni-helper/uni-app-types' import type { ExtractPropTypes, PropType, StyleValue } from 'vue' import { BLUR_EVENT, CLEAR_EVENT, CLICK_EVENT, CONFIRM_EVENT, FOCUS_EVENT, INPUT_EVENT, UPDATE_MODEL_EVENT } from '../_constants' import type { ClassType } from '../_utils' import { commonProps, isNumber, isString, makeNumberProp, makeNumericProp, makeStringProp, nullableBooleanProp, truthProp, } from '../_utils' import type { InputAlignType, InputConfirmType, InputFormatTrigger, InputMode, InputType } from './type' export const inputProps = { ...commonProps, /** * @description 输入框类型,支持原生 `input` 标签的所有 `type` 属性,另外还支持 `number` `digit` */ type: makeStringProp<InputType>('text'), /** * @description 输入值,双向绑定 */ modelValue: makeNumericProp(''), /** * @description 输入框自定义类名 */ inputClass: { type: [String, Object, Array] as PropType<ClassType>, default: '', }, /** * @description 输入框自定义样式 */ inputStyle: { type: [String, Object, Array] as PropType<StyleValue>, default: '', }, /** * @description 输入框为空时占位符 */ placeholder: makeStringProp(''), /** * @description 指定 placeholder 的样式 */ placeholderStyle: makeStringProp(''), /** * @description 指定 placeholder 的样式类 */ placeholderClass: makeStringProp('input-placeholder'), /** * @description 输入框内容对齐方式,可选值 `left`、`center`、`right` */ inputAlign: makeStringProp<InputAlignType>('left'), /** * @description 是否显示必填字段的标签旁边的红色星号 */ required: Boolean, /** * @description 是否禁用 */ disabled: nullableBooleanProp, /** * @description 是否只读 */ readonly: Boolean, /** * @description 是否标红 */ error: Boolean, /** * @description 限制最长输入字符 */ maxLength: makeNumericProp(140), /** * @description 展示清除 `Icon` */ clearable: Boolean, /** * @description 清除图标的 `font-size` 大小 */ clearSize: makeNumericProp('14'), /** * @description 是否显示下边框 */ border: truthProp, /** * @description 格式化函数触发的时机,可选值为 `onChange`、`onBlur` */ formatTrigger: makeStringProp<InputFormatTrigger>('onChange'), /** * @description 输入内容格式化函数 */ formatter: { type: Function as PropType<(value: string) => string>, default: null, }, /** * @description 是否显示限制最长输入字符,需要设置 `max-length` 属性 */ showWordLimit: Boolean, /** * @description 是否自动获得焦点,`iOS` 系统不支持该属性 */ autofocus: Boolean, /** * @description 键盘右下角按钮的文字,仅在`type='text'`时生效,可选值 `send`:发送、`search`:搜索、`next`:下一个、`go`:前往、`done`:完成 */ confirmType: makeStringProp<InputConfirmType>('done'), /** * @description 键盘弹起时,是否自动上推页面 */ adjustPosition: truthProp, /** * @description 是否强制使用系统键盘和 `Web-view` 创建的 `input` 元素。为 `true` 时,`confirm-type`、`confirm-hold` 可能失效 */ alwaysSystem: Boolean, /** * @description 是否在失去焦点后,继续展示清除按钮,在设置 `clearable` 时生效 */ showClearIcon: Boolean, /** * @description 输入框模式 */ inputMode: makeStringProp<InputMode>('text'), /** * @description 指定光标与键盘的距离,取 input 距离底部的距离和 cursor-spacing 指定的距离的最小值作为光标与键盘的距离 */ cursorSpacing: makeNumberProp(0), /** * @description 强制 input 处于同层状态,默认 focus 时 input 会切到非同层状态 (仅在 iOS 下生效) */ alwaysEmbed: Boolean, /** * @description 点击键盘右下角按钮时是否保持键盘不收起 */ confirmHold: Boolean, /** * @description 指定focus时的光标位置 */ cursor: makeNumberProp(-1), /** * @description 光标起始位置,自动聚集时有效,需与selection-end搭配使用 */ selectionStart: makeNumberProp(-1), /** * @description 光标结束位置,自动聚集时有效,需与selection-start搭配使用 */ selectionEnd: makeNumberProp(-1), /** * @description focus时,点击页面的时候不收起键盘 */ holdKeyboard: Boolean, /** * @description 是否是密码类型 */ password: Boolean, } export type InputProps = ExtractPropTypes<typeof inputProps> export const inputEmits = { [CLICK_EVENT]: (evt: BaseEvent) => evt instanceof Object, clickInput: (evt: BaseEvent) => evt instanceof Object, [BLUR_EVENT]: (evt: InputOnBlurEvent) => evt instanceof Object, [FOCUS_EVENT]: (evt: InputOnFocusEvent) => evt instanceof Object, [CLEAR_EVENT]: () => true, [CONFIRM_EVENT]: (evt: InputOnConfirmEvent) => evt instanceof Object, [UPDATE_MODEL_EVENT]: (val1: string | number, val2?: BaseEvent) => (isString(val1) || isNumber(val1)) && ((val2 instanceof Object) || val2 === undefined), [INPUT_EVENT]: (val: string | number, evt: InputOnInputEvent) => (isString(val) || isNumber(val)) && evt instanceof Object, } export type InputEmits = typeof inputEmits