UNPKG

@ray-js/smart-ui

Version:

轻量、可靠的智能小程序 UI 组件库

326 lines (290 loc) 11.1 kB
--- category: 数据录入 --- # Cascader 级联选择 ### 介绍 级联选择框,用于多层级数据的选择,典型场景为省市区选择。 ### 引入 ```jsx import { Cascader } from '@ray-js/smart-ui'; ``` ## 代码演示 ### 基础用法 级联选择组件可以搭配 Field 和 BottomSheet 组件使用,示例如下: ```jsx import { Cascader, Field, Popup } from '@ray-js/smart-ui'; import React, { useCallback, useState } from 'react'; const options = [ { text: '浙江省', value: '330000', className: 'test', options: [ { text: '杭州市', value: '330100', options: [ { text: '上城区', value: '330102', }, { text: '下城区', value: '330103', }, { text: '江干区', value: '330104', }, ], }, ], }, ]; export default function Demo() { const [visible, setVisible] = useState(false); const [result, setResult] = useState(''); const [value, setValue] = useState(''); const showArea = useCallback(() => { setVisible(true); }, []); const onClose = useCallback(() => { setVisible(false); }, []); const onFinish = useCallback(() => { const { selectedOptions, value } = e.detail; const result = selectedOptions.map(option => option.text).join('/'); setValue(value); setResult(result); setVisible(false); }, []); return ( <> <Field value={result} isLink readonly label="地区" placeholder="请选择地区" onTap={showArea} /> <BottomSheet show={visible} maxHeight="100%"> {visible && ( <Cascader value={value} title="请选择地区" options={options} onClose={onClose} onFinish={onFinish} /> )} </BottomSheet> </> ); } ``` ### 自定义颜色 通过 `active-color` 属性来设置选中状态的高亮颜色。 ```jsx import { Cascader, Field, BottomSheet } from '@ray-js/smart-ui'; import React, { useCallback, useState } from 'react'; const options = [ { text: '浙江省', value: '330000', className: 'test', options: [ { text: '杭州市', value: '330100', options: [ { text: '上城区', value: '330102', }, { text: '下城区', value: '330103', }, { text: '江干区', value: '330104', }, ], }, ], }, ]; export default function Demo() { const [visible, setVisible] = useState(false); const [result, setResult] = useState(''); const [value, setValue] = useState(''); const showArea = useCallback(() => { setVisible(true); }, []); const onClose = useCallback(() => { setVisible(false); }, []); const onFinish = useCallback(() => { const { selectedOptions, value } = e.detail; const result = selectedOptions.map(option => option.text).join('/'); setValue(value); setResult(result); setVisible(false); }, []); return ( <> <Field value={result} isLink readonly label="地区" placeholder="请选择地区" onTap={showArea} /> <BottomSheet show={visible} maxHeight="100%"> {visible && ( <Cascader activeColor="#ee0a24" value={value} title="请选择地区" options={options} onClose={onClose} onFinish={onFinish} /> )} </BottomSheet> </> ); } ``` ### 异步加载选项 可以监听 `change` 事件并动态设置 `options`,实现异步加载选项。 ```jsx import { Cascader, Field, BottomSheet } from '@ray-js/smart-ui'; import React, { useCallback, useState } from 'react'; const asyncOptions2 = [ { text: '杭州市', value: '330100' }, { text: '宁波市', value: '330200' }, ]; export default function Demo() { const [visible, setVisible] = useState(false); const [result, setResult] = useState(''); const [value, setValue] = useState(''); const [options, setOptions] = useState([ { text: '浙江省', value: '330000', options: [], }, ]); const showArea = useCallback(() => { setVisible(true); }, []); const onClose = useCallback(() => { setVisible(false); }, []); const onFinish = useCallback(() => { const { selectedOptions, value } = e.detail; const result = selectedOptions.map(option => option.text).join('/'); setValue(value); setResult(result); setVisible(false); }, []); const loadDynamicOptions = useCallback( e => { const { value } = e.detail; if (value === '330000') { const data = [...options]; data[0].options = asyncOptions2; setTimeout(() => { setOptions(data); }, 500); } }, [options] ); return ( <> <Field value={result} isLink readonly label="地区" placeholder="请选择地区" onTap={showArea} /> <BottomSheet show={visible} maxHeight="100%"> {visible && ( <Cascader value={value} options={options} title="请选择地区" onClose={onClose} onFinish={onFinish} onChange={loadDynamicOptions} /> )} </BottomSheet> </> ); } ``` ## API ### Props | 参数 | 说明 | 类型 | 默认值 | | --------------- | -------------------------------------------------------------- | ------------------ | --------- | | activeColor | 选中状态的高亮颜色 | _string_ | `#1989fa` | | closeIcon | 关闭图标svg值或图片链接,等同于 Icon 组件的 [name 属性](/material/smartui?comId=icon) | _string_ | `cross` | | closeIconAriaLabel `v2.13.0` | 关闭按钮的无障碍读屏文案,透传至内部 `smart-icon` 的 `aria-label` | _string_ | - | | closeable | 是否显示关闭图标 | _boolean_ | `true` | | ellipsis | 是否省略过长的标题文字, 关闭后文字过长会出现横向滚动 | _boolean_ | `true` | | options | 可选项数据源 | _CascaderOption[]_ | `[]` | | placeholder | 未选中时的提示文案 | _string_ | `请选择` | | showHeader | 是否展示标题栏 | _boolean_ | `true` | | swipeThreshold | 滚动阈值,标签数量超过阈值且总宽度超过标签栏宽度时开始横向滚动 | _number_ | `5` | | swipeable | 是否开启手势左右滑动切换 | _boolean_ | `false` | | title | 顶部标题 | _string_ | - | | useTitleSlot | 是否使用自定义标题的插槽 | _boolean_ | `false` | | value | 选中项的值 | _string \| number_ | - | ### CascaderOption 数据结构 `options` 属性是一个由对象构成的数组,数组中的每个对象配置一个可选项,对象可以包含以下值: | 键名 | 说明 | 类型 | | --------- | ------------------------ | --------------------------- | | className | 为对应列添加额外的 class | _string \| Array \| object_ | | color | 选项文字颜色 | _string_ | | disabled | 是否禁用选项 | _boolean_ | | options | 子选项列表 | _CascaderOption[]_ | | text | 选项文字(必填) | _string_ | | value | 选项对应的值(必填) | _string \| number_ | ### Events | 事件 | 说明 | 回调参数 | | -------------- | ---------------------- | ------------------------------------------------------------------------------------------------ | | onChange | 选中项变化时触发 | event.detail_{ value: string \| number, selectedOptions: CascaderOption[], tabIndex: number }_ | | onClickTab | 点击标签时触发 | event.detail:_{ tabIndex: number, title: string }_ | | onClose | 点击关闭图标时触发 | - | | onFinish | 全部选项选择完成后触发 | event.detail:_{ value: string \| number, selectedOptions: CascaderOption[], tabIndex: number }_ | ### Slots | 名称 | 说明 | 参数 | | ----- | -------------- | ---- | | title | 自定义顶部标题 | - | ### 样式变量 组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](/material/smartui?comId=config-provider)。 | 名称 | 默认值 | 描述 | | ------------------------------------- | ---------------------------------------- | ---------------------------------------- | | --cascader-header-height | _48px_ | 级联选择器头部高度 | | --cascader-header-padding | _0 16px_ | 级联选择器头部内边距 | | --cascader-title-font-size | _16px_ | 级联选择器标题字体大小 | | --cascader-title-line-height | _20px_ | 级联选择器标题行高 | | --cascader-close-icon-size | _22px_ | 级联选择器关闭图标大小 | | --cascader-close-icon-color | _#c8c9cc_ | 级联选择器关闭图标颜色 | | --cascader-selected-icon-size | _18px_ | 级联选择器选中图标大小 | | --cascader-tabs-height | _48px_ | 级联选择器标签栏高度 | | --cascader-active-color | _#1989fa_ | 级联选择器激活项颜色 | | --cascader-options-height | _384px_ | 级联选择器选项高度 | | --cascader-option-disabled-color | _#c8c9cc_ | 级联选择器禁用选项颜色 | | --cascader-tab-color | _var(--app-B6-N1, rgba(0, 0, 0, 1))_ | 级联选择器标签颜色 | | --cascader-unselected-tab-color | _#969799_ | 级联选择器未选中标签颜色 | | --cascader-tab-inactive-color | _var(--app-B6-N5, rgba(0, 0, 0, 0.3))_ | 级联选择器标签未激活颜色 | | --cascader-text-color | _var(--app-B6-N5, rgba(0, 0, 0, 0.3))_ | 级联选择器文本颜色 | | --cascader-active-background-color `v2.8.0` | _var(--app-B1, #f6f7fb)_ | 级联选择器列点击时背景色 |