reactjs - 在同一视图中具有 Material UI 的多个自动完成字段
问题描述
默认情况下,我的视图中有 2 个自动完成字段,但您可以每次单击添加更多字段。
目前我遇到的问题是每个自动完成字段都会打开每个自动完成字段的每个结果列表,因为每个字段都使用“打开”。我如何让它动态地实现整个事情?
const [value, setValue] = useState<string>('')
const [open, setOpen] = useState(false)
<Autocomplete
options={props.results.map((option) => option.name)}
renderOption={(option) => (
<Typography noWrap>
{option}
</Typography>
)}
onClose={() => {
setOpen(false)
}}
open={open}
renderInput={(params) => (
<Paper className={search.root} ref={params.InputProps.ref}>
<IconButton className={search.iconButton} disabled>
<FiberManualRecordIcon color="secondary" />
</IconButton>
<InputBase
{...params.inputProps}
className={search.input}
placeholder="Test"
value={value}
onChange={(event: any) => setValue(event.target.value)}
/>
<IconButton
className={search.iconButton}
disabled={!value}
>
<SearchIcon />
</IconButton>
</Paper>
)}
/>
解决方案
由于此问题的日期,您可能已经解决了这个问题。但是我将把我为解决这个问题所做的事情放在这里,因为我在使用 Formik 的 FieldArray 时遇到了同样的问题。
Material UI 文档有时会有些混乱,因此请尽量忽略示例中的一些内容。
移除 open、onOpen 和 onClose 道具。如果您想创建某种自动打开/关闭机制,您只需要这些道具。
这是我在做什么以及如何解决它的一个例子。
<Autocomplete
id={`items.${index}.partNumber`}
name={`items.${index}.partNumber`}
freeSolo
style={{ width: 300 }}
open={openPartNumber}
onOpen={() => setOpenPartNumber(true)}
onClose={() => setOpenPartNumber(false)}
options={partNumbers}
clearOnBlur={false}
getOptionLabel={option => (option.label ? option.label : '')}
value={item.partNumber}
inputValue={item.partNumber}
onInputChange={(event, newInputValue) => {
if (event) {
setFieldValue(`items.${index}.partNumber`, newInputValue);
getPartNumberList(newInputValue);
}
}}
onChange={(event, optionSelected, reasson) => {
if (reasson === 'select-option') {
setFieldValue(`items.${index}.partNumber`, optionSelected.partNumber);
setFieldValue(`items.${index}.vendorNumber`, optionSelected.vendorNumber);
setFieldValue(`items.${index}.description`, optionSelected.description);
setFieldValue(`items.${index}.ncm`, optionSelected.ncm);
}
}}
filterOptions={x => x}
...otherPrps...
/>
然后我只删除了打开、onOpen 和 onClose 的道具。
<Autocomplete
id={`items.${index}.partNumber`}
name={`items.${index}.partNumber`}
freeSolo
style={{ width: 300 }}
options={partNumbers}
clearOnBlur={false}
getOptionLabel={option => (option.label ? option.label : '')}
value={item.partNumber}
inputValue={item.partNumber}
onInputChange={(event, newInputValue) => {
if (event) {
setFieldValue(`items.${index}.partNumber`, newInputValue);
getPartNumberList(newInputValue);
}
}}
onChange={(event, optionSelected, reasson) => {
if (reasson === 'select-option') {
setFieldValue(`items.${index}.partNumber`, optionSelected.partNumber);
setFieldValue(`items.${index}.vendorNumber`, optionSelected.vendorNumber);
setFieldValue(`items.${index}.description`, optionSelected.description);
setFieldValue(`items.${index}.ncm`, optionSelected.ncm);
}
}}
filterOptions={x => x}
...otherPrps...
/>
推荐阅读
- python - 皮尔逊相关的功效分析
- android - 使用 AWS kinesisvideo 时,流式页面总是出现错误的旋转
- git - 撤消 git 合并到 master 和一些工作,但保留更改以供以后使用
- android - 无法通过平台通道颤振在蓝牙颤振 UI 中显示数据
- python - 如何有效地将新获取的数据与存储在数据库中的数据同步?
- python - 视频分析:如何使用 python 将 PCA 应用于视频中的每一帧?
- cucumber - java.net.ConnectException:连接被拒绝:在 webdriverio v7 测试中间抛出连接错误
- javascript - 菜单按钮在 Safari 桌面和移动设备上不起作用
- ethereum - 即使帐户存在,也无法使用 geth 控制台列出帐户
- php - 在 get 中添加 application/json 标头返回错误 500?