reactjs - 是否有 Material-UI 组件可以像在 stackoverflow 中一样搜索/选择标签?
解决方案
您可以Autocomplete
通过覆盖作为下拉容器的 的 组件来执行此操作,并使用 unit 将 CSS 网格设置为显示 3 个等宽ListboxProps
的列:Listbox
fr
<Autocomplete
ListboxProps={{
style: {
display: "grid",
gridTemplateColumns: "1fr 1fr 1fr",
maxHeight: "initial",
}
}}
现在假设该选项具有以下类型:
type TagOption = {
tag: string;
views: number;
description: string;
};
在 Stackoverflow 下拉列表中,最多只有 6 个选项,因此我们需要限制显示的选项数量Listbox
:
import Autocomplete, { createFilterOptions } from "@mui/material/Autocomplete";
const _filterOptions = createFilterOptions<TagOption>();
const filterOption = (props, state) => {
const results = _filterOptions(props, state);
return results.slice(0, 6);
};
<Autocomplete filterOptions={filterOption}
我们还想为每个网格项创建一个自定义选项组件。这是一个最小的示例,没有太多样式可以帮助您入门:
function OptionItem({ option, ...other }) {
return (
<li
{...other}
style={{
display: "block"
}}
>
<div>
<Chip label={option.tag} />
{option.views}
</div>
<div>{option.description}</div>
</li>
);
}
renderOption={(props, option, { selected }) => (
<OptionItem {...props} option={option} />
)}
最后设置isOptionEqualToValue
andgetOptionLabel
以确保选项被正确过滤,并且输入在选择时显示正确的标签:
isOptionEqualToValue={(option, value) => option.tag === value.tag}
getOptionLabel={(option) => option.tag}
现场演示(来源)
推荐阅读
- java - 如何使用 Thymeleaf th:each 在 div 中打印列表对象,而不是
- r - 我正在尝试在乐队上运行马赛克,在这个阶段,当我应用光栅时,它给了我这个错误
- javascript - React 的 Framer Motion 页面转换 - 问题
- xamarin - Xamarin SkiaSharp 缩放裁剪画布
- spinnaker - 在大三角帆中创建阶段特定参数?
- python - 运行以下代码后 Python 代码没有响应:
- javascript - HTML按钮未调用该函数
- docker - 在 GCR 上运行多架构映像时执行格式错误
- c# - 我们如何从已使用 ILRepack 合并到单个 DLL 的类库项目中调用当前项目中的资源字典
- toit - 特定时间的深度睡眠