Cascader级联选择

级联选择框。

何时使用

  • 需要从一组相关联的数据集合进行选择,例如省市区,公司层级,事物分类等。

  • 从一个较大的数据集合中进行选择时,用多级分类进行分隔,方便选择。

  • 比起 Select 组件,可以在同一个浮层中完成选择,有较好的体验。

代码演示

Cascader 级联选择 - 图1

基本

省市区级联。

  1. import { Cascader } from 'choerodon-ui';
  2. const options = [{
  3. value: 'zhejiang',
  4. label: 'Zhejiang',
  5. children: [{
  6. value: 'hangzhou',
  7. label: 'Hangzhou',
  8. children: [{
  9. value: 'xihu',
  10. label: 'West Lake',
  11. }],
  12. }],
  13. }, {
  14. value: 'jiangsu',
  15. label: 'Jiangsu',
  16. children: [{
  17. value: 'nanjing',
  18. label: 'Nanjing',
  19. children: [{
  20. value: 'zhonghuamen',
  21. label: 'Zhong Hua Men',
  22. }],
  23. }],
  24. }];
  25. function onChange(value) {
  26. console.log(value);
  27. }
  28. ReactDOM.render(
  29. <Cascader label="cascader" options={options} onChange={onChange} placeholder="Please select" />,
  30. mountNode);

Cascader 级联选择 - 图2

可以自定义显示

切换按钮和结果分开。

  1. import { Cascader } from 'choerodon-ui';
  2. const options = [{
  3. value: 'zhejiang',
  4. label: 'Zhejiang',
  5. children: [{
  6. value: 'hangzhou',
  7. label: 'Hangzhou',
  8. }],
  9. }, {
  10. value: 'jiangsu',
  11. label: 'Jiangsu',
  12. children: [{
  13. value: 'nanjing',
  14. label: 'Nanjing',
  15. }],
  16. }];
  17. class CitySwitcher extends React.Component {
  18. state = {
  19. text: 'Unselect',
  20. };
  21. onChange = (value, selectedOptions) => {
  22. this.setState({
  23. text: selectedOptions.map(o => o.label).join(', '),
  24. });
  25. }
  26. render() {
  27. return (
  28. <span>
  29. {this.state.text}
  30. &nbsp;
  31. <Cascader options={options} onChange={this.onChange}>
  32. <a href="#">Change city</a>
  33. </Cascader>
  34. </span>
  35. );
  36. }
  37. }
  38. ReactDOM.render(<CitySwitcher />, mountNode);

Cascader 级联选择 - 图3

禁用选项

通过指定 options 里的 disabled 字段。

  1. import { Cascader } from 'choerodon-ui';
  2. const options = [{
  3. value: 'zhejiang',
  4. label: 'Zhejiang',
  5. children: [{
  6. value: 'hangzhou',
  7. label: 'Hangzhou',
  8. children: [{
  9. value: 'xihu',
  10. label: 'West Lake',
  11. }],
  12. }],
  13. }, {
  14. value: 'jiangsu',
  15. label: 'Jiangsu',
  16. disabled: true,
  17. children: [{
  18. value: 'nanjing',
  19. label: 'Nanjing',
  20. children: [{
  21. value: 'zhonghuamen',
  22. label: 'Zhong Hua Men',
  23. }],
  24. }],
  25. }];
  26. function onChange(value) {
  27. console.log(value);
  28. }
  29. ReactDOM.render(
  30. <Cascader options={options} onChange={onChange} />,
  31. mountNode);

Cascader 级联选择 - 图4

大小

不同大小的级联选择器。

  1. import { Cascader } from 'choerodon-ui';
  2. const options = [{
  3. value: 'zhejiang',
  4. label: 'Zhejiang',
  5. children: [{
  6. value: 'hangzhou',
  7. label: 'Hangzhou',
  8. children: [{
  9. value: 'xihu',
  10. label: 'West Lake',
  11. }],
  12. }],
  13. }, {
  14. value: 'jiangsu',
  15. label: 'Jiangsu',
  16. children: [{
  17. value: 'nanjing',
  18. label: 'Nanjing',
  19. children: [{
  20. value: 'zhonghuamen',
  21. label: 'Zhong Hua Men',
  22. }],
  23. }],
  24. }];
  25. function onChange(value) {
  26. console.log(value);
  27. }
  28. ReactDOM.render(
  29. <div>
  30. <Cascader size="large" options={options} onChange={onChange} /><br /><br />
  31. <Cascader options={options} onChange={onChange} /><br /><br />
  32. <Cascader size="small" options={options} onChange={onChange} /><br /><br />
  33. </div>,
  34. mountNode);

Cascader 级联选择 - 图5

搜索

可以直接搜索选项并选择。

