我面临Reactjs
前端代码库的问题。我们使用库名称react-autoauggest来实现自动完成功能,但领导决定从react-autoauggest 转移到downshift。我通读了这个文档并使用useCombobox
钩子实现了这个,但他提出了一些问题并告诉我在没有任何指导的情况下解决这些问题。我创建了这些问题的干净版本。
首先,我正在解决issue-4
清除按钮应该清除输入字段并关闭菜单。但是当我单击清除按钮时,输入字段为空,但菜单仍处于打开状态。你能给我一些关于如何在降档时做这些事情的指导吗?
这是我从对象数组中过滤数据 的代码沙箱链接:在此处查看代码沙箱
应用程序.js:
const App = () => {
// Array of objects
const [inputItems, setInputItems] = useState(data);
// State for all primitive types
const [value, setValue] = useState('');
/**
* It will returns the new filtered array.
* @param data Array<Object> - The array to iterate over
* @param inputValue {string} - Your input value
* @return Array<Object> - Returns the new filtered array
*/
const filterByName = (data, inputValue) => {
return data.filter(item => {
return item.name.toLowerCase().indexOf(inputValue.toLowerCase()) !== -1;
});
};
// props for the combobox
const comboboxProps = {
className: 'search has-icons-left has-buttons-right'
};
// props for the input
const inputProps = {
type: 'text',
className: 'form-control',
placeholder: 'Enter the state'
};
// props for the menu
const menuProps = {
className: 'menu'
};
// useComboBox
const {
isOpen,
getComboboxProps,
getInputProps,
getMenuProps,
getItemProps,
highlightedIndex,
selectItem,
} = useCombobox({
items: inputItems,
onInputValueChange: ({inputValue}) => {
setValue(inputValue);
setInputItems(filterByName(data, inputValue));
},
itemToString: (item) => item ? item.name : '',
});
return (
<div className="app">
<div {...getComboboxProps(comboboxProps)}>
<input {...getInputProps(inputProps)} />
<span className="icon is-left"><MarkerIcon/></span>
{(typeof value === 'string' && value.length > 0) ?
(<span className="button is-right">
<button className="btn btn-clear" onClick={() => selectItem(null)}>Clear</button>
</span>) : null}
{/* Suggestions */}
<ul {...getMenuProps(menuProps)}>
{isOpen && inputItems.map((item, index) => (
<li key={index} {...getItemProps({item, index})}
style={highlightedIndex === index ? {backgroundColor: "#f5f5f5"} : null}>
{item.name}
</li>
))}
</ul>
</div>
</div>
);
};
export default App;