输入控件ui/input
所有可输入控件的抽象基类。内置表单验证功能。
基本用法
import { VNode, render } from "ui/control";
import Input from "ui/input";
render(
__root__,
<Input type="text"></Input>
);
验证
建议为输入域添加验证,及时向用户反馈输入错误,改进体验。
内置验证
所有输入域都可直接添加以下内置验证字段。
对应的验证失败提示信息可通过 字段名Message
指定。
验证字段 | 说明 | 示例 |
---|---|---|
required | 必填字段 | true |
min | 最小值 | 1 |
max | 最大值 | 100 |
minLength | 最小长度 | 1 |
maxLength | 最大长度 | 100 |
pattern | 匹配指定正则表达式 | /^\d+$/ |
import { VNode, render } from "ui/control";
import Input from "ui/input";
render(
__root__,
<Input type="text" pattern={/^\d+$/} patternMessage="请输入数字"></Input>
);
验证事件
使用 validateEvent
指定何时触发验证。
import { VNode, render } from "ui/control";
import Input from "ui/input";
render(
__root__,
<div>
<Input type="text" pattern={/^\d+$/} patternMessage="请输入数字" validateEvent="input"></Input>
</div>
);
也可以直接调用 input.reportValidity()
手动触发验证。
import { VNode, render, from } from "ui/control";
import Input from "ui/input";
render(
__root__,
<div>
<Input id="input_customValidate" type="text" pattern={/^\d+$/} patternMessage="请输入数字" validateEvent={null}></Input>
<button onclick="from(input_customValidate).reportValidity()">验证</button>
</div>
);
自定义验证
绑定 onValidate
事件实现自定义验证。
验证函数接收一个参数 value
,表示当前输入域的值。
如果验证通过,验证函数应返回空字符串或 true
。
如果验证失败,验证函数应返回包含错误信息的字符串 或 false
(返回 false
时使用 validateErrorMessage
字段的值作为错误提示信息)。
import { VNode, render } from "ui/control";
import Input from "ui/input";
render(
__root__,
<Input type="text" onValidate={myValidate}></Input>
);
function myValidate(value) {
return value > 20 ? "" : "请输入大于 20 的值";
}
验证函数也可返回一个包含更多信息的验证结果对象:
function myValidate(value) {
return {
valid: true,
status: "success",
message:"验证成功"
}
}
验证函数也可返回一个 Promise
对象,表示该验证是异步的。
import { VNode, render } from "ui/control";
import Input from "ui/input";
render(
__root__,
<Input type="text" onValidate={myValidate}></Input>
);
function myValidate(value) {
return new Promise(resolve => {
setTimeout(() => {
resolve(value > 20 ? "" : "请输入大于 20 的值") ;
}, 3000);
});
}
注意
Promise
对象仅最新浏览器支持,如果需要兼容老浏览器,建议首先引入JS 兼容补丁组件。
如何:调用后端接口验证
import { VNode, render } from "ui/control";
import ajax from "web/ajax";
import Input from "ui/input";
render(
__root__,
<Input type="text" onValidate={myValidate} validateStartMessage="正在查询服务器..."></Input>
);
function myValidate(value) {
return new Promise(resolve => {
ajax({
type: "POST",
url: "后端接口地址",
data: {
"value": value // 传递给后端的数据
},
success: data => {
if (data.code == 0) {
resolve("");
} else {
resolve("服务端验证失败:" + data.message);
}
}
});
});
}
错误提示
验证完成后,input.status
会被更新为最新的状态值(状态值可能为:info
、success
、warning
或 error
)。
默认地,input.status
内部会追加 .{statusClassPrefix}-{状态}
CSS 类到组件根节点。
<style>
.hello-error {
color: red;
}
</style>
<script></script>
如果需要屏蔽成功状态提示,可设置 hideSuccess
为 true
。
假如输入域后紧跟了一个 .x-tipbox
或 .x-tip
元素,则验证结果会自动在这些节点显示。
import { VNode, render } from "ui/control";
import Input from "ui/input";
render(
__root__,
<div>
<Input type="text" onValidate={value => value > 20 ? "" : "请输入大于 20 的值"}></Input>
<span class="x-tip">输入一个数值</span>
</div>
);
import { VNode, render } from "ui/control";
import Input from "ui/input";
render(
__root__,
<div>
<Input type="text" onValidate={value => value > 20 ? "" : "请输入大于 20 的值"}></Input>
<span class="x-tipbox"></span>
</div>
);
假如找不到 .x-tipbox
或 .x-tip
元素,每个输入域内部会创建一个对应的工具提示组件用于报告错误信息。
可以使用 validityToolTipOptions
属性设置提示框的附加属性。
import { VNode, render, from } from "ui/control";
import Input from "ui/input";
render(
__root__,
<div>
<Input type="text" pattern={/^\d+$/} patternMessage="请输入数字" validityToolTipOptions={{align: "right"}}></Input>
</div>
);
绑定 onReportValidity
事件可自定义报告验证结果的方案。
如果事件函数返回 false
将禁用默认的错误报告。
import { VNode, render } from "ui/control";
import Input from "ui/input";
render(
__root__,
<div>
<Input type="text" pattern={/^\d+$/} patternMessage="请输入数字" onReportValidity={e => { console.log(e); return false; }></Input>
</div>
);
手动验证
程序中可以使用 input.checkValidity().valid
获取当前的验证状态。
使用 input.setCustomValidity("message")
手动报告一个验证信息。
如果在表单布局组件中使用输入域,则表单组件会自动验证内部的所有输入域。
创建输入域
所有可输入数据的表单控件都应该继承自 Input
。
无论是什么输入控件,用户输入的值统一通过 value
读写。value
属性可以是 JSON 对象。
子类将自动拥有验证功能。子类可以重写 validate
添加内置的验证逻辑。
import { VNode, render } from "ui/control";
import Input from "ui/input";
class MyInput extends Input {
render(){
return <textarea></textarea>;
}
validate(value) {
var r = super.validate(value);
if(r) return r;
if (value.length % 2 == 1) {
return "必须输入偶数个字";
}
return "";
}
}
render(
__root__,
<MyInput />
);
API
Input 类
继承自:Control
表示一个输入控件。
字段 | 类型 | 描述 | 继承自 |
---|---|---|---|
⮞
input
: HTMLInputElement
(只读)内部关联的输入框元素。 |
HTMLInputElement
|
(只读)内部关联的输入框元素。 |
— |
⮞
name
: string
名字。 |
string
|
名字。 |
— |
⮞
value
: any
值。 |
any
|
值。 |
— |
⮞
defaultValue
: any
默认值。 |
any
|
默认值。 |
— |
⮞
type
: string
输入框的类型。 |
string
|
输入框的类型。 |
— |
⮞
placeholder
: string
未输入内容时的占位符。 |
string
|
未输入内容时的占位符。 |
— |
⮞
disabled
: boolean
是否禁用。 |
boolean
|
是否禁用。 |
— |
⮞
readOnly
: boolean
是否只读。 |
boolean
|
是否只读。 |
— |
⮞
tabIndex
: number
TAB 键切换顺序。 |
number
|
TAB 键切换顺序。 |
— |
⮞
tabStop
: boolean
是否允许 TAB 键停靠。 |
boolean
|
是否允许 TAB 键停靠。 |
— |
⮞
onCopy
: (e: ClipboardEvent, sender: Input) => void
|
function
|
复制事件。 |
— |
⮞
onCut
: (e: ClipboardEvent, sender: Input) => void
|
function
|
剪切事件。 |
— |
⮞
onPaste
: (e: ClipboardEvent, sender: Input) => void
|
function
|
粘贴事件。 |
— |
⮞
onBeforeCopy
: (e: ClipboardEvent, sender: Input) => void
|
function
|
即将复制事件。 |
— |
⮞
onBeforeCut
: (e: ClipboardEvent, sender: Input) => void
|
function
|
即将剪切事件。 |
— |
⮞
onBeforePaste
: (e: ClipboardEvent, sender: Input) => void
|
function
|
即将粘贴事件。 |
— |
⮞
onFocus
: (e: FocusEvent, sender: Input) => void
|
function
|
获取焦点事件。 |
— |
⮞
onBlur
: (e: FocusEvent, sender: Input) => void
|
function
|
失去焦点事件。 |
— |
⮞
onFocusIn
: (e: FocusEvent, sender: Input) => void
|
function
|
当前元素和子元素获取焦点事件。 |
— |
⮞
onFocusOut
: (e: FocusEvent, sender: Input) => void
|
function
|
当前元素和子元素失去焦点事件。 |
— |
⮞
onInput
: (e: Event, sender: Input) => void
|
function
|
输入事件。 |
— |
⮞
onChange
: (e: Event, sender: Input) => void
|
function
|
更改事件。 |
— |
⮞
onKeyDown
: (e: KeyboardEvent, sender: Input) => void
|
function
|
键盘按下事件。 |
— |
⮞
onKeyPress
: (e: KeyboardEvent, sender: Input) => void
|
function
|
键盘点击事件。 |
— |
⮞
onKeyUp
: (e: KeyboardEvent, sender: Input) => void
|
function
|
键盘按上事件。 |
— |
⮞
onEnter
: (e: KeyboardEvent, sender: Input) => void
回车事件。 |
function
|
回车事件。 |
— |
⮞
status
: Status
控件状态。 |
Status
|
控件状态。 |
— |
⮞
statusClassPrefix
: string
控件状态前缀。 |
string
|
控件状态前缀。 |
— |
⮞
hideSuccess
: boolean
是否隐藏验证成功状态。 |
boolean
|
是否隐藏验证成功状态。 |
— |
⮞
noValidate
: boolean
是否禁用验证。 |
boolean
|
是否禁用验证。 |
— |
⮞
validateEvent
: string
触发验证的事件。 |
string
|
触发验证的事件。 |
— |
⮞
required
: boolean
字段是否必填。 |
boolean
|
字段是否必填。 |
— |
⮞
requiredMessage
: string
字段不满足必填时的提示文案。 |
string
|
字段不满足必填时的提示文案。 |
— |
⮞
maxLength
: number
最大长度。-1 表示不限制。 |
number
|
最大长度。-1 表示不限制。 |
— |
⮞
maxLengthMessage
: string
字段不满足最大长度时的提示文案。 |
string
|
字段不满足最大长度时的提示文案。 |
— |
⮞
minLength
: number
最小长度。-1 表示不限制。 |
number
|
最小长度。-1 表示不限制。 |
— |
⮞
minLengthMessage
: string
字段不满足最小长度时的提示文案。 |
string
|
字段不满足最小长度时的提示文案。 |
— |
⮞
max
: any
最大值。 |
any
|
最大值。 |
— |
⮞
maxMessage
: string
字段不满足最大值时的提示文案。 |
string
|
字段不满足最大值时的提示文案。 |
— |
⮞
min
: any
最小值。 |
any
|
最小值。 |
— |
⮞
minMessage
: string
字段不满足最小值时的提示文案。 |
string
|
字段不满足最小值时的提示文案。 |
— |
⮞
pattern
: RegExp
匹配格式的正则表达式。 |
RegExp
|
匹配格式的正则表达式。 |
— |
⮞
patternMessage
: string
字段不满足格式时的提示文案。 |
string
|
字段不满足格式时的提示文案。 |
— |
⮞
validateErrorMessage
: string
验证失败的提示文案。 |
string
|
验证失败的提示文案。 |
— |
⮞
validateStartMessage
: string
开始异步验证的提示文案。 |
string
|
开始异步验证的提示文案。 |
— |
⮞
validateStartMessagePrefix
: string
开始异步验证的提示文案前缀。 |
string
|
开始异步验证的提示文案前缀。 |
— |
⮞
validateInfoMessagePrefix
: string
验证信息状态的提示文案前缀。 |
string
|
验证信息状态的提示文案前缀。 |
— |
⮞
validateErrorMessagePrefix
: string
验证失败状态的提示文案前缀。 |
string
|
验证失败状态的提示文案前缀。 |
— |
⮞
validateWarningMessagePrefix
: string
验证警告状态的提示文案前缀。 |
string
|
验证警告状态的提示文案前缀。 |
— |
⮞
validateSuccessMessagePrefix
: string
验证成功状态的提示文案前缀。 |
string
|
验证成功状态的提示文案前缀。 |
— |
⮞
willValidate
: boolean
(只读)判断当前输入域是否需要验证。 |
boolean
|
(只读)判断当前输入域是否需要验证。 |
— |
⮞
validateDelay
: number
验证事件触发后延时验证的毫秒数。 |
number
|
验证事件触发后延时验证的毫秒数。 |
— |
⮞
revalidateDelay
: number
重新验证事件触发后延时验证的毫秒数。 |
number
|
重新验证事件触发后延时验证的毫秒数。 |
— |
⮞
onValidate
: (value: any, sender: Input) => ValidityResult
验证事件。 |
function
|
验证事件。 |
— |
⮞
onReportValidity
: (validityResult: NormalizedValidityResult, sender: Input) => boolean | void
报告验证结果事件。 |
function
|
报告验证结果事件。 |
— |
⮞
validityToolTipOptions
: Partial<ToolTip>
验证工具提示的选项。 |
Partial<ToolTip>
|
验证工具提示的选项。 |
— |
⮞
readyState
: ControlState
|
ControlState
|
获取当前控件的渲染状态。 |
Control |
⮞
elem
: HTMLElement
|
HTMLElement
|
关联的元素。 |
Control |
⮞
vNode
: VNode
|
VNode
|
(保护的)获取当前控件关联的虚拟节点。 |
Control |
⮞
sourceVNode
: VNode
|
VNode
|
获取创建该控件使用的源虚拟节点。 |
Control |
⮞
alwaysUpdate
: boolean
|
boolean
|
控件是否使用主动更新模式。 |
Control |
⮞
body
: HTMLElement
|
HTMLElement
|
(只读)获取用于包含子控件和节点的根元素。 |
Control |
⮞
duration
: number = 200
|
number
|
渐变的持续毫秒数。如果为 0 则不使用渐变。 |
Control |
⮞
class
: string
|
string
|
CSS 类名。 |
Control |
⮞
style
: string | { [key: string]: string | number; }
|
string | object
|
控件样式。 |
Control |
⮞
id
: string
|
string
|
控件序号。 |
Control |
⮞
content
: NodeLike
|
NodeLike
|
控件内容。 |
Control |
⮞
onSelectStart
: (e: Event, sender: Input) => void
|
function
|
选择开始事件。 |
Control |
⮞
onClick
: (e: MouseEvent, sender: Input) => void
|
function
|
点击事件。 |
Control |
⮞
onAuxClick
: (e: MouseEvent, sender: Input) => void
|
function
|
中键点击事件。 |
Control |
⮞
onDblClick
: (e: MouseEvent, sender: Input) => void
|
function
|
双击事件。 |
Control |
⮞
onContextMenu
: (e: PointerEvent, sender: Input) => void
|
function
|
右键菜单事件。 |
Control |
⮞
onMouseDown
: (e: MouseEvent, sender: Input) => void
|
function
|
鼠标按下事件。 |
Control |
⮞
onMouseUp
: (e: MouseEvent, sender: Input) => void
|
function
|
鼠标按上事件。 |
Control |
⮞
onMouseOver
: (e: MouseEvent, sender: Input) => void
|
function
|
鼠标移入事件。 |
Control |
⮞
onMouseOut
: (e: MouseEvent, sender: Input) => void
|
function
|
鼠标移开事件。 |
Control |
⮞
onMouseEnter
: (e: MouseEvent, sender: Input) => void
|
function
|
鼠标进入事件。 |
Control |
⮞
onMouseLeave
: (e: MouseEvent, sender: Input) => void
|
function
|
鼠标离开事件。 |
Control |
⮞
onMouseMove
: (e: MouseEvent, sender: Input) => void
|
function
|
鼠标移动事件。 |
Control |
⮞
onWheel
: (e: WheelEvent, sender: Input) => void
|
function
|
鼠标滚轮事件。 |
Control |
⮞
onScroll
: (e: UIEvent, sender: Input) => void
|
function
|
滚动事件。 |
Control |
⮞
onTouchStart
: (e: TouchEvent, sender: Input) => void
|
function
|
触摸开始事件。 |
Control |
⮞
onTouchMove
: (e: TouchEvent, sender: Input) => void
|
function
|
触摸移动事件。 |
Control |
⮞
onTouchEnd
: (e: TouchEvent, sender: Input) => void
|
function
|
触摸结束事件。 |
Control |
⮞
onTouchCancel
: (e: TouchEvent, sender: Input) => void
|
function
|
触摸撤销事件。 |
Control |
⮞
onPointerEnter
: (e: PointerEvent, sender: Input) => void
|
function
|
指针进入事件。 |
Control |
⮞
onPointerLeave
: (e: PointerEvent, sender: Input) => void
|
function
|
指针离开事件。 |
Control |
⮞
onPointerOver
: (e: PointerEvent, sender: Input) => void
|
function
|
指针移入事件。 |
Control |
⮞
onPointerOut
: (e: PointerEvent, sender: Input) => void
|
function
|
指针移开事件。 |
Control |
⮞
onPointerDown
: (e: PointerEvent, sender: Input) => void
|
function
|
指针按下事件。 |
Control |
⮞
onPointerMove
: (e: PointerEvent, sender: Input) => void
|
function
|
指针移动事件。 |
Control |
⮞
onPointerUp
: (e: PointerEvent, sender: Input) => void
|
function
|
指针松开事件。 |
Control |
⮞
onPointerCancel
: (e: PointerEvent, sender: Input) => void
|
function
|
指针取消事件。 |
Control |
⮞
onGotPointerCapture
: (e: PointerEvent, sender: Input) => void
|
function
|
指针开始捕获事件。 |
Control |
⮞
onLostPointerCapture
: (e: PointerEvent, sender: Input) => void
|
function
|
指针停止捕获事件。 |
Control |
⮞
Input.locale
: { requiredMessage: string; maxLengthMessage: string; minLengthMessage: string; maxMessage: string; minMessage: string; patternMessage: string; validateErrorMessage: string; validateStartMessage: string; validateStartMessagePrefix: string; validateInfoMessagePrefix: string; validateSuccessMessagePrefix: string; validateWarningMessagePrefix: string; validateErrorMessagePrefix: string; } = {
requiredMessage: `该字段为必填的`,
maxLengthMessage: `该字段最大长度为 {bound},超出 {delta}`,
minLengthMessage: `该字段最少长度为 {bound},缺少 {delta}`,
maxMessage: `该字段最大为 {bound}`,
minMessage: `该字段最小为 {bound}`,
patternMessage: `该字段格式不正确`,
validateErrorMessage: `该字段验证未通过`,
validateStartMessage: `正在验证中...`,
validateStartMessagePrefix: `<i class="x-icon x-spin">҉</i> `,
validateInfoMessagePrefix: `<i class="x-icon">🛈</i> `,
validateSuccessMessagePrefix: `<i class="x-icon">✓</i> `,
validateWarningMessagePrefix: `<i class="x-icon">⚠</i> `,
validateErrorMessagePrefix: `<i class="x-icon">❗</i> `
}
本地化提示文案。 |
object
|
本地化提示文案。 |
— |
方法 | 描述 | 继承自 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
⮞
isHidden()():
判断输入域样式是否被隐藏。 返回值类型: 如果控件或其父元素被隐藏则返回 true,否则返回 false。 |
判断输入域样式是否被隐藏。 |
— | ||||||||
⮞
handleValidateEvent()():
(保护的)处理验证事件。 返回值类型: |
(保护的)处理验证事件。 |
— | ||||||||
⮞
checkValidity()():
验证当前输入域。 返回值类型: 返回验证结果。如果正在执行异步验证则返回一个确认对象。 |
验证当前输入域。 |
— | ||||||||
⮞
validate(value)(value:
(保护的)当被子类重写时负责验证指定的值。
返回值返回验证结果。如果正在执行异步验证则返回一个确认对象。 |
(保护的)当被子类重写时负责验证指定的值。 |
— | ||||||||
⮞
normlizeValidityResult(r)(r:
(保护的)规范化验证结果对象。
返回值类型: |
(保护的)规范化验证结果对象。 |
— | ||||||||
⮞
reportValidity()():
向用户报告验证结果。 返回值类型: 返回验证结果。如果正在执行异步验证则返回一个确认对象。 |
向用户报告验证结果。 |
— | ||||||||
⮞
setCustomValidity(validityResult)(validityResult:
设置自定义的验证消息。
返回值类型: |
设置自定义的验证消息。 |
— | ||||||||
⮞
createValidityToolTip()():
|
(保护的)当被子类重写时负责创建当前输入框的默认验证提示。 |
— | ||||||||
⮞
reset()():
重置当前输入域。 返回值类型: |
重置当前输入域。 |
— | ||||||||
⮞
focus()():
令当前控件获得焦点。 返回值类型: |
令当前控件获得焦点。 |
— | ||||||||
⮞
blur()():
令当前控件失去焦点。 返回值类型: |
令当前控件失去焦点。 |
— | ||||||||
⮞
render()():
|
(保护的)(已覆盖)当被子类重写时负责返回当前控件的虚拟节点。 |
Control |
||||||||
⮞
init()():
|
(保护的)(已覆盖)当被子类重写时负责在关联元素后初始化当前控件。 |
Control |
||||||||
⮞
layout(changes)(changes:
|
(已覆盖)重新布局当前控件。 |
Control |
||||||||
⮞
uninit()():
|
(保护的)当被子类重写时负责在元素被取消关联前取消初始化当前控件。 |
Control |
||||||||
⮞
update()():
|
重新渲染当前控件。 |
Control |
||||||||
⮞
invalidate()():
|
使当前控件无效并在下一帧重新渲染。 |
Control |
||||||||
⮞
renderTo(parent, ...)(parent:
|
将当前控件渲染到指定的父控件或节点。 |
Control |
||||||||
⮞
find(selector)(selector:
|
在当前控件查找指定的子控件或节点。 |
Control |
||||||||
⮞
query(selector)(selector:
|
在当前控件查找匹配的所有子控件或节点。 |
Control |
ValidityResult 类型
表示验证的结果。
同:string | boolean | Partial<NormalizedValidityResult> | Promise<string | boolean | Partial<NormalizedValidityResult>>
NormalizedValidityResult 接口
表示已格式化的验证结果。