Select就绪 Storybook
Select 组件是一个可定制的选择输入框组件,允许用户从下拉列表中选择一个或多个选项。它构建在 react-select 库之上。
何时使用
当有大量选项可供选择时,此组件特别有用。此外,如果选项多于 4 个,考虑使用 Select 而不是单选按钮组件。
类型和行为
基本 Select
Select 组件可用于创建基本的选择输入框,允许用户从下拉列表中选择一个选项。可以使用 isClearable
prop 清除选定的值。可以使用 isLoading
prop 指示选择输入框处于加载状态。
const Basic = () => { const [value, setValue] = React.useState<SelectableValue<string>>(); const options = [ { label: 'Option 1', value: '1' }, { label: 'Option 2', value: '2' }, { label: 'Option 3', value: '3' }, ]; return ( <Container> <Select options={options} value={value} onChange={(v) => { setValue(v); }} /> </Container> ); }; render(<Basic />);
多选 Select
Select 组件可以配置为允许用户从下拉列表中选择多个选项。必须将 isMulti
prop 设置为 true 来启用此行为。可以使用 maxVisibleValues
prop 限制显示的选定值数量。可以使用 showAllSelectedWhenOpen
prop 在下拉列表打开时显示所有选定的值。
异步 Select
Select 组件可以配置为允许用户从异步填充的下拉列表中选择一个或多个选项。必须将 loadOptions
prop 设置为一个函数,该函数返回一个 Promise,该 Promise 解析为一个选项数组。可以使用 defaultOptions
prop 提供在用户开始输入之前显示的选项。在这种情况下,选项会在组件挂载时加载。可以使用 cacheOptions
prop 缓存异步加载的选项。
const loadAsyncOptions = (inputValue: string) => { return new Promise<Array<SelectableValue<string>>>((resolve) => { setTimeout(() => { resolve([ { label: 'Option 1', value: '1' }, { label: 'Option 2', value: '2' }, { label: 'Option 3', value: '3' }, ]); }, 1000); }); }; const BasicSelectAsync = () => { const [value, setValue] = React.useState<SelectableValue<string>>(); return ( <Container> <AsyncSelect loadOptions={loadAsyncOptions} defaultOptions value={value} onChange={setValue} /> </Container> ); }; render(<BasicSelectAsync />);
创建自定义值
Select 组件可以配置为允许用户创建新选项。必须将 allowCustomValue
prop 设置为 true 来启用此行为。此外,必须将 onCreateOption
prop 设置为一个函数,该函数在用户创建新选项时调用。
const CustomValueCreation = () => { const [value, setValue] = React.useState<SelectableValue<string>>(); const [customOptions, setCustomOptions] = React.useState<Array<SelectableValue<string>>>([]); const options = [ { label: 'Option 1', value: '1' }, { label: 'Option 2', value: '2' }, { label: 'Option 3', value: '3' }, ]; return ( <Container> <Select options={[...options, ...customOptions]} value={value} onChange={(v) => { setValue(v); }} allowCustomValue onCreateOption={(v) => { const customValue: SelectableValue<string> = { value: v, label: v }; setCustomOptions([...customOptions, customValue]); setValue(customValue); }} /> </Container> ); }; render(<CustomValueCreation />);
虚拟化选项列表
Select 组件可以配置为使用虚拟化选项列表。必须将 virtualized
prop 设置为 true 来启用此行为。可以使用 maxVisibleValues
prop 限制显示的选定值数量。可以使用 showAllSelectedWhenOpen
prop 在下拉列表打开时显示所有选定的值。可以使用 isClearable
prop 清除选定的值。可以使用 isLoading
prop 指示选择输入框处于加载状态。
向 Select 添加图标
可以使用 prefix
prop 向 Select 添加自定义图标,该图标将显示在选定值之前。
const SelectWithIcon = () => { const [value, setValue] = React.useState<SelectableValue<string>>(); return ( <Container> <Select options={[ { label: 'Option 1', value: '1' }, { label: 'Option 2', value: '2' }, { label: 'Option 3', value: '3' }, ]} value={value} onChange={setValue} prefix={<Icon name={'arrow-down'} />} /> </Container> ); }; render(<SelectWithIcon />);