Cascader[showSearch] 暂不支持服务端搜索

  1. import { Cascader } from 'choerodon-ui';
  2. const options = [
  3. {
  4. value: 'zhejiang',
  5. label: 'Zhejiang',
  6. children: [
  7. {
  8. value: 'hangzhou',
  9. label: 'Hangzhou',
  10. children: [
  11. {
  12. value: 'xihu',
  13. label: 'West Lake',
  14. },
  15. {
  16. value: 'xiasha',
  17. label: 'Xia Sha',
  18. disabled: true,
  19. },
  20. ],
  21. },
  22. ],
  23. },
  24. {
  25. value: 'jiangsu',
  26. label: 'Jiangsu',
  27. children: [
  28. {
  29. value: 'nanjing',
  30. label: 'Nanjing',
  31. children: [
  32. {
  33. value: 'zhonghuamen',
  34. label: 'Zhong Hua men',
  35. },
  36. ],
  37. },
  38. ],
  39. },
  40. ];
  41. function onChange(value, selectedOptions) {
  42. console.log(value, selectedOptions);
  43. }
  44. function filter(inputValue, path) {
  45. return path.some(option => option.label.toLowerCase().indexOf(inputValue.toLowerCase()) > -1);
  46. }
  47. ReactDOM.render(
  48. <Cascader
  49. options={options}
  50. onChange={onChange}
  51. placeholder="Please select"
  52. showSearch={{ filter }}
  53. />,
  54. mountNode,
  55. );

Cascader 级联选择 - 图6

默认值

默认值通过数组的方式指定。

  1. import { Cascader } from 'choerodon-ui';
  2. const options = [{
  3. value: 'zhejiang',
  4. label: 'Zhejiang',
  5. children: [{
  6. value: 'hangzhou',
  7. label: 'Hangzhou',
  8. children: [{
  9. value: 'xihu',
  10. label: 'West Lake',
  11. }],
  12. }],
  13. }, {
  14. value: 'jiangsu',
  15. label: 'Jiangsu',
  16. children: [{
  17. value: 'nanjing',
  18. label: 'Nanjing',
  19. children: [{
  20. value: 'zhonghuamen',
  21. label: 'Zhong Hua Men',
  22. }],
  23. }],
  24. }];
  25. function onChange(value) {
  26. console.log(value);
  27. }
  28. ReactDOM.render(
  29. <Cascader defaultValue={['zhejiang', 'hangzhou', 'xihu']} options={options} onChange={onChange} />,
  30. mountNode);

Cascader 级联选择 - 图7

移入展开

通过移入展开下级菜单,点击完成选择。

  1. import { Cascader } from 'choerodon-ui';
  2. const options = [{
  3. value: 'zhejiang',
  4. label: 'Zhejiang',
  5. children: [{
  6. value: 'hangzhou',
  7. label: 'Hangzhou',
  8. children: [{
  9. value: 'xihu',
  10. label: 'West Lake',
  11. }],
  12. }],
  13. }, {
  14. value: 'jiangsu',
  15. label: 'Jiangsu',
  16. children: [{
  17. value: 'nanjing',
  18. label: 'Nanjing',
  19. children: [{
  20. value: 'zhonghuamen',
  21. label: 'Zhong Hua Men',
  22. }],
  23. }],
  24. }];
  25. function onChange(value) {
  26. console.log(value);
  27. }
  28. // Just show the latest item.
  29. function displayRender(label) {
  30. return label[label.length - 1];
  31. }
  32. ReactDOM.render(
  33. <Cascader
  34. options={options}
  35. expandTrigger="hover"
  36. displayRender={displayRender}
  37. onChange={onChange}
  38. />,
  39. mountNode);

Cascader 级联选择 - 图8

选择即改变

这种交互允许只选中父级选项。

  1. import { Cascader } from 'choerodon-ui';
  2. const options = [{
  3. value: 'zhejiang',
  4. label: 'Zhejiang',
  5. children: [{
  6. value: 'hangzhou',
  7. label: 'Hanzhou',
  8. children: [{
  9. value: 'xihu',
  10. label: 'West Lake',
  11. }],
  12. }],
  13. }, {
  14. value: 'jiangsu',
  15. label: 'Jiangsu',
  16. children: [{
  17. value: 'nanjing',
  18. label: 'Nanjing',
  19. children: [{
  20. value: 'zhonghuamen',
  21. label: 'Zhong Hua Men',
  22. }],
  23. }],
  24. }];
  25. function onChange(value) {
  26. console.log(value);
  27. }
  28. ReactDOM.render(
  29. <Cascader options={options} onChange={onChange} changeOnSelect />,
  30. mountNode);

Cascader 级联选择 - 图9

自定义已选项

