响应性

Tanstack Form 在与表单交互时不会导致重新渲染。 因此,您可能会发现自己试图使用表单或字段状态值但没有成功。

如果您想访问响应式值,您需要使用以下两种方法之一订阅它们: useStoreform.Subscribe 组件。

这些订阅的一些用途是渲染最新的字段值、根据条件确定要渲染的内容,或在组件的逻辑中使用字段值。

对于您想要“响应”触发器的情况,请查看 listener API。

useStore

useStore hook 非常适合您需要在组件逻辑中访问表单值的情况。useStore 接受两个参数。 首先,表单存储。 其次,一个选择器,用于微调您希望订阅的表单部分。

tsx
const firstName = useStore(form.store, (state) => state.values.firstName)
const errors = useStore(form.store, (state) => state.errorMap)
const firstName = useStore(form.store, (state) => state.values.firstName)
const errors = useStore(form.store, (state) => state.errorMap)

您可以在选择器中访问表单状态的任何部分。

请注意,每当订阅的值发生更改时,useStore 都会导致整个组件重新渲染。

虽然可以省略选择器,但请抵制这种冲动,因为省略它会在任何表单状态更改时导致许多不必要的重新渲染。

form.Subscribe

form.Subscribe 组件最适合您需要在组件 UI 中对某些内容做出反应的情况。 例如,根据表单字段的值显示或隐藏 ui。

tsx
<form.Subscribe
  selector={(state) => state.values.firstName}
  children={(firstName) => (
    <form.Field>
      {(field) => (
        <input
          name="lastName"
          value={field.state.lastName}
          onChange={field.handleChange}
        />
      )}
    </form.Field>
  )}
/>
<form.Subscribe
  selector={(state) => state.values.firstName}
  children={(firstName) => (
    <form.Field>
      {(field) => (
        <input
          name="lastName"
          value={field.state.lastName}
          onChange={field.handleChange}
        />
      )}
    </form.Field>
  )}
/>

form.Subscribe 组件不会触发组件级别的重新渲染。 每当订阅的值发生更改时,只有 form.Subscribe 组件会重新渲染。

是否使用 useStoreform.Subscribe 之间的选择主要归结为,如果它在 ui 中渲染,请使用 form.Subscribe 以获得其优化优势,如果您需要在逻辑中获得响应性,那么 useStore 是最佳选择。

订阅 Bytes

您每周的 JavaScript 新闻。 每周一免费发送给超过 100,000 名开发人员。

Bytes

没有垃圾邮件。 随时取消订阅。