Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/tomevault-io/skills-registry --skill tanstack-form명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
| Use when this capability is needed.
> Use when this capability is needed.
Review architecture and API design for the vfs-s3 project. Use when the user mentions @architect, asks to review an issue's design, discuss module boundaries, API shape, or architectural decisions for vfs-s3. Also trigger when the user wants to create an ADR (Architecture Decision Record) or evaluate a technical approach for the project. Intended for dispatch from Codex automation or Claude routines; GitHub trigger phrase: @vfs-s3-bot please prepare design doc Use when this capability is needed.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | tanstack-form |
| description | | Use when this capability is needed. |
Version: @tanstack/react-form@latest Requires: React 18.0+, TypeScript 5.0+
npm install @tanstack/react-form
import { useForm } from '@tanstack/react-form'
function App() {
const form = useForm({
defaultValues: {
firstName: '',
lastName: '',
},
onSubmit: async ({ value }) => {
console.log(value)
},
})
return (
<form
onSubmit={(e) => {
e.preventDefault()
e.stopPropagation()
form.handleSubmit()
}}
>
<form.Field
name="firstName"
validators={{
onChange: ({ value }) =>
!value ? 'Required' : value.length < 3 ? 'Too short' : undefined,
}}
children={(field) => (
<>
<input
value={field.state.value}
onBlur={field.handleBlur}
onChange={(e) => field.handleChange(e.target.value)}
/>
{!field.state.meta.isValid && (
<em>{field.state.meta.errors.join(', ')}</em>
)}
</>
)}
/>
<form.Subscribe
selector={(state) => [state.canSubmit, state.isSubmitting]}
children={([canSubmit, isSubmitting]) => (
<button type="submit" disabled={!canSubmit}>
{isSubmitting ? '...' : 'Submit'}
</button>
)}
/>
</form>
)
}
For production apps, use createFormHook to pre-bind reusable UI components and reduce boilerplate:
import { createFormHookContexts, createFormHook } from '@tanstack/react-form'
import { TextField, NumberField, SubmitButton } from '~/ui-library'
const { fieldContext, formContext } = createFormHookContexts()
export const { useAppForm } = createFormHook({
fieldComponents: { TextField, NumberField },
formComponents: { SubmitButton },
fieldContext,
formContext,
})
npm install -D @tanstack/react-devtools @tanstack/react-form-devtools
import { TanStackDevtools } from '@tanstack/react-devtools'
import { formDevtoolsPlugin } from '@tanstack/react-form-devtools'
<TanStackDevtools
config={{ hideUntilHover: true }}
plugins={[formDevtoolsPlugin()]}
/>
| Priority | Category | Rule File | Impact |
|---|---|---|---|
| CRITICAL | Form Setup | rules/form-setup.md | Correct form creation and type inference |
| CRITICAL | Validation | rules/val-validation.md | Prevents invalid submissions and poor UX |
| CRITICAL | Schema Validation | rules/val-schema-validation.md | Type-safe validation with Zod/Valibot/ArkType |
| HIGH | Form Composition | rules/comp-form-composition.md | Reduces boilerplate, enables reusable components |
| HIGH | Field State | rules/field-state.md | Correct state access and reactivity |
| HIGH | Array Fields | rules/arr-array-fields.md | Dynamic list management |
| HIGH | Linked Fields | rules/link-linked-fields.md | Cross-field validation (e.g. confirm password) |
| MEDIUM | Listeners | rules/listen-listeners.md | Side effects on field events |
| MEDIUM | Submission | rules/sub-submission.md | Correct submit handling and meta passing |
| MEDIUM | SSR / Meta-Frameworks | rules/ssr-meta-frameworks.md | Server validation with Start/Next.js/Remix |
| LOW | UI Libraries | rules/ui-libraries.md | Headless integration with component libraries |
useForm<T>(), let TS infer from defaultValuese.preventDefault(); e.stopPropagation(); form.handleSubmit()children render prop — form.Field uses render props via children={(field) => ...}form.Subscribe with selector — subscribe to specific state slices to avoid re-rendersuseStore with selector — useStore(form.store, (s) => s.values.name) not useStore(form.store)createFormHook in production — pre-bind components for consistency and less boilerplateonChangeAsyncDebounceMs or asyncDebounceMsuseForm<MyType>() breaks the design; use typed defaultValues insteade.preventDefault() — native form submission will bypass TanStack Form's handlinguseField for reactivity — use useStore(form.store) or form.Subscribe insteaduseStore — causes full re-render on every state changetype="reset" without e.preventDefault() — native reset bypasses TanStack Form; use form.reset() explicitlyonSubmit — Standard Schema transforms aren't applied; parse manually in onSubmit// Schema validation (form-level with Zod)
const form = useForm({
defaultValues: { age: 0, name: '' },
validators: {
onChange: z.object({ age: z.number().min(13), name: z.string().min(1) }),
},
onSubmit: ({ value }) => console.log(value),
})
// Array fields
<form.Field name="hobbies" mode="array" children={(field) => (
<div>
{field.state.value.map((_, i) => (
<form.Field key={i} name={`hobbies[${i}].name`} children={(sub) => (
<input value={sub.state.value} onChange={(e) => sub.handleChange(e.target.value)} />
)} />
))}
<button type="button" onClick={() => field.pushValue({ name: '' })}>Add
)} />
= ({
: { : , : },
: () {
},
})
Converted and distributed by TomeVault — claim your Tome and manage your conversions.