虽然您可以自由地单独使用FormKit输入,但通常您会希望将它们分组到一个表单中。要做到这一点,只需将输入包装在<FormKit type="form">中即可。
form类型将主动收集子输入的所有值,使用每个输入的name作为结果数据对象中的属性名(就像组一样)。您还可以像在任何输入上一样使用v-model来读取和写入表单值。
<FormKit type="form">跟踪表单的验证状态,并在任何输入无效时阻止用户提交表单。
为了方便起见,form会自动输出一个提交按钮,并且提供的主题还包括一个加载旋转器。您可以使用submit-label和submit-attrs属性来修改此按钮,或者使用:actions="false"来禁用。您可以将任何FormKit属性传递给submit-attrs。在下面的示例中,我们传递了类、data属性、帮助文本,甚至告诉包含的提交按钮不被忽略:
<FormKit
type="form"
submit-label="更新"
:submit-attrs="{
inputClass: 'my-input-class',
wrapperClass: 'my-wrapper-class',
'data-theme': `dark`,
help: '我的按钮帮助文本',
ignore: false
}"
></FormKit>除了后端功能之外,这是一个具有输入(form、text、email、password)、帮助文本、标签、自定义消息的验证以及错误和提交处理的完整功能表单:
您可以通过为<FormKit type="form">提供value属性来填充整个表单。value属性应该是一个输入名称到输入值的对象对。如果需要双向数据绑定,您也可以使用v-model来填充表单:
请确保要么v-model一个ref,要么v-model一个reactive对象的属性。不要v-model响应式对象本身,因为它会导致意外行为。
通常,表单是通过用户操作(如单击提交按钮或在表单内的文本节点上按下enter键)进行提交的。提交后,表单(按顺序):
@submit-raw事件。submitted状态设置为true,显示任何剩余的验证错误(不考虑validation-visibility)。@submit-invalid事件。@submit事件。@submit处理程序返回一个Promise,则将表单的状态设置为loading,直到它解析。在提交处理程序中使用v-model数据可能会导致意外的表单变化。FormKit会自动为您收集表单数据,因此请使用传递给提交处理程序的表单数据的未绑定副本。
在现代SPA中,表单提交的最常见方法是XHR请求(例如axios或fetch)。FormKit非常适合这个任务:
v-model)和form输入的核心节点作为便利,传递给您的@submit处理程序。loading在context.state.loading处为true,并在genesis主题上显示一个旋转器)。要通过页面请求提交表单,只需省略@submit处理程序。就像原生HTML一样,您还可以提供一个action和可选的method属性。
使用任何标准的HTML方法提交表单(如点击“提交”按钮或在文本输入框上按下“Enter”键)是有效的,但您也可以以编程方式提交表单。有两种方法可以做到这一点:
this.$formkit.submit('form-id')(组合API中的 submitForm('form-id'))。$formkit.submit() 提交node.submit() 提交您还可以通过在表单(或表单内的任何输入)的核心节点上调用 node.submit() 来以编程方式提交表单。要做到这一点,您需要检索核心节点的实例。
在表单中的所有输入通过其验证规则之前,表单将不会提交。
除了不触发提交事件外,还会在提交按钮上方显示一条消息,指示表单仍然不完整。您可以使用 incomplete-message 属性自定义此消息,或者通过将该属性设置为 false 来禁用它。
如果您想在项目中更改所有表单的不完整消息,可以修改 ui.incomplete 的 i18n 本地化消息。
当用户尝试提交包含未通过验证的输入的表单时,将触发 @submit-invalid 事件。
例如,我们可以使用此事件来向用户警告验证规则失败。
表单中所有输入的有效性会自动在上下文对象中进行跟踪。这在创建各种界面时非常有用。例如,如果您希望在所有输入都有效之前禁用提交按钮,可以使用 state.valid 属性来实现。
在上面的示例中,我们从 #default 插槽中提取了上下文对象,但还有其他方法。上下文对象在每个输入的核心节点上的 node.context 属性上可用,并且您可以以多种方式获取输入的节点。
要禁用给定表单中的所有输入,包括提交按钮,可以使用 disabled 属性。
当使用异步的 @submit 处理程序时,FormKit 会在提交处理程序挂起时自动禁用表单(并将状态设置为 loading)。
您可以通过调用 $formkit.reset(formId) 将表单(或任何输入)重置回其初始状态。
当使用组合 API 时,您可以通过从核心中导入它直接访问重置函数:import { reset } from '@formkit/core'。
重要的是要注意,表单的“初始状态”不一定是空表单。您可以在表单上和表单中的各个输入上设置默认的 :value 或 v-model — FormKit 会自动将它们合并在一起以生成您的初始值,并在重置时恢复到此合并状态。
如果您希望使用替代的重置状态,还可以为 reset(formId, initialState) 提供第二个参数。
使用 FormKit,为表单添加前端验证很容易 — 但是关于后端框架产生的错误或您想手动分配的错误呢?您可以将两种类型的错误分配给表单:
可以通过三种方式设置表单错误(适用于整个表单)。
<FormKit type="form"> 上使用 errors 属性。node.setErrors()。$formkit.setErrors() Vue 插件方法。errors 属性与任何 FormKit 输入一样,您可以直接使用 errors 属性分配错误。这些错误始终可见(不受 validation-visibility 影响)。
node.setErrors()使用 node.setErrors 设置表单的错误非常方便,因为您的提交处理程序会将表单的 node 对象作为第二个参数传递。node.setErrors() 接受两个参数 - 一个用于表单错误的数组,一个用于输入错误的键值对象:
$formkit.setErrors()或者,您可以通过为表单指定一个 id 并调用 $formkit.setErrors('id', ['Form error here']) 来直接设置错误。setErrors 方法必须传递表单的 id,然后可以处理 1 或 2 个额外的参数 - 表单错误和输入错误:
默认情况下,使用 setErrors() 在输入上设置的错误在用户更改该输入的值时会自动清除。您可以通过设置 preserve-errors 属性来更改此默认行为。
要清除表单上的所有错误(不考虑 preserve-errors 属性),请调用 node.clearErrors()。
如果您希望默认情况下保留错误,可以通过修改 preserveErrors 配置选项来更改默认行为。这可以在全局范围内或单个表单中完成:
在使用 Vue 3 的组合 API 时,您可以直接从 @formkit/vue 导入 setErrors 和 clearErrors。import { setErrors, clearErrors } from '@formkit/vue'
输入错误(在表单中显示的特定输入的错误)可以通过以下三种方式应用:
errors 属性。input-errors 属性(也适用于组和列表)。$formkit.setErrors() Vue 插件方法(参见上面的示例)。errors 属性在表单上显示错误的最基本方法是使用每个 FormKit 输入上可用的 errors 属性。
input-errors 属性您还可以使用 input-errors 属性方便地为表单中的所有输入(或组或列表)设置错误消息。该属性接受一个错误对象,其中键是输入名称(支持相对节点地址),值是要应用于该输入的错误或错误数组。
默认情况下,表单的验证和错误消息直接放置在表单操作部分的上方。但是,您可以选择通过使用 <FormKitMessages /> 组件在页面上的任何位置渲染这些消息。<FormKitMessages /> 不是全局注册的组件 - 您必须导入它:
import { FormKitMessages } from '@formkit/vue'有两种使用 <FormKitMessages /> 的方法:
在您的表单中的任何位置放置 <FormKitMessages /> 组件,并且表单的消息将自动移动到该位置:
node 手动移动消息要在 DOM 中的任何位置移动消息 - 甚至是表单之外 - 您可以将表单的核心节点作为属性传递给 <FormKitMessages />。在此示例中,我们使用消息创建了一个类似弹出式的提示框:
<FormKitMessages /> 组件有一些额外的配置选项:
| 属性 | 默认值 | 描述 |
|---|---|---|
node | 继承 | 要为其渲染消息的核心节点。默认情况下,这是从节点的父节点继承的(如果存在) |
sectionsSchema | {} | 覆盖内部的 messages 和 message 部分(与其他输入的消息部分具有相同的默认结构) |
defaultPosition | false | 默认情况下,FormKitMessages 将渲染的消息移动到新位置。如果您希望在两个位置都渲染消息,请将此属性设置为 true。 |
当输入框从表单中卸载时,例如使用 v-if 时,键和值将从表单的数据中删除。然而,在某些情况下,即使输入框被移除,保留键/值对可能更可取。可以通过使用 preserve 属性来实现:
表单在技术上被认为是 input 类型,因此它们共享许多标准输入框使用的通用属性。
| Prop | Type | 默认 | 描述 |
|---|---|---|---|
| disabled | Boolean | false | Disables the form submit button and all the inputs in the form. |
| incomplete-message | String/Boolean | {locale}.ui.incomplete | The message that is shown to near the submit button when a user attempts to submit a form, but not all inputs are valid. |
| submit-attrs | Object | {} | Attributes or props that should be passed to the built-in submit button. |
| submit-behavior | String | disabled | Async submit handlers automatically disable the form while pending, you can change this by setting this prop to 'live'. |
| submit-label | String | Submit | The label to use on the built-in submit button. |
| actions | Boolean | true | Whether or not to include the actions bar at the bottom of the form (ex. you want to remove the submit button and use your own, set this to false). |
| 显示 通用 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 | 为输入和/或其子元素提供初始值。不是响应式的。可以种子 整个组(表单)和列表。 |
| Section-key | 描述 |
|---|---|
| form | 负责渲染 form 标签并监听提交事件。 |
| actions | 负责在表单底部包含表单操作,如提交按钮。 |
| submit | 负责提交按钮 - 默认情况下是一个 FormKit 输入类型 submit。 |
| 显示 通用 section keys | |
| outer | 最外层的包装元素。 |
| wrapper | 标签和输入周围的包装器。 |
| label | 输入的标签。 |
| prefix | 默认情况下没有输出,但允许直接在输入元素之前放置内容。 |
| prefixIcon | 输出在前缀部分之前放置一个图标的元素。 |
| inner | 实际输入元素周围的包装器。 |
| suffix | 默认情况下没有输出,但允许直接在输入元素之后放置内容。 |
| suffixIcon | 输出在后缀部分之后放置一个图标的元素。 |
| input | 输入元素本身。 |
| help | 包含帮助文本的元素。 |
| messages | 包装所有消息的容器。 |
| message | 包含消息的元素(或多个元素) - 最常见的是验证和错误消息。 |