mask
输入会自动将用户输入转换为匹配提供的格式。如果使用得当,遮罩输入可以通过消除所需值的任何模糊性(例如电话号码或社会保障号码)来提供改善的用户体验。
遮罩是输入的期望格式。它被传递给 mask
属性,然后解析为令牌。遮罩包括:
遮罩输入带有 4 个内置令牌:
h
- 接受一个十六进制字符(0-9a-fA-F
)。#
- 接受一个数字字符。a
- 接受一个字母字符。*
- 接受任何字符。如果你需要在你的遮罩中将内置令牌之一用作字符串字面量,你可以用 \
来转义它们。这里我们正在转义井号 #
以在我们的十六进制颜色中使用:
<FormKit mask="\#hhhhhh" type="mask" />
遮罩输入支持 3 种输入模式:
默认情况下,当输入时,遮罩的字符会自动向前移动。这在遮罩已经填充并且你将光标放在输入的开始或附近并开始输入时很明显。当你输入时,光标后面的字符会被"移动"。然而,在替换模式下,后续字符会被新值覆盖:
在 select 模式下,等效的 char
类型令牌被分组成可选择的文本范围。FormKit 在点击或聚焦输入时自动选择这些文本范围。当用户正在输入时,这些选择范围被保持。当恰当使用时,这会产生一个清晰的用户体验,因为用户知道他们预期输入什么值。
此外,当输入处于 select 模式时,用户可以使用箭头或 tab 键将他们的焦点从一个选择范围移动到另一个:
selectDirection
令牌属性控制新字符流入选定范围的方向。你可以使用 selectFill
属性将"空"选择字符填充为预定的值(如前导零 "0")。参见令牌属性。
如果一个模式可以在同一位置接受字母_或_数字呢?创建新令牌相对简单。有两种类型的令牌:
char
接受一个单一字符。enum
接受来自可能值数组的任何字符串。创建新令牌必须定义以下属性:
{
/**
* 令牌的类型。可以是 `char` 或 `enum`。
*/
type: 'char',
/**
* 从掩码中解析出的令牌。
*/
token: 'z',
/**
* 当 `show-mask` 启用时,在输入中显示的占位符字符。
*/
placeholder: '_',
/**
* 使用 `select` 模式时,确定新字符的流向。
*/
selectDirection: 'left',
/**
* (仅对 `char` 类型)。描述可以出现在此插槽中的字符类型的正则表达式。此模式将针对单个字符进行评估 - 不在整个字符串的上下文中。
*/
pattern: /[A-Za-z0-9]/,
/**
* (仅对 `char` 类型,可选)。在选择模式下,用于“填充”选择范围的可选字符。例如,将 selectFill 设置为 "0" 可以帮助处理数字,产生前导零,如 "001"。
*/
selectFill: "0",
/**
* (仅对 `enum` 类型)。可能值的数组。
*/
values: [
'March',
'April',
'May'
],
}
例如,一个新的接受字母和数字的令牌,并由掩码字符串中的字母 z
表示,看起来像这样:
{
type: 'char',
token: 'z',
pattern: /[A-Za-z0-9]/,
placeholder: '_',
selectDirection: 'left',
}
您定义的任何 placeholder
都不应匹配在令牌定义中提供的正则表达式 pattern
。
要将新令牌传递给掩码输入,您可以使用 tokens
prop,它期望一个键与 token
属性匹配的对象。例如,我们在上面的例子中的新令牌可以直接应用:
要全局注册您的掩码令牌,扩展您的全局 FormKit 配置的 config
属性:
除了创建新的令牌,tokens
属性还可以修改现有的令牌。提供给 tokens
属性的任何值都将合并到该输入的现有令牌中。例如,数字令牌(#
)默认没有 selectFill
。要添加一个,只需扩展它:
char
令牌接受一个单字符。为了让一个字符被接受,它必须匹配 token.pattern
正则表达式。四个内置令牌(h
,#
,a
和 *
)都是 char
类型的令牌。
在 select
模式下,char
令牌被组合成一个选择范围。
一个 char
令牌应该只代表 1 个字符,它的占位符也应该只有一个字符的长度。
枚举令牌允许在预定义的选项集中进行变长掩码。当用户开始输入时,枚举令牌的值将更改为第一个匹配的值,选择范围将反映当前未匹配的字符。在实践中,这就像是针对特定令牌的自动完成。此外,用户可以通过按上/下箭头键来循环浏览给定令牌的可用选项。
一个带有自动完成月份名称的日期可以用枚举很好地表示:
枚举令牌只在 select
模式下支持。当在掩码字符串中找到任何 enum
令牌时,输入的 mode
将被强制设置为 select
。
组是一种将多个掩码字符视为一个单元的方法。你可以通过在所需的掩码字符周围添加 {}
来创建一个组:
<FormKit mask="id{-a#a}" type="mask" />
<!-- "-a#a" 是组 -->
本身,组不会做任何事情,除非你定义组选项。
组选项允许你使用管道 |
后跟选项名称和任何参数,将功能应用到整个组。可用的选项有:
在组内定义的占位符具有比在令牌定义中定义的占位符更高的特异性,并将覆盖它。
可以通过使用冒号将参数传递给组选项,例如 placeholder:+
,其中加号 +
被传递给 placeholder
选项。
你可以将组选项串在一起:
组不能在选择模式中使用。将会抛出异常。
你可以通过使用 prefix
和 suffix
属性来确保某些字符始终出现在输入的开头或结尾:
你的前缀和后缀内容不能匹配掩码。例如,如果你的掩码有一个数字令牌 #
,你的前缀/后缀不能包含数字。
在特定情况下,你可能希望反向运行你的掩码。掩码将测试用户输入是否从右到左满足掩码。这在货币类型的输入中很常见,可以通过添加 reverse
属性来应用:
反向运行掩码只在移位模式下工作。
一个掩码的值在用户填满整个模式之前不被认为是 "完整" 的。在此之前,FormKit 将认为输入的值是 "空" 的。这使得它方便与像 required
这样的验证规则一起使用。然而,如果你愿意接受不完整的值,你可以通过 allow-incomplete
属性来实现:
默认情况下,掩码输入的值包括通过 mask
属性提供的格式。然而,如果你想要原始的未掩码值,即删除字符串字面量的值,你可以使用 unmask-value
属性:
默认情况下,mask
输入显示每个令牌的占位符字符。你可以通过 show-mask
属性禁用此行为(除在选择模式中),同时仍然自动应用格式:
默认情况下,遮罩的值通过其输入元素的值显示。虽然这个功能"开箱即用",但它不允许文本在样式上进行区分。例如,如果遮罩的"字面"部分看起来与"占位符"部分不同,那就好了。
为了实现这种效果,你可以启用一个覆盖层
,它会渲染直接位于输入本身上方的DOM元素。输入内的文本仍然存在,但它会变得透明。通常,必要的覆盖层定位样式会自动为你应用。
覆盖层包含4个可能的部分,你可以在这些部分上定位你的样式:
.formkit-overlay-literal
或 overlay-literal-class
).formkit-overlay-placeholder
或 overlay-placeholder-class
).formkit-overlay-enum
或 overlay-enum-class
).formkit-overlay-char
或 overlay-char-class
)默认的创世纪主题自动支持覆盖层,并将浅灰色应用于占位符。如果你没有使用创世纪,请确保inner
部分被定位(如position: relative
)。
Prop | Type | 默认 | 描述 |
---|---|---|---|
allow-incomplete | boolean | false | 默认情况下,遮罩输入的值为空,直到模式完成。此属性允许输入使用不完整的值。 |
mask | string | none | 要应用的遮罩。这是由令牌(如“#”)和字面字符串值组成的字符串。 |
mode | string | shift | 确定遮罩输入的操作方式。选项有shift 、replace 和select 。 |
overlay | boolean | false | 渲染模仿文本输入的DOM元素,以允许在遮罩的样式化中进行区分。 |
prefix | string | none | 始终出现在输入开头的字符。 |
reverse | boolean | false | 从右到左运行遮罩。 |
show-mask | boolean | true | 显示模式占位符的实时表示,作为输入的内部值。 |
suffix | string | none | 始终出现在输入末尾的字符。 |
tokens | Object | {} | 添加新的令牌或修改现有的令牌。 |
unmask-value | boolean | false | 默认情况下,输入的值与显示的值(带格式)相同。如果此属性设置为true,字符串字面值将从值中移除。 |
显示 通用 props | |||
config | Object | {} | 提供给 input 的节点和此输入的任何后代节点的配置选项。 |
delay | Number | 20 | 在调度 commit hook 前,输入值的去抖动毫秒数。 |
dirtyBehavior | string | touched | 确定此输入的“dirty”标志设置方式。可以设置为 touched 或 compare — 默认为 touched ,性能更好,但无法检测表单是否再次匹配其初始状态。 |
errors | Array | [] | 要在此字段上显示的错误消息的字符串数组。 |
help | String | '' | 帮助文本与输入关联的文本。 |
id | String | input_{n} | 输入的唯一标识符。提供一个 id 还可以全局访问输入的节点。 |
ignore | Boolean | false | 防止将输入包含在任何父级(组、列表、表单等)中。在仅用于 UI 而不是实际值的情况下非常有用。 |
index | Number | undefined | 如果父级是列表,允许在给定索引处插入输入。如果输入的值未定义,它将继承该索引位置的值。如果它有一个值,它将在给定索引处将其插入到列表的值中。 |
label | String | '' | 与输入关联的 label 元素的文本。 |
name | String | input_{n} | 输入的名称,在数据对象中唯一标识。在一组字段中应该是唯一的。 |
parent | FormKitNode | contextual | 默认情况下,父级是包装组、列表或表单,但此属性允许显式分配父级节点。 |
prefix-icon | String | '' | 指定放置在 prefixIcon 部分的 图标。 |
preserve | boolean | false | 在输入卸载时,在父组、列表或表单上保留输入的值。 |
preserve-errors | boolean | false | 默认情况下,使用 setErrors 在输入上设置的错误会在输入时自动清除,将此属性设置为 true 可以保留错误,直到明确清除为止。 |
sections-schema | Object | {} | 一个包含部分键和模式部分值的对象,其中每个模式部分应用于相应的部分。 |
suffix-icon | String | '' | 指定放置在 suffixIcon 部分的 图标。 |
type | String | text | 要从库中渲染的输入类型。 |
validation | String, Array | [] | 要应用于输入的 验证 规则。 |
validation-visibility | String | blur | 确定何时显示输入的验证失败规则。有效值为 blur 、dirty 和 live 。 |
validation-label | String | {label prop} | 确定在验证错误消息中使用的标签,默认情况下,如果可用,则使用 label 属性,否则使用 name 属性。 |
validation-rules | Object | {} | 附加的自定义验证规则,可用于验证 prop。 |
value | Any | undefined | 为输入和/或其子元素提供初始值。不是响应式的。可以种子 整个组(表单)和列表。 |
您可以通过使用该部分的"key"来定位输入的特定部分,从而可以修改该部分的类、HTML(通过:sections-schema
)或内容(通过插槽))。了解更多关于部分的信息,请点击这里。
Section-key | 描述 |
---|---|
outer | 最外层的包装元素。 |
wrapper | 标签和输入周围的包装器。 |
label | 输入的标签。 |
prefix | 默认情况下没有输出,但允许直接在输入元素之前放置内容。 |
prefixIcon | 输出在前缀部分之前放置一个图标的元素。 |
inner | 实际输入元素周围的包装器。 |
suffix | 默认情况下没有输出,但允许直接在输入元素之后放置内容。 |
suffixIcon | 输出在后缀部分之后放置一个图标的元素。 |
input | 输入元素本身。 |
help | 包含帮助文本的元素。 |
messages | 包装所有消息的容器。 |
message | 包含消息的元素(或多个元素) - 最常见的是验证和错误消息。 |