让我们从创建我们的第一个FormKit表单开始!我们将学习一些FormKit的关键功能以及它们对您的好处。我们还将学习一些很好的技巧 - 例如如何在不使用v-model
的情况下管理表单状态。
本指南假设您熟悉Vue 组合 API。
FormKit 的主要特点之一是其单一组件 API - <FormKit />
组件。这个组件为您提供了访问所有输入类型的能力。虽然某些类型可能会扩展并添加功能,但它们共享相同的基本功能。您可以在这里了解更多关于输入的信息。
即使没有任何属性,裸露的 <FormKit />
组件已经为我们的输入框提供了一个很好的起点,具有可访问的标记、基本的 text
输入类型以及稍后将在后面的部分中解释的其他功能。
如果未指定 type
,<FormKit />
组件将默认使用 type="text"
。type
是我们指定所需输入的方式。就像原生输入框一样,我们有诸如 text
、select
、checkbox
等输入框。然而,我们不仅限于“原生”输入框,FormKit Pro 还添加了非原生控件,如 repeater
、taglist
和 autocomplete
类型,可以处理更复杂的交互。
如果查看前面示例生成的 HTML,您将看到 FormKit 已经创建了可访问的标记。但是,由于我们没有指定 name
和 id
属性,它们被自动生成为 name: "text_1" id="input_0"
。尽管如此,作为最佳实践,我们应该至少指定 name
,因为它使在表单内使用输入框更容易。name
被 form
和 group
类型用于收集值,并根据 name
将值传递给它们的子组件:
我们的输入框仍然缺少一些关键的辅助功能功能,例如 label
、help
,甚至可能是 placeholder
。FormKit 接受所有这些作为属性,并输出正确的 aria
属性。屏幕阅读器现在将宣布输入框的名称、帮助文本以及输入框已准备好进行编辑:
有时您希望为输入框添加初始值,例如提供一个合理的起点,或者从数据库中填充预先保存的数据。我们可以使用 value
属性来实现这一点。
让我们开始构建一个示例,我们可以在本指南中添加内容。假设我们正在为一个游戏构建一个“角色创建表单”。让我们为我们的角色分配一个力量评级。当用户首次打开表单时,我们可以使用 range
输入框,并预定义一个值为 5
:
验证是 FormKit 的主要功能之一。它帮助用户知道他们提交的值是否正确。添加验证非常简单,已经为您实现了许多强大的内置验证规则。我们将使用 validation
属性来确保角色既不太强也不太弱。validation-visibility
属性允许我们控制何时向用户显示验证消息 - 是立即显示、在用户模糊输入框时显示,还是在表单提交时显示。实际的有效状态是实时计算的,并且始终是最新的 - 我们只需选择何时公开这些消息:
请注意,上面的 min
和 max
属性是范围输入框的内置浏览器属性,表示范围滑块的顶部和底部。
假设我们的“后端”要求像 strength
这样的数据转换为数字。默认情况下,FormKit 遵循 HTML “原生”输入框的行为,将所有值都作为“字符串”处理。为了解决这个问题,我们可以使用 FormKit 最酷的功能之一 - 插件 - 它可以被视为输入框的中间件。使用插件,我们可以更改输入框的值的返回方式,插件只是函数:
首先,让我们创建一个基本的表单并添加更多的输入,这样我们就有内容可以使用。我们将在每个部分中添加更多的功能,如验证、分组和根据其他输入更改值。
我们将使用一个名为 form
的输入,它将使字段的分组和验证变得更加容易。您只需要将所有的输入包装在 <FormKit type="form">
中:
form
类型将使用每个输入的 name
作为数据对象主动收集所有子输入的值(就像 group
一样)。
我们将要探索的表单的第一个功能是,我们有一个 @submit
事件可以在提交表单时方便地使用。@submit
事件将所有从输入中收集到的后代字段作为第一个参数传递给我们。不需要使用多个 v-model
来收集表单数据。让我们添加我们的 createCharacter()
提交处理程序:
在使用 type="form"
时,form
会自动输出一个提交按钮。对于我们的情况,"Submit" 文本不能正确显示表单的意图。为了解决这个问题,我们可以使用 submit-label
属性,这是一个 form
特定的功能。我们只需要简单地添加 submit-label="创建角色"
来显示表单的意图:
<FormKit type="form" @submit="createCharacter" submit-label="创建角色">
<!-- 其他创建表单的内容 -->
</FormKit>
虽然表单现在可以工作,但我们可以看到一些相关的输入是分开的(即,表单数据是一个扁平的结构,其中所有的表单数据都是兄弟节点)。假设我们的后端需要将所有属性放在一个 attributes
属性中。我们可以使用 group
类型将相关的输入通过一个共同的 name
进行分组。
就像 form
类型一样,您可以将所有的字段包装在 <FormKit type="group" name: "attributes">
中。不要忘记添加 name
属性:
就是这样!我们可以在这里结束关于如何使用 FormKit 处理表单和输入的介绍。然而,让我们添加一些用户体验的增强功能,并利用这些功能来了解更多的概念和特性,以便将您的表单提升到更高的水平。
我们可以做一些改进来改变角色的默认 attributes
,根据所选的角色 class
。为此,我们将使用一些新的功能:
getNode
使用它们的 id
作为标识符获取输入的核心节点。每个输入都有一个关联的核心节点。events
监听对某个输入的更改。input
函数允许我们更新它的值。通过结合这些功能,我们可以获取输入的核心 node
,监听并响应 events
,并使用 input
函数更新另一个字段的值:
现在的代码变得不太易读,所以让我们将逻辑提取到另一个文件中,并使用插件来代替。请注意,我们只将新的 updateAttributesPlugin
放在 class
输入上,这样它就不会影响任何其他输入。我们还将使用另一个有用的功能,称为 traversal,通过使用节点的 at
函数来学习它:
at
函数使用 name
属性而不是 getNode
使用的 id
。
假设不同的角色在不同的属性上更擅长,但没有一个属性应该太强大。我们可以通过创建一个点数预算,并将分组验证添加到属性 group
中,以确保它们的总计不超过 20 点。我们将学习一个新的功能 - 自定义规则 - 来实现这一点:
默认情况下,group
类型不输出任何标记,因此要显示验证错误,我们需要手动添加它。
有时候表单需要根据另一个输入的值来显示或隐藏字段。我们可以通过学习两个新概念来实现这一点:
FormKit
组件都在 #default
slot prop 中接收它们的上下文对象。group
的值 - group(以及 form
)输入的值是一个对象,其子元素的值以子元素的 name
为键。在使用条件渲染时,请注意 Vue 需要提示来知道一个 DOM 元素需要重新渲染,而不是尝试重用它。我们可以为元素添加一个唯一的 key
属性来帮助 Vue。
所以,让我们获取 group
输入的上下文对象并提取 value
:#default="{ value }"
。如果用户决定将所有属性都更改为 1,我们想为他们添加一个小彩蛋:
这就是我们对 FormKit 的介绍!现在你已经准备好开始使用它了!
以下是一些我们建议你继续探索的主题,你可以按任意顺序阅读,甚至在尝试了 FormKit 之后再阅读: