开发者问题收集

如何使用 Formik 从 Material UI 选择字段获取值

2020-11-19
5822

请原谅,我想了解并使用 Formik 实现某些功能。

我有两个选择字段,我想将它们选定的值传递给 formik 值。它们的作用基本上是获取 CountryArray 及其对应的区域。我将它们创建为独立组件的原因是,这样我就可以将它们传递给 Formik 中的 Field 组件。我的国家数组来自 import countries from "../data/c-r"; 。我还使用了 react 中的 useState 。但我知道使用 formik 时,您不再需要管理您的状态,因为 Formik 可以做到这一点。我怎样才能实现这一点。

  const [country, setCountry] = useState("");
  const [region, setRegion] = useState("");

  const CountryComponent = () => (
    <FormControl>
      <InputLabel id="demo-simple-select-label">Country</InputLabel>
      <Select
        labelId="demo-simple-select-label"
        id="demo-simple-select"
        value={country}
        onChange={handleChangeCountry}
      >
        {countries.map(country => (
          <MenuItem value={country} key={country.countryShortCode}>
            {country.countryName}
          </MenuItem>
        ))}
      </Select>
    </FormControl>
  );

  const StateComponent = () => (
    <FormControl>
      <InputLabel id="demo-simple-select-label">Region</InputLabel>
      <Select
        labelId="demo-simple-select-label"
        id="demo-simple-select"
        value={region}
        onChange={handleChangeRegion}
        disabled={!country}
      >
        {country
          ? country.regions.map(region => (
              <MenuItem value={region} key={region.shortCode}>
                {region.name}
              </MenuItem>
            ))
          : []}
      </Select>
    </FormControl>
  );

我做了...

<Field
      type="select"
      placeholder="State"
      name="state"
      as={StateComponent}
      fullWidth
      label="Select State"
    />

   <Field
     type="select"
     placeholder="Country"
     name="country"
     as={CountryComponent}
     fullWidth
     label="Select Country"
   />

问题是我无法在 Formik 值中获取地区和国家的值,我怎样才能做到这一点?

谢谢!

1个回答

我试图用 Formik 和 Material UI 做类似的事情来创建一个国家选择字段。

当使用这个库组合时( Formik Material-UI ),我还建议使用 Formik Material-UI ,这样可以让您的生活更轻松,无需再将字段的值传递给组件。

关于自定义选择组件,我所做的是使用 TextField 组件而不是 Material-UI 的 Select 组件来创建它,具体方式如下所述 此处 ,但使用 Formik Material-UI 库中的 TextField。

因此,在表单中,您可以像这样使用 Field 组件:

<Field
  name='country'
  type='text'
  component={CountrySelect}
  label='Country'
  margin='normal'
  variant='outlined'
/>

自定义组件将以这种方式创建:

import { MenuItem} from '@material-ui/core';
import { TextField } from 'formik-material-ui';

const CountrySelect = (props) => {

    const [countries, setCountries] = useState([]);

    useEffect(() => {
        const loadData = () => {
           [..]
        };
        loadData();
    }, []);

    return (
        <TextField
            select
            {...props}
        >
            {countries.length ?
                countries.map((country) => (
                    <MenuItem key={country.code} value={country.code}>
                        {country.name}
                    </MenuItem>
                ))
                :
                <MenuItem>loading...</MenuItem>
            }
        </TextField >
    );

};

您可以在此处看到一个示例: https://codesandbox.io/s/dreamy-franklin-j384c

giorgiline
2020-12-08