Teal TealUI

输入控件ui/input

所有可输入控件的抽象基类。内置表单验证功能。

基本用法
验证
内置验证
验证事件
自定义验证
错误提示
手动验证
创建输入域
API
Input 类
ValidityResult 类型
NormalizedValidityResult 接口

基本用法

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 会被更新为最新的状态值(状态值可能为:infosuccesswarningerror)。

默认地,input.status 内部会追加 .{statusClassPrefix}-{状态} CSS 类到组件根节点。

<style>
    .hello-error {
        color: red;
    }
</style>
<script>
import { VNode, render } from "ui/control";
import Input from "ui/input";

render(
    __root__,
    <div>
        <Input type="text" pattern={/^\d+$/} statusClassPrefix="hello-"></Input>
    </div>
);
</script>

如果需要屏蔽成功状态提示,可设置 hideSuccesstrue

假如输入域后紧跟了一个 .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>
        &nbsp;
        <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> &nbsp; <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

获取当前控件的渲染状态。

继承自

Control

ControlState

获取当前控件的渲染状态。

Control
elem : HTMLElement

关联的元素。

继承自

Control

HTMLElement

关联的元素。

Control
vNode : VNode

(保护的)获取当前控件关联的虚拟节点。

继承自

Control

VNode

(保护的)获取当前控件关联的虚拟节点。

Control
sourceVNode : VNode

获取创建该控件使用的源虚拟节点。

继承自

Control

VNode

获取创建该控件使用的源虚拟节点。

Control
alwaysUpdate : boolean

控件是否使用主动更新模式。

继承自

Control

boolean

控件是否使用主动更新模式。

Control
body : HTMLElement

(只读)获取用于包含子控件和节点的根元素。

继承自

Control

HTMLElement

(只读)获取用于包含子控件和节点的根元素。

Control
duration : number = 200

渐变的持续毫秒数。如果为 0 则不使用渐变。

继承自

Control

number

渐变的持续毫秒数。如果为 0 则不使用渐变。

Control
class : string

CSS 类名。

继承自

Control

string

CSS 类名。

Control
hidden : boolean

是否隐藏。

继承自

Control

boolean

是否隐藏。

Control
style : string | { [key: string]: string | number; }

控件样式。

继承自

Control

string | object

控件样式。

Control
id : string

控件序号。

继承自

Control

string

控件序号。

Control
content : NodeLike

控件内容。

继承自

Control

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">&#10071;</i> ` }

本地化提示文案。

object

本地化提示文案。

方法 描述 继承自
isHidden()():boolean

判断输入域样式是否被隐藏。

返回值

类型:boolean

如果控件或其父元素被隐藏则返回 true,否则返回 false。

判断输入域样式是否被隐藏。

handleValidateEvent()():void

(保护的)处理验证事件。

返回值

类型:void

(保护的)处理验证事件。

checkValidity()():NormalizedValidityResult | Promise<NormalizedValidityResult>

验证当前输入域。

返回值

类型:NormalizedValidityResult | Promise<NormalizedValidityResult>

返回验证结果。如果正在执行异步验证则返回一个确认对象。

验证当前输入域。

validate(value)(value:this["value"]):ValidityResult

(保护的)当被子类重写时负责验证指定的值。

参数 类型 描述 默认值
value* this["value"]

返回值

类型:ValidityResult

返回验证结果。如果正在执行异步验证则返回一个确认对象。

(保护的)当被子类重写时负责验证指定的值。

normlizeValidityResult(r)(r:ValidityResult):NormalizedValidityResult | Promise<NormalizedValidityResult>

(保护的)规范化验证结果对象。

参数 类型 描述 默认值
r* ValidityResult

返回值

类型:NormalizedValidityResult | Promise<NormalizedValidityResult>

(保护的)规范化验证结果对象。

reportValidity()():NormalizedValidityResult | Promise<NormalizedValidityResult>

向用户报告验证结果。

返回值

类型:NormalizedValidityResult | Promise<NormalizedValidityResult>

返回验证结果。如果正在执行异步验证则返回一个确认对象。

向用户报告验证结果。

setCustomValidity(validityResult)(validityResult:string | boolean | Partial<NormalizedValidityResult>):void

设置自定义的验证消息。

参数 类型 描述 默认值
validityResult* string | boolean | Partial<NormalizedValidityResult>

返回值

类型:void

设置自定义的验证消息。

createValidityToolTip()():ToolTip

(保护的)当被子类重写时负责创建当前输入框的默认验证提示。

返回值

类型:ToolTip

(保护的)当被子类重写时负责创建当前输入框的默认验证提示。

reset()():void

重置当前输入域。

返回值

类型:void

重置当前输入域。

focus()():void

令当前控件获得焦点。

返回值

类型:void

令当前控件获得焦点。

blur()():void

令当前控件失去焦点。

返回值

类型:void

令当前控件失去焦点。

render()():VNode

(保护的)

返回值

类型:VNode

继承自

Control

(保护的)(已覆盖)当被子类重写时负责返回当前控件的虚拟节点。

Control
init()():void

(保护的)

返回值

类型:void

继承自

Control

(保护的)(已覆盖)当被子类重写时负责在关联元素后初始化当前控件。

Control
layout(changes)(changes:Changes):void
参数 类型 描述 默认值
changes* Changes

返回值

类型:void

继承自

Control

(已覆盖)重新布局当前控件。

Control
uninit()():void

(保护的)当被子类重写时负责在元素被取消关联前取消初始化当前控件。

返回值

类型:void

继承自

Control

(保护的)当被子类重写时负责在元素被取消关联前取消初始化当前控件。

Control
update()():void

重新渲染当前控件。

返回值

类型:void

继承自

Control

重新渲染当前控件。

Control
invalidate()():void

使当前控件无效并在下一帧重新渲染。

返回值

类型:void

继承自

Control

使当前控件无效并在下一帧重新渲染。

Control
renderTo(parent, ...)(parent:Control | Node, refChild?:Control | Node):void

将当前控件渲染到指定的父控件或节点。

参数 类型 描述 默认值
parent* Control | Node
refChild Control | Node

返回值

类型:void

继承自

Control

将当前控件渲染到指定的父控件或节点。

Control
find(selector)(selector:string):Control | HTMLElement

在当前控件查找指定的子控件或节点。

参数 类型 描述 默认值
selector* string

返回值

类型:Control | HTMLElement

返回子控件或节点。如果找不到则返回 null。

继承自

Control

在当前控件查找指定的子控件或节点。

Control
query(selector)(selector:string):(Control | HTMLElement)[]

在当前控件查找匹配的所有子控件或节点。

参数 类型 描述 默认值
selector* string

返回值

类型:(Control | HTMLElement)[]

返回子控件或节点列表。

继承自

Control

在当前控件查找匹配的所有子控件或节点。

Control

ValidityResult 类型

表示验证的结果。

同:string | boolean | Partial<NormalizedValidityResult> | Promise<string | boolean | Partial<NormalizedValidityResult>>

NormalizedValidityResult 接口

表示已格式化的验证结果。

字段 类型 描述
valid : boolean

验证是否通过。只有验证通过后数据才会提交。一般地仅当 status 为空或者 "success" 时才会验证通过。

boolean

验证是否通过。只有验证通过后数据才会提交。一般地仅当 status 为空或者 "success" 时才会验证通过。

status : Status

验证的结果状态。

Status

验证的结果状态。

prefix : string

提示的信息前缀。

string

提示的信息前缀。

message : string

提示的信息。

string

提示的信息。