例如给最后一项加上邮编链接。

  1. import { Cascader } from 'choerodon-ui';
  2. const options = [{
  3. value: 'zhejiang',
  4. label: 'Zhejiang',
  5. children: [{
  6. value: 'hangzhou',
  7. label: 'Hangzhou',
  8. children: [{
  9. value: 'xihu',
  10. label: 'West Lake',
  11. code: 752100,
  12. }],
  13. }],
  14. }, {
  15. value: 'jiangsu',
  16. label: 'Jiangsu',
  17. children: [{
  18. value: 'nanjing',
  19. label: 'Nanjing',
  20. children: [{
  21. value: 'zhonghuamen',
  22. label: 'Zhong Hua Men',
  23. code: 453400,
  24. }],
  25. }],
  26. }];
  27. function handleAreaClick(e, label, option) {
  28. e.stopPropagation();
  29. console.log('clicked', label, option);
  30. }
  31. const displayRender = (labels, selectedOptions) => labels.map((label, i) => {
  32. const option = selectedOptions[i];
  33. if (i === labels.length - 1) {
  34. return (
  35. <span key={option.value}>
  36. {label} (<a onClick={e => handleAreaClick(e, label, option)}>{option.code}</a>)
  37. </span>
  38. );
  39. }
  40. return <span key={option.value}>{label} / </span>;
  41. });
  42. ReactDOM.render(
  43. <Cascader
  44. options={options}
  45. defaultValue={['zhejiang', 'hangzhou', 'xihu']}
  46. displayRender={displayRender}
  47. style={{ width: '100%' }}
  48. />,
  49. mountNode);

Cascader 级联选择 - 图10

动态加载选项

使用 loadData 实现动态加载选项。

注意:loadDatashowSearch 无法一起使用。

  1. import { Cascader } from 'choerodon-ui';
  2. const options = [{
  3. value: 'zhejiang',
  4. label: 'Zhejiang',
  5. isLeaf: false,
  6. }, {
  7. value: 'jiangsu',
  8. label: 'Jiangsu',
  9. isLeaf: false,
  10. }];
  11. class LazyOptions extends React.Component {
  12. state = {
  13. options,
  14. };
  15. onChange = (value, selectedOptions) => {
  16. console.log(value, selectedOptions);
  17. }
  18. loadData = (selectedOptions) => {
  19. const targetOption = selectedOptions[selectedOptions.length - 1];
  20. targetOption.loading = true;
  21. // load options lazily
  22. setTimeout(() => {
  23. targetOption.loading = false;
  24. targetOption.children = [{
  25. label: `${targetOption.label} Dynamic 1`,
  26. value: 'dynamic1',
  27. }, {
  28. label: `${targetOption.label} Dynamic 2`,
  29. value: 'dynamic2',
  30. }];
  31. this.setState({
  32. options: [...this.state.options],
  33. });
  34. }, 1000);
  35. }
  36. render() {
  37. return (
  38. <Cascader
  39. options={this.state.options}
  40. loadData={this.loadData}
  41. onChange={this.onChange}
  42. changeOnSelect
  43. />
  44. );
  45. }
  46. }
  47. ReactDOM.render(<LazyOptions />, mountNode);

API

  1. <Cascader options={options} onChange={onChange} />
参数说明类型默认值
allowClear是否支持清除booleantrue
autoFocus自动获取焦点booleanfalse
changeOnSelect当此项为 true 时,点选每级菜单选项值都会发生变化,具体见上面的演示booleanfalse
className自定义类名string-
defaultValue默认的选中项string[][]
disabled禁用booleanfalse
displayRender选择后展示的渲染函数(label, selectedOptions) => ReactNodelabel => label.join(' / ')
expandTrigger次级菜单的展开方式,可选 'click' 和 'hover'string'click'
getPopupContainer菜单渲染父节点。默认渲染到 body 上,如果你遇到菜单滚动定位问题,试试修改为滚动的区域,并相对其定位。示例Function(triggerNode)() => document.body
loadData用于动态加载选项,无法与 showSearch 一起使用(selectedOptions) => void-
notFoundContent当下拉列表为空时显示的内容string'Not Found'
options可选项数据源object-
placeholder输入框占位文本string'请选择'
popupClassName自定义浮层类名string-
popupPlacement浮层预设位置:bottomLeft bottomRight topLeft topRightEnumbottomLeft
popupVisible控制浮层显隐boolean-
showSearch在选择框中显示搜索框booleanfalse
size输入框大小,可选 large default smallstringdefault
style自定义样式string-
value指定选中项string[]-
onChange选择完成后的回调(value, selectedOptions) => void-
onPopupVisibleChange显示/隐藏浮层的回调(value) => void-

showSearch 为对象时,其中的字段:

参数说明类型默认值
filter接收 inputValue path 两个参数,当 path 符合筛选条件时,应返回 true,反之则返回 false。function(inputValue, path): boolean
matchInputWidth搜索结果列表是否与输入框同宽boolean
render用于渲染 filter 后的选项function(inputValue, path): ReactNode
sort用于排序 filter 后的选项function(a, b, inputValue)

方法

名称描述
blur()移除焦点
focus()获取焦点

注意,如果需要获得中国省市区数据,可以参考 china-division