如何使用 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