开始使用 TanStack Form 的最基本要求是创建一个 TanstackFormController,如下所示,其中 Employee 接口用于我们的测试表单:
interface Employee {
firstName: string
lastName: string
employed: boolean
jobTitle: string
}
#form = new TanStackFormController()<Employee>(this, {
defaultValues: {
firstName: '',
lastName: '',
employed: false,
jobTitle: '',
},
})
interface Employee {
firstName: string
lastName: string
employed: boolean
jobTitle: string
}
#form = new TanStackFormController()<Employee>(this, {
defaultValues: {
firstName: '',
lastName: '',
employed: false,
jobTitle: '',
},
})
在此示例中,this 引用了您要在其中使用 TanStack Form 的 LitElement 实例。
要将模板中的表单元素与 TanStack Form 连接起来,请使用 TanstackFormController 的 field 方法。
field 的第一个参数是 FieldOptions,第二个参数是渲染元素的回调。
field(FieldOptions, callback)
field(FieldOptions, callback)
我们完成的测试表单应如下所示。该表单从用户输入字段收集名字:
export class TestForm extends LitElement {
#form = new TanStackFormController<Employee>(this, {
defaultValues: {
firstName: '',
lastName: '',
employed: false,
jobTitle: '',
},
})
render() {
return html` <p>请输入您的名字></p>
${this.#form.field(
{
name: `firstName`,
validators: {
onChange: ({ value }) =>
value.length < 3 ? '不够长' : undefined,
},
},
(field: FieldApi<Employee, 'firstName'>) => {
return html` <div>
<label class="first-name-label">名字</label>
<input
id="firstName"
type="text"
placeholder="名字"
@blur="${() => field.handleBlur()}"
.value="${field.getValue()}"
@input="${(event: InputEvent) => {
if (event.currentTarget) {
const newValue = (event.currentTarget as HTMLInputElement)
.value
field.handleChange(newValue)
}
}}"
/>
</div>`
},
)}`
}
}
export class TestForm extends LitElement {
#form = new TanStackFormController<Employee>(this, {
defaultValues: {
firstName: '',
lastName: '',
employed: false,
jobTitle: '',
},
})
render() {
return html` <p>请输入您的名字></p>
${this.#form.field(
{
name: `firstName`,
validators: {
onChange: ({ value }) =>
value.length < 3 ? '不够长' : undefined,
},
},
(field: FieldApi<Employee, 'firstName'>) => {
return html` <div>
<label class="first-name-label">名字</label>
<input
id="firstName"
type="text"
placeholder="名字"
@blur="${() => field.handleBlur()}"
.value="${field.getValue()}"
@input="${(event: InputEvent) => {
if (event.currentTarget) {
const newValue = (event.currentTarget as HTMLInputElement)
.value
field.handleChange(newValue)
}
}}"
/>
</div>`
},
)}`
}
}