将两个表单字段链接在一起

您可能会发现需要将两个字段链接在一起;当一个字段的值发生变化时,另一个字段需要重新验证。 一个常见的用法是当您同时拥有 passwordconfirm_password 字段时, 您希望当 password 的值不匹配时,confirm_password 字段显示错误; 无论是哪个字段触发了值的变化。

想象以下用户流程:

  • 用户更新确认密码字段。
  • 用户更新非确认密码字段。

在此示例中,表单仍然会显示错误, 因为"确认密码"字段验证尚未重新运行以标记为已接受。

为了解决这个问题,我们需要确保在密码字段更新时重新运行"确认密码"验证。 为此,您可以向 confirm_password 字段添加 onChangeListenTo 属性。

tsx
export default function App() {
  const form = createForm(() => ({
    defaultValues: {
      password: '',
      confirm_password: '',
    },
    // ...
  }))

  return (
    <div>
      <form.Field name="password">
        {(field) => (
          <label>
            <div>密码</div>
            <input
              value={field().state.value}
              onChange={(e) => field().handleChange(e.target.value)}
            />
          </label>
        )}
      </form.Field>
      <form.Field
        name="confirm_password"
        validators={{
          onChangeListenTo: ['password'],
          onChange: ({ value, fieldApi }) => {
            if (value !== fieldApi.form.getFieldValue('password')) {
              return '密码不匹配'
            }
            return undefined
          },
        }}
      >
        {(field) => (
          <div>
            <label>
              <div>确认密码</div>
              <input
                value={field().state.value}
                onChange={(e) => field().handleChange(e.target.value)}
              />
            </label>
            <Index each={field().state.meta.errors}>
              {(err) => <div>{err()}</div>}
            </Index>
          </div>
        )}
      </form.Field>
    </div>
  )
}
export default function App() {
  const form = createForm(() => ({
    defaultValues: {
      password: '',
      confirm_password: '',
    },
    // ...
  }))

  return (
    <div>
      <form.Field name="password">
        {(field) => (
          <label>
            <div>密码</div>
            <input
              value={field().state.value}
              onChange={(e) => field().handleChange(e.target.value)}
            />
          </label>
        )}
      </form.Field>
      <form.Field
        name="confirm_password"
        validators={{
          onChangeListenTo: ['password'],
          onChange: ({ value, fieldApi }) => {
            if (value !== fieldApi.form.getFieldValue('password')) {
              return '密码不匹配'
            }
            return undefined
          },
        }}
      >
        {(field) => (
          <div>
            <label>
              <div>确认密码</div>
              <input
                value={field().state.value}
                onChange={(e) => field().handleChange(e.target.value)}
              />
            </label>
            <Index each={field().state.meta.errors}>
              {(err) => <div>{err()}</div>}
            </Index>
          </div>
        )}
      </form.Field>
    </div>
  )
}

这同样适用于 onBlurListenTo 属性,它将在字段失焦时重新运行验证。