TanStack Form 是一个无头 (headless) 库,为您提供完全的样式定制灵活性。它能与多种 UI 库兼容,包括 Tailwind、Material UI、Mantine 甚至原生 CSS。
本指南主要关注 Material UI 和 Mantine,但相关概念同样适用于您选择的任何 UI 库。
在集成 TanStack Form 与 UI 库之前,请确保项目中已安装必要的依赖项:
注意:虽然可以混合使用不同库,但通常建议坚持使用一个库以保持一致性并减少冗余。
以下示例演示了如何将 TanStack Form 与 Mantine 组件集成:
import { TextInput, Checkbox } from '@mantine/core'
import { useForm } from '@tanstack/react-form'
export default function App() {
const { Field, handleSubmit, state } = useForm({
defaultValues: {
firstName: '',
lastName: '',
isChecked: false,
},
onSubmit: async ({ value }) => {
// 处理表单提交
console.log(value)
},
})
return (
<>
<form
onSubmit={(e) => {
e.preventDefault()
handleSubmit()
}}
>
<Field
name="firstName"
children={({ state, handleChange, handleBlur }) => (
<TextInput
defaultValue={state.value}
onChange={(e) => handleChange(e.target.value)}
onBlur={handleBlur}
placeholder="Enter your name"
/>
)}
/>
<Field
name="isChecked"
children={({ state, handleChange, handleBlur }) => (
<Checkbox
onChange={(e) => handleChange(e.target.checked)}
onBlur={handleBlur}
checked={state.value}
/>
)}
/>
</form>
<div>
<pre>{JSON.stringify(state.values, null, 2)}</pre>
</div>
</>
)
}
import { TextInput, Checkbox } from '@mantine/core'
import { useForm } from '@tanstack/react-form'
export default function App() {
const { Field, handleSubmit, state } = useForm({
defaultValues: {
firstName: '',
lastName: '',
isChecked: false,
},
onSubmit: async ({ value }) => {
// 处理表单提交
console.log(value)
},
})
return (
<>
<form
onSubmit={(e) => {
e.preventDefault()
handleSubmit()
}}
>
<Field
name="firstName"
children={({ state, handleChange, handleBlur }) => (
<TextInput
defaultValue={state.value}
onChange={(e) => handleChange(e.target.value)}
onBlur={handleBlur}
placeholder="Enter your name"
/>
)}
/>
<Field
name="isChecked"
children={({ state, handleChange, handleBlur }) => (
<Checkbox
onChange={(e) => handleChange(e.target.checked)}
onBlur={handleBlur}
checked={state.value}
/>
)}
/>
</form>
<div>
<pre>{JSON.stringify(state.values, null, 2)}</pre>
</div>
</>
)
}
集成 Material UI 组件的流程类似。以下是使用 Material UI 的 TextField 和 Checkbox 的示例:
<Field
name="lastName"
children={({ state, handleChange, handleBlur }) => {
return (
<TextField
id="filled-basic"
label="Filled"
variant="filled"
defaultValue={state.value}
onChange={(e) => handleChange(e.target.value)}
onBlur={handleBlur}
placeholder="Enter your last name"
/>
);
}}
/>
<Field
name="isMuiCheckBox"
children={({ state, handleChange, handleBlur }) => {
return (
<MuiCheckbox
onChange={(e) => handleChange(e.target.checked)}
onBlur={handleBlur}
checked={state.value}
/>
);
}}
/>
<Field
name="lastName"
children={({ state, handleChange, handleBlur }) => {
return (
<TextField
id="filled-basic"
label="Filled"
variant="filled"
defaultValue={state.value}
onChange={(e) => handleChange(e.target.value)}
onBlur={handleBlur}
placeholder="Enter your last name"
/>
);
}}
/>
<Field
name="isMuiCheckBox"
children={({ state, handleChange, handleBlur }) => {
return (
<MuiCheckbox
onChange={(e) => handleChange(e.target.checked)}
onBlur={handleBlur}
checked={state.value}
/>
);
}}
/>
Your weekly dose of JavaScript news. Delivered every Monday to over 100,000 devs, for free.