gpt4 book ai didi

reactjs - Material UI Autocomplete - 在项目选择后禁用列表框

转载 作者:行者123 更新时间:2023-12-04 04:27:41 25 4
gpt4 key购买 nike

我在 Material-UI 的帮助下在 React.js 中创建了一个自动完成组件 headless useAutoComplete钩。该组件工作正常。当用户尝试输入任何字符时,Listbox会自动打开。
但问题是当用户选择任何东西并注意输入元素时,ListBox重新开放。我怎样才能防止这种情况?
代码沙盒:
Edit fg56t
代码:

import React from 'react';
import useAutocomplete from '@material-ui/lab/useAutocomplete';

function AutocompleteComponent(props) {
const { data } = props;

const [value, setValue] = React.useState('');
const [isOpen, setIsOpen] = React.useState(false);

const handleOpen = function () {
if (value.length > 0) {
setIsOpen(true);
}
};

const handleInputChange = function (event, newInputValue) {
setValue(newInputValue);
if (newInputValue.length > 0) {
setIsOpen(true);
} else {
setIsOpen(false);
}
};

const {
getRootProps,
getInputProps,
getListboxProps,
getOptionProps,
groupedOptions
} = useAutocomplete({
id: 'form-control',
options: data,
autoComplete: true,
open: isOpen, // Manually control
onOpen: handleOpen, // Manually control
onClose: () => setIsOpen(false), // Manually control
inputValue: value, // Manually control
onInputChange: handleInputChange, // Manually control
getOptionLabel: (option) => option.name
});

const listItem = {
className: 'form-control__item'
};

return (
<div className="app">
<div className="form">
<div {...getRootProps()}>
<input
type="text"
className="form-control"
placeholder="Location"
{...getInputProps()}
/>
</div>
{groupedOptions.length > 0 && (
<ul
className="form-control__box"
aria-labelledby="autocompleteMenu"
{...getListboxProps()}
>
{groupedOptions.map((option, index) => {
return (
<li {...getOptionProps({ option, index })} {...listItem}>
<div>{option.name}</div>
</li>
);
})}
</ul>
)}
</div>
</div>
);
}

export default AutocompleteComponent;

最佳答案

您可以将 selectedItem 存储在一个状态中,并在 handleOpen 中使用它来决定是否必须显示列表。
对于设置 selectedItem,您可以修改 getOptionProps 提供的默认单击

import React from 'react';
import useAutocomplete from '@material-ui/lab/useAutocomplete';

function AutocompleteComponent(props) {
const { data } = props;

const [value, setValue] = React.useState('');
const [isOpen, setIsOpen] = React.useState(false);
const [selectedItem, setSelectedItem] = React.useState('');

const handleOpen = function () {
if (value.length > 0 && selectedItem !== value) {
setIsOpen(true);
}
};

const handleInputChange = function (event, newInputValue) {
setValue(newInputValue);
if (newInputValue.length > 0) {
setIsOpen(true);
} else {
setIsOpen(false);
}
};

const {
getRootProps,
getInputProps,
getListboxProps,
getOptionProps,
groupedOptions
} = useAutocomplete({
id: 'form-control',
options: data,
autoComplete: true,
open: isOpen, // Manually control
onOpen: handleOpen, // Manually control
onClose: () => setIsOpen(false), // Manually control
inputValue: value, // Manually control
onInputChange: handleInputChange, // Manually control
getOptionLabel: (option) => option.name
});

const listItem = {
className: 'form-control__item'
};

return (
<div className="app">
<div className="form">
<div {...getRootProps()}>
<input
type="text"
className="form-control"
placeholder="Location"
{...getInputProps()}
/>
</div>
{groupedOptions.length > 0 && (
<ul
className="form-control__box"
aria-labelledby="autocompleteMenu"
{...getListboxProps()}
>
{groupedOptions.map((option, index) => {
return (
<li
{...getOptionProps({ option, index })}
{...listItem}
onClick={(ev) => {
setSelectedItem(option.name);
getOptionProps({ option, index }).onClick(ev);
}}
>
<div>{option.name}</div>
</li>
);
})}
</ul>
)}
</div>
</div>
);
}

export default AutocompleteComponent;

Edited

关于reactjs - Material UI Autocomplete - 在项目选择后禁用列表框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68235824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com