我在Formik中有一个需要动态验证模式的字段:当用户 Select 一个支付令牌时,必须为另一个输入字段动态更改最小支付值. 我使用了一个状态值和来自该字段的"onChange"侦听器,除了显示的值之外,它可以正常工作

{token.symbol}

不再渲染.

重写"onChange()"字段方法就好像停用了该字段的Formik Select .

知道发生了什么事吗?

我的代码是:

import { ErrorMessage, Field, Form, Formik } from 'formik';
import { SetStateAction, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import * as Yup from 'yup';
import SubmitButton from './SubmitButton';
import useAllowedTokens from '../../hooks/useAllowedTokens';

interface IFormValues {
  rateToken: string;
  rateAmount: number;
}

const initialValues: IFormValues = {
  rateToken: '',
  rateAmount: 0,
};

function ServiceForm() {
  const navigate = useNavigate();
  const allowedTokenList = useAllowedTokens();
  const [selectedToken, setSelectedToken] = useState('');

  const validationSchema = Yup.object({
    rateToken: Yup.string().required('Please select a payment token'),
    rateAmount: Yup.number()
      .required('Please provide an amount for your service')
      .when('rateToken', {
        is: (rateToken: string) => rateToken !== '',
        then: schema =>
          schema.moreThan(
            allowedTokenList.find(token => token.address === selectedToken)
              ?.minimumTransactionAmount || 0,
            `Amount must be greater than ${
              allowedTokenList.find(token => token.address === selectedToken)
                ?.minimumTransactionAmount || 0
            }`,
          ),
      }),
  });

  // const onSubmit = async (values: IFormValues) => {
  //   <...>
  // }

  return (
    <Formik initialValues={initialValues} onSubmit={onSubmit} validationSchema={validationSchema}>
      {({ isSubmitting }) => (
        <Form>
          <div className='grid grid-cols-1 gap-6 border border-gray-200 rounded-md p-8'>
            <div className='flex'>
              <label className='block flex-1 mr-4'>
                <span className='text-gray-700'>Amount</span>
                <Field
                  type='number'
                  id='rateAmount'
                  name='rateAmount'
                  className='mt-1 mb-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50'
                  placeholder=''
                />
                <span className='text-red-500 mt-2'>
                  <ErrorMessage name='rateAmount' />
                </span>
              </label>

              <label className='block'>
                <span className='text-gray-700'>Token</span>
                <Field
                  component='select'
                  id='rateToken'
                  name='rateToken'
                  className='mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50'
                  placeholder=''
                  onChange={(event: { target: { value: SetStateAction<string> } }) => {
                    setSelectedToken(event.target.value);
                  }}>
                  <option value=''>Select a token</option>
                  {allowedTokenList.map((token, index) => (
                    <option key={index} value={token.address}>
                      {token.symbol}
                    </option>
                  ))}
                </Field>
                <span className='text-red-500'>
                  <ErrorMessage name='rateToken' />
                </span>
              </label>
            </div>

            <SubmitButton isSubmitting={isSubmitting} label='Post' />
          </div>
        </Form>
      )}
    </Formik>
  );
}

export default ServiceForm;

已try :重写onChange()字段方法

预期:所选&lt;选项&gt;的值(标记)应在表单的输入数据中更新,但没有更新.

推荐答案

要根据另一个字段更改设置字段值,您必须使用Formik中的setFieldValue,以下是正确的方法

100

出现此问题是因为您没有使用formmik setFieldValue设置值

您必须设置当前字段的值,然后设置为其他字段计算的值

 {({ isSubmitting, setFieldValue }) => (

   ...

   onChange={(event: { target: { value: SetStateAction<string> } }) => {
    setFieldValue('rateToken', value)
    // select amount value based on token selection
    // calculation code here
    setFieldValue('rateAmount', calculatedAmount)
   }}>

Reactjs相关问答推荐

Shadck/ui Select -当用户 Select 项目时更改状态

REACT路由DOM根据参数呈现不同的路由

有没有办法让两个状态在两次精准渲染中更新?

获取未捕获的错误:Gatsby生产版本上的最小化react 错误#418

MUiv5和TSS-Reaction SSR问题:无法可靠地处理样式定义.CSSprops 中的ArrowFunctionExpression

在React中映射对象数组时,如何正确呈现JSX.Element或React.ReactNode类型?

如何垂直对齐 React Bootstrap Table 行中的项目

在reactjs中刷新页面时丢失状态值

.populate() 方法在 mongodb 中不起作用

useRef.current.value 为空值

使用reactrouterdom时显示"对象无效作为React子组件"错误

useEffect 渲染没有依赖数组的组件

带有 webpack 错误多个文件匹配路由名称的 Expo-router.无法Bundle 或部署应用程序

页面不显示

如何禁用 redux-toolkit 的不可序列化值测试警告?

如何在同一路由路径上重新渲染组件(链接,V6)reactjs

使用 Jest/React 测试库时,如何测试由 setInterval 函数创建的 DOM 更改?

Material UI:使用 mui 手风琴时出现props 类型失败:isValidElement 不是函数

当页面重新加载react 路由导航到第一页 v6

试图将页面限制为仅登录但有条件的用户似乎永远不会运行