reactjs - React Select - 多选自定义方式显示多个选项
问题描述
我正在寻找自定义多选以及我们创建显示所选选项的显示方式。
现在,在选择了许多选项的情况下,选择组件占用了某些 UI 的大量空间。参见示例:
我想为输入中的选定选项使用开箱即用的芯片显示,但我只想显示几个选定的选项(如最大 3/4),然后为数量添加“徽章”计数未显示在输入值容器中的选定选项。已选择但超过允许在输入中显示的最大筹码数的选项应在下拉列表中显示为已选中,而显示值的筹码不应显示在我们的下拉列表中。
我已经使用自定义ValueContainer
来实现其中的一部分,只显示前几个芯片选择,然后添加额外/“溢出”选择的计数。我不确定如何利用道具hideSelectedOptions
来实现这一点,以便仅在满足我的最大值而不显示所有项目时才在列表中显示所选项目,因为该道具采用布尔值。
这是我到目前为止所拥有的:https ://codesandbox.io/s/custom-react-select-sjtib
import React, { Component } from "react";
import Select, { components } from "react-select";
import { colourOptions } from "./docs/data";
import "./example.css";
class CustomSelect extends Component {
state = {
values: []
};
handleChange = values => {
this.setState({ values });
};
render() {
const { values } = this.state;
return (
<div>
<Select
hideSelectedOptions={values.length < 3 ? true : false}
isMulti
options={colourOptions}
onChange={this.handleChange}
value={values}
components={{ ValueContainer }}
/>
</div>
);
}
}
export default CustomSelect;
const ValueContainer = ({ children, getValue, ...props }) => {
let maxToShow = 3;
var length = getValue().length;
let displayChips = React.Children.toArray(children).slice(0, maxToShow);
let shouldBadgeShow = length > maxToShow;
let displayLength = length - maxToShow;
return (
<components.ValueContainer {...props}>
{!props.selectProps.inputValue && displayChips}
<div className="root">
{shouldBadgeShow &&
`+ ${displayLength} item${length != 1 ? "s" : ""} selected`}
</div>
</components.ValueContainer>
);
};
解决方案
我个人会保留hideSelectedOptions={false}
并继续styles
使用属性(options
更准确地说是属性)并设置display: 'none'
不应该可见的属性:
const styles = {
option: (base, value) => {
return (shouldBeShown(value) ? { ...base } : { display: 'none'});
}
};
shouldBeShown(value)
是一个自定义函数,用于检查是否应显示特定选项。为了获得选项数据,您可以使用value.data
.
然后你可以styles={styles}
在Select
组件中设置:
<Select
hideSelectedOptions={false}
isMulti
styles={styles}
onChange={this.handleChange}
options={options}
value={values}
components={{ ValueContainer }}
/>
推荐阅读
- python - 在 DolphinDB 中具有索引对齐的类似 pandas 的操作
- jquery - 将 Bootstrap 模板转换为 Wordpress 时未加载 jQuery
- kubernetes - 如何将两个网络接口附加到 Kubernetes 中的单个 pod?
- laravel - Laravel whereHas 关系条件没有按预期工作
- r - 保留特定列表的第一个时间戳
- laravel - 使用 Laravel + Vue.js,一两个组件不随机显示
- javascript - 即使浏览器的窗口已最小化,也使用 JavaScript 获取 HTML 页面的正文高度?
- html - bootstrap 4 内联表单
- python - 如何使用 json.loads 将控制台 python args 转换为 dict?
- python - 我如何对张量流中的前 n 个项目求和?