Element-React Cascader 級(jí)聯(lián)選擇器

2020-10-16 10:30 更新

當(dāng)一個(gè)數(shù)據(jù)集合有清晰的層級(jí)結(jié)構(gòu)時(shí),可通過(guò)級(jí)聯(lián)選擇器逐級(jí)查看并選擇。

基礎(chǔ)用法

有兩種觸發(fā)子菜單的方式

只需為 Cascader 的options屬性指定選項(xiàng)數(shù)組即可渲染出一個(gè)級(jí)聯(lián)選擇器。通過(guò)expandTrigger可以定義展開(kāi)子級(jí)菜單的觸發(fā)方式。本例還展示了onChange事件,它的參數(shù)為 Cascader 的綁定值:一個(gè)由各級(jí)菜單的值所組成的數(shù)組。

constructor(props) {
  super(props);


  this.state = {
    options: [{
      value: 'zhinan',
      label: '指南',
      children: [{
        value: 'shejiyuanze',
        label: '設(shè)計(jì)原則',
        children: [{
          value: 'yizhi',
          label: '一致'
        }, {
          value: 'fankui',
          label: '反饋'
        }, {
          value: 'xiaolv',
          label: '效率'
        }, {
          value: 'kekong',
          label: '可控'
        }]
      }, {
        value: 'daohang',
        label: '導(dǎo)航',
        children: [{
          value: 'cexiangdaohang',
          label: '側(cè)向?qū)Ш?
        }, {
          value: 'dingbudaohang',
          label: '頂部導(dǎo)航'
        }]
      }]
    }, {
      value: 'zujian',
      label: '組件',
      children: [{
        value: 'basic',
        label: 'Basic',
        children: [{
          value: 'layout',
          label: 'Layout 布局'
        }, {
          value: 'color',
          label: 'Color 色彩'
        }, {
          value: 'typography',
          label: 'Typography 字體'
        }, {
          value: 'icon',
          label: 'Icon 圖標(biāo)'
        }, {
          value: 'button',
          label: 'Button 按鈕'
        }]
      }, {
        value: 'form',
        label: 'Form',
        children: [{
          value: 'radio',
          label: 'Radio 單選框'
        }, {
          value: 'checkbox',
          label: 'Checkbox 多選框'
        }, {
          value: 'input',
          label: 'Input 輸入框'
        }, {
          value: 'input-number',
          label: 'InputNumber 計(jì)數(shù)器'
        }, {
          value: 'select',
          label: 'Select 選擇器'
        }, {
          value: 'cascader',
          label: 'Cascader 級(jí)聯(lián)選擇器'
        }, {
          value: 'switch',
          label: 'Switch 開(kāi)關(guān)'
        }, {
          value: 'slider',
          label: 'Slider 滑塊'
        }, {
          value: 'time-picker',
          label: 'TimePicker 時(shí)間選擇器'
        }, {
          value: 'date-picker',
          label: 'DatePicker 日期選擇器'
        }, {
          value: 'datetime-picker',
          label: 'DateTimePicker 日期時(shí)間選擇器'
        }, {
          value: 'upload',
          label: 'Upload 上傳'
        }, {
          value: 'rate',
          label: 'Rate 評(píng)分'
        }, {
          value: 'form',
          label: 'Form 表單'
        }]
      }, {
        value: 'data',
        label: 'Data',
        children: [{
          value: 'table',
          label: 'Table 表格'
        }, {
          value: 'tag',
          label: 'Tag 標(biāo)簽'
        }, {
          value: 'progress',
          label: 'Progress 進(jìn)度條'
        }, {
          value: 'tree',
          label: 'Tree 樹(shù)形控件'
        }, {
          value: 'pagination',
          label: 'Pagination 分頁(yè)'
        }, {
          value: 'badge',
          label: 'Badge 標(biāo)記'
        }]
      }, {
        value: 'notice',
        label: 'Notice',
        children: [{
          value: 'alert',
          label: 'Alert 警告'
        }, {
          value: 'loading',
          label: 'Loading 加載'
        }, {
          value: 'message',
          label: 'Message 消息提示'
        }, {
          value: 'message-box',
          label: 'MessageBox 彈框'
        }, {
          value: 'notification',
          label: 'Notification 通知'
        }]
      }, {
        value: 'navigation',
        label: 'Navigation',
        children: [{
          value: 'menu',
          label: 'NavMenu 導(dǎo)航菜單'
        }, {
          value: 'tabs',
          label: 'Tabs 標(biāo)簽頁(yè)'
        }, {
          value: 'breadcrumb',
          label: 'Breadcrumb 面包屑'
        }, {
          value: 'dropdown',
          label: 'Dropdown 下拉菜單'
        }, {
          value: 'steps',
          label: 'Steps 步驟條'
        }]
      }, {
        value: 'others',
        label: 'Others',
        children: [{
          value: 'dialog',
          label: 'Dialog 對(duì)話框'
        }, {
          value: 'tooltip',
          label: 'Tooltip 文字提示'
        }, {
          value: 'popover',
          label: 'Popover 彈出框'
        }, {
          value: 'card',
          label: 'Card 卡片'
        }, {
          value: 'carousel',
          label: 'Carousel 走馬燈'
        }, {
          value: 'collapse',
          label: 'Collapse 折疊面板'
        }]
      }]
    }, {
      value: 'ziyuan',
      label: '資源',
      children: [{
        value: 'axure',
        label: 'Axure Components'
      }, {
        value: 'sketch',
        label: 'Sketch Templates'
      }, {
        value: 'jiaohu',
        label: '組件交互文檔'
      }]
    }],
    selectedOptions: [],
    selectedOptions2: []
  }
}


handleChange(key, value) {
  this.setState({ [key]: value });


  console.log(value);
}


render() {
  return (
    <div>
      <div className="block">
        <span className="demonstration">默認(rèn) click 觸發(fā)子菜單</span>
        <Cascader
          options={this.state.options}
          value={this.state.selectedOptions}
          onChange={this.handleChange.bind(this, 'selectedOptions')} />
      </div>
      <div className="block">
        <span className="demonstration">hover 觸發(fā)子菜單</span>
        <Cascader
          options={this.state.options}
          expandTrigger="hover"
          value={this.state.selectedOptions2}
          onChange={this.handleChange.bind(this, 'selectedOptions2')} />
      </div>
    </div>
  )
}

禁用選項(xiàng)

通過(guò)在數(shù)據(jù)源中設(shè)置 disabled 字段來(lái)聲明該選項(xiàng)是禁用的

本例中,options指定的數(shù)組中的第一個(gè)元素含有disabled: true鍵值對(duì),因此是禁用的。在默認(rèn)情況下,Cascader 會(huì)檢查數(shù)據(jù)中每一項(xiàng)的disabled字段是否為true,如果你的數(shù)據(jù)中表示禁用含義的字段名不為disabled,可以通過(guò)props屬性來(lái)指定(詳見(jiàn)下方 API 表格)。當(dāng)然,value、labelchildren這三個(gè)字段名也可以通過(guò)同樣的方式指定。

constructor(props) {
  super(props);


  this.state = {
    optionsWithDisabled: [{
      value: 'zhinan',
      label: '指南',
      disabled: true,
      children: [{
        value: 'shejiyuanze',
        label: '設(shè)計(jì)原則',
        children: [{
          value: 'yizhi',
          label: '一致'
        }, {
          value: 'fankui',
          label: '反饋'
        }, {
          value: 'xiaolv',
          label: '效率'
        }, {
          value: 'kekong',
          label: '可控'
        }]
      }, {
        value: 'daohang',
        label: '導(dǎo)航',
        children: [{
          value: 'cexiangdaohang',
          label: '側(cè)向?qū)Ш?
        }, {
          value: 'dingbudaohang',
          label: '頂部導(dǎo)航'
        }]
      }]
    }, {
      value: 'zujian',
      label: '組件',
      children: [{
        value: 'basic',
        label: 'Basic',
        children: [{
          value: 'layout',
          label: 'Layout 布局'
        }, {
          value: 'color',
          label: 'Color 色彩'
        }, {
          value: 'typography',
          label: 'Typography 字體'
        }, {
          value: 'icon',
          label: 'Icon 圖標(biāo)'
        }, {
          value: 'button',
          label: 'Button 按鈕'
        }]
      }, {
        value: 'form',
        label: 'Form',
        children: [{
          value: 'radio',
          label: 'Radio 單選框'
        }, {
          value: 'checkbox',
          label: 'Checkbox 多選框'
        }, {
          value: 'input',
          label: 'Input 輸入框'
        }, {
          value: 'input-number',
          label: 'InputNumber 計(jì)數(shù)器'
        }, {
          value: 'select',
          label: 'Select 選擇器'
        }, {
          value: 'cascader',
          label: 'Cascader 級(jí)聯(lián)選擇器'
        }, {
          value: 'switch',
          label: 'Switch 開(kāi)關(guān)'
        }, {
          value: 'slider',
          label: 'Slider 滑塊'
        }, {
          value: 'time-picker',
          label: 'TimePicker 時(shí)間選擇器'
        }, {
          value: 'date-picker',
          label: 'DatePicker 日期選擇器'
        }, {
          value: 'datetime-picker',
          label: 'DateTimePicker 日期時(shí)間選擇器'
        }, {
          value: 'upload',
          label: 'Upload 上傳'
        }, {
          value: 'rate',
          label: 'Rate 評(píng)分'
        }, {
          value: 'form',
          label: 'Form 表單'
        }]
      }, {
        value: 'data',
        label: 'Data',
        children: [{
          value: 'table',
          label: 'Table 表格'
        }, {
          value: 'tag',
          label: 'Tag 標(biāo)簽'
        }, {
          value: 'progress',
          label: 'Progress 進(jìn)度條'
        }, {
          value: 'tree',
          label: 'Tree 樹(shù)形控件'
        }, {
          value: 'pagination',
          label: 'Pagination 分頁(yè)'
        }, {
          value: 'badge',
          label: 'Badge 標(biāo)記'
        }]
      }, {
        value: 'notice',
        label: 'Notice',
        children: [{
          value: 'alert',
          label: 'Alert 警告'
        }, {
          value: 'loading',
          label: 'Loading 加載'
        }, {
          value: 'message',
          label: 'Message 消息提示'
        }, {
          value: 'message-box',
          label: 'MessageBox 彈框'
        }, {
          value: 'notification',
          label: 'Notification 通知'
        }]
      }, {
        value: 'navigation',
        label: 'Navigation',
        children: [{
          value: 'menu',
          label: 'NavMenu 導(dǎo)航菜單'
        }, {
          value: 'tabs',
          label: 'Tabs 標(biāo)簽頁(yè)'
        }, {
          value: 'breadcrumb',
          label: 'Breadcrumb 面包屑'
        }, {
          value: 'dropdown',
          label: 'Dropdown 下拉菜單'
        }, {
          value: 'steps',
          label: 'Steps 步驟條'
        }]
      }, {
        value: 'others',
        label: 'Others',
        children: [{
          value: 'dialog',
          label: 'Dialog 對(duì)話框'
        }, {
          value: 'tooltip',
          label: 'Tooltip 文字提示'
        }, {
          value: 'popover',
          label: 'Popover 彈出框'
        }, {
          value: 'card',
          label: 'Card 卡片'
        }, {
          value: 'carousel',
          label: 'Carousel 走馬燈'
        }, {
          value: 'collapse',
          label: 'Collapse 折疊面板'
        }]
      }]
    }, {
      value: 'ziyuan',
      label: '資源',
      children: [{
        value: 'axure',
        label: 'Axure Components'
      }, {
        value: 'sketch',
        label: 'Sketch Templates'
      }, {
        value: 'jiaohu',
        label: '組件交互文檔'
      }]
    }]
  };
}


render() {
  return (
    <Cascader
      options={this.state.optionsWithDisabled}
    />
  )
}

僅顯示最后一級(jí)

可以僅在輸入框中顯示選中項(xiàng)最后一級(jí)的標(biāo)簽,而不是選中項(xiàng)所在的完整路徑。

屬性show-all-levels定義了是否顯示完整的路徑,將其賦值為false則僅顯示最后一級(jí)

constructor(props) {
  super(props);


  this.state = {
    options: [{
      value: 'zhinan',
      label: '指南',
      children: [{
        value: 'shejiyuanze',
        label: '設(shè)計(jì)原則',
        children: [{
          value: 'yizhi',
          label: '一致'
        }, {
          value: 'fankui',
          label: '反饋'
        }, {
          value: 'xiaolv',
          label: '效率'
        }, {
          value: 'kekong',
          label: '可控'
        }]
      }, {
        value: 'daohang',
        label: '導(dǎo)航',
        children: [{
          value: 'cexiangdaohang',
          label: '側(cè)向?qū)Ш?
        }, {
          value: 'dingbudaohang',
          label: '頂部導(dǎo)航'
        }]
      }]
    }, {
      value: 'zujian',
      label: '組件',
      children: [{
        value: 'basic',
        label: 'Basic',
        children: [{
          value: 'layout',
          label: 'Layout 布局'
        }, {
          value: 'color',
          label: 'Color 色彩'
        }, {
          value: 'typography',
          label: 'Typography 字體'
        }, {
          value: 'icon',
          label: 'Icon 圖標(biāo)'
        }, {
          value: 'button',
          label: 'Button 按鈕'
        }]
      }, {
        value: 'form',
        label: 'Form',
        children: [{
          value: 'radio',
          label: 'Radio 單選框'
        }, {
          value: 'checkbox',
          label: 'Checkbox 多選框'
        }, {
          value: 'input',
          label: 'Input 輸入框'
        }, {
          value: 'input-number',
          label: 'InputNumber 計(jì)數(shù)器'
        }, {
          value: 'select',
          label: 'Select 選擇器'
        }, {
          value: 'cascader',
          label: 'Cascader 級(jí)聯(lián)選擇器'
        }, {
          value: 'switch',
          label: 'Switch 開(kāi)關(guān)'
        }, {
          value: 'slider',
          label: 'Slider 滑塊'
        }, {
          value: 'time-picker',
          label: 'TimePicker 時(shí)間選擇器'
        }, {
          value: 'date-picker',
          label: 'DatePicker 日期選擇器'
        }, {
          value: 'datetime-picker',
          label: 'DateTimePicker 日期時(shí)間選擇器'
        }, {
          value: 'upload',
          label: 'Upload 上傳'
        }, {
          value: 'rate',
          label: 'Rate 評(píng)分'
        }, {
          value: 'form',
          label: 'Form 表單'
        }]
      }, {
        value: 'data',
        label: 'Data',
        children: [{
          value: 'table',
          label: 'Table 表格'
        }, {
          value: 'tag',
          label: 'Tag 標(biāo)簽'
        }, {
          value: 'progress',
          label: 'Progress 進(jìn)度條'
        }, {
          value: 'tree',
          label: 'Tree 樹(shù)形控件'
        }, {
          value: 'pagination',
          label: 'Pagination 分頁(yè)'
        }, {
          value: 'badge',
          label: 'Badge 標(biāo)記'
        }]
      }, {
        value: 'notice',
        label: 'Notice',
        children: [{
          value: 'alert',
          label: 'Alert 警告'
        }, {
          value: 'loading',
          label: 'Loading 加載'
        }, {
          value: 'message',
          label: 'Message 消息提示'
        }, {
          value: 'message-box',
          label: 'MessageBox 彈框'
        }, {
          value: 'notification',
          label: 'Notification 通知'
        }]
      }, {
        value: 'navigation',
        label: 'Navigation',
        children: [{
          value: 'menu',
          label: 'NavMenu 導(dǎo)航菜單'
        }, {
          value: 'tabs',
          label: 'Tabs 標(biāo)簽頁(yè)'
        }, {
          value: 'breadcrumb',
          label: 'Breadcrumb 面包屑'
        }, {
          value: 'dropdown',
          label: 'Dropdown 下拉菜單'
        }, {
          value: 'steps',
          label: 'Steps 步驟條'
        }]
      }, {
        value: 'others',
        label: 'Others',
        children: [{
          value: 'dialog',
          label: 'Dialog 對(duì)話框'
        }, {
          value: 'tooltip',
          label: 'Tooltip 文字提示'
        }, {
          value: 'popover',
          label: 'Popover 彈出框'
        }, {
          value: 'card',
          label: 'Card 卡片'
        }, {
          value: 'carousel',
          label: 'Carousel 走馬燈'
        }, {
          value: 'collapse',
          label: 'Collapse 折疊面板'
        }]
      }]
    }, {
      value: 'ziyuan',
      label: '資源',
      children: [{
        value: 'axure',
        label: 'Axure Components'
      }, {
        value: 'sketch',
        label: 'Sketch Templates'
      }, {
        value: 'jiaohu',
        label: '組件交互文檔'
      }]
    }]
  }
}


render() {
  return (
    <Cascader
      options={this.state.options}
      showAllLevels={false}
    />
  )
}

默認(rèn)值

默認(rèn)值通過(guò)數(shù)組的方式指定。

constructor(props) {
  super(props);


  this.state = {
    options: [{
      value: 'zhinan',
      label: '指南',
      children: [{
        value: 'shejiyuanze',
        label: '設(shè)計(jì)原則',
        children: [{
          value: 'yizhi',
          label: '一致'
        }, {
          value: 'fankui',
          label: '反饋'
        }, {
          value: 'xiaolv',
          label: '效率'
        }, {
          value: 'kekong',
          label: '可控'
        }]
      }, {
        value: 'daohang',
        label: '導(dǎo)航',
        children: [{
          value: 'cexiangdaohang',
          label: '側(cè)向?qū)Ш?
        }, {
          value: 'dingbudaohang',
          label: '頂部導(dǎo)航'
        }]
      }]
    }, {
      value: 'zujian',
      label: '組件',
      children: [{
        value: 'basic',
        label: 'Basic',
        children: [{
          value: 'layout',
          label: 'Layout 布局'
        }, {
          value: 'color',
          label: 'Color 色彩'
        }, {
          value: 'typography',
          label: 'Typography 字體'
        }, {
          value: 'icon',
          label: 'Icon 圖標(biāo)'
        }, {
          value: 'button',
          label: 'Button 按鈕'
        }]
      }, {
        value: 'form',
        label: 'Form',
        children: [{
          value: 'radio',
          label: 'Radio 單選框'
        }, {
          value: 'checkbox',
          label: 'Checkbox 多選框'
        }, {
          value: 'input',
          label: 'Input 輸入框'
        }, {
          value: 'input-number',
          label: 'InputNumber 計(jì)數(shù)器'
        }, {
          value: 'select',
          label: 'Select 選擇器'
        }, {
          value: 'cascader',
          label: 'Cascader 級(jí)聯(lián)選擇器'
        }, {
          value: 'switch',
          label: 'Switch 開(kāi)關(guān)'
        }, {
          value: 'slider',
          label: 'Slider 滑塊'
        }, {
          value: 'time-picker',
          label: 'TimePicker 時(shí)間選擇器'
        }, {
          value: 'date-picker',
          label: 'DatePicker 日期選擇器'
        }, {
          value: 'datetime-picker',
          label: 'DateTimePicker 日期時(shí)間選擇器'
        }, {
          value: 'upload',
          label: 'Upload 上傳'
        }, {
          value: 'rate',
          label: 'Rate 評(píng)分'
        }, {
          value: 'form',
          label: 'Form 表單'
        }]
      }, {
        value: 'data',
        label: 'Data',
        children: [{
          value: 'table',
          label: 'Table 表格'
        }, {
          value: 'tag',
          label: 'Tag 標(biāo)簽'
        }, {
          value: 'progress',
          label: 'Progress 進(jìn)度條'
        }, {
          value: 'tree',
          label: 'Tree 樹(shù)形控件'
        }, {
          value: 'pagination',
          label: 'Pagination 分頁(yè)'
        }, {
          value: 'badge',
          label: 'Badge 標(biāo)記'
        }]
      }, {
        value: 'notice',
        label: 'Notice',
        children: [{
          value: 'alert',
          label: 'Alert 警告'
        }, {
          value: 'loading',
          label: 'Loading 加載'
        }, {
          value: 'message',
          label: 'Message 消息提示'
        }, {
          value: 'message-box',
          label: 'MessageBox 彈框'
        }, {
          value: 'notification',
          label: 'Notification 通知'
        }]
      }, {
        value: 'navigation',
        label: 'Navigation',
        children: [{
          value: 'menu',
          label: 'NavMenu 導(dǎo)航菜單'
        }, {
          value: 'tabs',
          label: 'Tabs 標(biāo)簽頁(yè)'
        }, {
          value: 'breadcrumb',
          label: 'Breadcrumb 面包屑'
        }, {
          value: 'dropdown',
          label: 'Dropdown 下拉菜單'
        }, {
          value: 'steps',
          label: 'Steps 步驟條'
        }]
      }, {
        value: 'others',
        label: 'Others',
        children: [{
          value: 'dialog',
          label: 'Dialog 對(duì)話框'
        }, {
          value: 'tooltip',
          label: 'Tooltip 文字提示'
        }, {
          value: 'popover',
          label: 'Popover 彈出框'
        }, {
          value: 'card',
          label: 'Card 卡片'
        }, {
          value: 'carousel',
          label: 'Carousel 走馬燈'
        }, {
          value: 'collapse',
          label: 'Collapse 折疊面板'
        }]
      }]
    }, {
      value: 'ziyuan',
      label: '資源',
      children: [{
        value: 'axure',
        label: 'Axure Components'
      }, {
        value: 'sketch',
        label: 'Sketch Templates'
      }, {
        value: 'jiaohu',
        label: '組件交互文檔'
      }]
    }],
    selectedOptions3: ['zujian', 'data', 'tag']
  }
}


render() {
  return (
    <Cascader
      options={this.state.options}
      value={this.state.selectedOptions3}
    />
  )
}

選擇即改變

點(diǎn)擊或移入選項(xiàng)即表示選中該項(xiàng),可用于選擇任意一級(jí)菜單的選項(xiàng)。

若需要允許用戶選擇任意一級(jí)選項(xiàng),則可將change-on-select賦值為true

constructor(props) {
  super(props);


  this.state = {
    options: [{
      value: 'zhinan',
      label: '指南',
      children: [{
        value: 'shejiyuanze',
        label: '設(shè)計(jì)原則',
        children: [{
          value: 'yizhi',
          label: '一致'
        }, {
          value: 'fankui',
          label: '反饋'
        }, {
          value: 'xiaolv',
          label: '效率'
        }, {
          value: 'kekong',
          label: '可控'
        }]
      }, {
        value: 'daohang',
        label: '導(dǎo)航',
        children: [{
          value: 'cexiangdaohang',
          label: '側(cè)向?qū)Ш?
        }, {
          value: 'dingbudaohang',
          label: '頂部導(dǎo)航'
        }]
      }]
    }, {
      value: 'zujian',
      label: '組件',
      children: [{
        value: 'basic',
        label: 'Basic',
        children: [{
          value: 'layout',
          label: 'Layout 布局'
        }, {
          value: 'color',
          label: 'Color 色彩'
        }, {
          value: 'typography',
          label: 'Typography 字體'
        }, {
          value: 'icon',
          label: 'Icon 圖標(biāo)'
        }, {
          value: 'button',
          label: 'Button 按鈕'
        }]
      }, {
        value: 'form',
        label: 'Form',
        children: [{
          value: 'radio',
          label: 'Radio 單選框'
        }, {
          value: 'checkbox',
          label: 'Checkbox 多選框'
        }, {
          value: 'input',
          label: 'Input 輸入框'
        }, {
          value: 'input-number',
          label: 'InputNumber 計(jì)數(shù)器'
        }, {
          value: 'select',
          label: 'Select 選擇器'
        }, {
          value: 'cascader',
          label: 'Cascader 級(jí)聯(lián)選擇器'
        }, {
          value: 'switch',
          label: 'Switch 開(kāi)關(guān)'
        }, {
          value: 'slider',
          label: 'Slider 滑塊'
        }, {
          value: 'time-picker',
          label: 'TimePicker 時(shí)間選擇器'
        }, {
          value: 'date-picker',
          label: 'DatePicker 日期選擇器'
        }, {
          value: 'datetime-picker',
          label: 'DateTimePicker 日期時(shí)間選擇器'
        }, {
          value: 'upload',
          label: 'Upload 上傳'
        }, {
          value: 'rate',
          label: 'Rate 評(píng)分'
        }, {
          value: 'form',
          label: 'Form 表單'
        }]
      }, {
        value: 'data',
        label: 'Data',
        children: [{
          value: 'table',
          label: 'Table 表格'
        }, {
          value: 'tag',
          label: 'Tag 標(biāo)簽'
        }, {
          value: 'progress',
          label: 'Progress 進(jìn)度條'
        }, {
          value: 'tree',
          label: 'Tree 樹(shù)形控件'
        }, {
          value: 'pagination',
          label: 'Pagination 分頁(yè)'
        }, {
          value: 'badge',
          label: 'Badge 標(biāo)記'
        }]
      }, {
        value: 'notice',
        label: 'Notice',
        children: [{
          value: 'alert',
          label: 'Alert 警告'
        }, {
          value: 'loading',
          label: 'Loading 加載'
        }, {
          value: 'message',
          label: 'Message 消息提示'
        }, {
          value: 'message-box',
          label: 'MessageBox 彈框'
        }, {
          value: 'notification',
          label: 'Notification 通知'
        }]
      }, {
        value: 'navigation',
        label: 'Navigation',
        children: [{
          value: 'menu',
          label: 'NavMenu 導(dǎo)航菜單'
        }, {
          value: 'tabs',
          label: 'Tabs 標(biāo)簽頁(yè)'
        }, {
          value: 'breadcrumb',
          label: 'Breadcrumb 面包屑'
        }, {
          value: 'dropdown',
          label: 'Dropdown 下拉菜單'
        }, {
          value: 'steps',
          label: 'Steps 步驟條'
        }]
      }, {
        value: 'others',
        label: 'Others',
        children: [{
          value: 'dialog',
          label: 'Dialog 對(duì)話框'
        }, {
          value: 'tooltip',
          label: 'Tooltip 文字提示'
        }, {
          value: 'popover',
          label: 'Popover 彈出框'
        }, {
          value: 'card',
          label: 'Card 卡片'
        }, {
          value: 'carousel',
          label: 'Carousel 走馬燈'
        }, {
          value: 'collapse',
          label: 'Collapse 折疊面板'
        }]
      }]
    }, {
      value: 'ziyuan',
      label: '資源',
      children: [{
        value: 'axure',
        label: 'Axure Components'
      }, {
        value: 'sketch',
        label: 'Sketch Templates'
      }, {
        value: 'jiaohu',
        label: '組件交互文檔'
      }]
    }]
  };
}


render() {
  return (
    <Cascader
      options={this.state.options}
      changeOnSelect={true}
    />
  )
}

動(dòng)態(tài)加載次級(jí)選項(xiàng)

當(dāng)選中某一級(jí)時(shí),動(dòng)態(tài)加載該級(jí)下的選項(xiàng)。

本例的選項(xiàng)數(shù)據(jù)源在初始化時(shí)不包含城市數(shù)據(jù)。利用active-item-change事件,可以在用戶點(diǎn)擊某個(gè)省份時(shí)拉取該省份下的城市數(shù)據(jù)。此外,本例還展示了props屬性的用法。

constructor(props) {
  super(props);


  this.state = {
    options2: [{
      label: '江蘇',
      cities: []
    }, {
      label: '浙江',
      cities: []
    }],
    props: {
      value: 'label',
      children: 'cities'
    }
  };
}


handleItemChange(val) {
  console.log('active item:', val);


  setTimeout(() => {
    if (val.indexOf('江蘇') > -1 && !this.state.options2[0].cities.length) {
      this.state.options2[0].cities = [{
        label: '南京'
      }];
    } else if (val.indexOf('浙江') > -1 && !this.state.options2[1].cities.length) {
      this.state.options2[1].cities = [{
        label: '杭州'
      }];
    }


    this.forceUpdate();
  }, 300);
}


render() {
  return (
    <Cascader
      props={this.state.props}
      options={this.state.options2}
      activeItemChange={this.handleItemChange.bind(this)}
    />
  )
}

可搜索

可以快捷地搜索選項(xiàng)并選擇。

filterable賦值為true即可打開(kāi)搜索功能。

constructor(props) {
  super(props);


  this.state = {
    options: [{
      value: 'zhinan',
      label: '指南',
      children: [{
        value: 'shejiyuanze',
        label: '設(shè)計(jì)原則',
        children: [{
          value: 'yizhi',
          label: '一致'
        }, {
          value: 'fankui',
          label: '反饋'
        }, {
          value: 'xiaolv',
          label: '效率'
        }, {
          value: 'kekong',
          label: '可控'
        }]
      }, {
        value: 'daohang',
        label: '導(dǎo)航',
        children: [{
          value: 'cexiangdaohang',
          label: '側(cè)向?qū)Ш?
        }, {
          value: 'dingbudaohang',
          label: '頂部導(dǎo)航'
        }]
      }]
    }, {
      value: 'zujian',
      label: '組件',
      children: [{
        value: 'basic',
        label: 'Basic',
        children: [{
          value: 'layout',
          label: 'Layout 布局'
        }, {
          value: 'color',
          label: 'Color 色彩'
        }, {
          value: 'typography',
          label: 'Typography 字體'
        }, {
          value: 'icon',
          label: 'Icon 圖標(biāo)'
        }, {
          value: 'button',
          label: 'Button 按鈕'
        }]
      }, {
        value: 'form',
        label: 'Form',
        children: [{
          value: 'radio',
          label: 'Radio 單選框'
        }, {
          value: 'checkbox',
          label: 'Checkbox 多選框'
        }, {
          value: 'input',
          label: 'Input 輸入框'
        }, {
          value: 'input-number',
          label: 'InputNumber 計(jì)數(shù)器'
        }, {
          value: 'select',
          label: 'Select 選擇器'
        }, {
          value: 'cascader',
          label: 'Cascader 級(jí)聯(lián)選擇器'
        }, {
          value: 'switch',
          label: 'Switch 開(kāi)關(guān)'
        }, {
          value: 'slider',
          label: 'Slider 滑塊'
        }, {
          value: 'time-picker',
          label: 'TimePicker 時(shí)間選擇器'
        }, {
          value: 'date-picker',
          label: 'DatePicker 日期選擇器'
        }, {
          value: 'datetime-picker',
          label: 'DateTimePicker 日期時(shí)間選擇器'
        }, {
          value: 'upload',
          label: 'Upload 上傳'
        }, {
          value: 'rate',
          label: 'Rate 評(píng)分'
        }, {
          value: 'form',
          label: 'Form 表單'
        }]
      }, {
        value: 'data',
        label: 'Data',
        children: [{
          value: 'table',
          label: 'Table 表格'
        }, {
          value: 'tag',
          label: 'Tag 標(biāo)簽'
        }, {
          value: 'progress',
          label: 'Progress 進(jìn)度條'
        }, {
          value: 'tree',
          label: 'Tree 樹(shù)形控件'
        }, {
          value: 'pagination',
          label: 'Pagination 分頁(yè)'
        }, {
          value: 'badge',
          label: 'Badge 標(biāo)記'
        }]
      }, {
        value: 'notice',
        label: 'Notice',
        children: [{
          value: 'alert',
          label: 'Alert 警告'
        }, {
          value: 'loading',
          label: 'Loading 加載'
        }, {
          value: 'message',
          label: 'Message 消息提示'
        }, {
          value: 'message-box',
          label: 'MessageBox 彈框'
        }, {
          value: 'notification',
          label: 'Notification 通知'
        }]
      }, {
        value: 'navigation',
        label: 'Navigation',
        children: [{
          value: 'menu',
          label: 'NavMenu 導(dǎo)航菜單'
        }, {
          value: 'tabs',
          label: 'Tabs 標(biāo)簽頁(yè)'
        }, {
          value: 'breadcrumb',
          label: 'Breadcrumb 面包屑'
        }, {
          value: 'dropdown',
          label: 'Dropdown 下拉菜單'
        }, {
          value: 'steps',
          label: 'Steps 步驟條'
        }]
      }, {
        value: 'others',
        label: 'Others',
        children: [{
          value: 'dialog',
          label: 'Dialog 對(duì)話框'
        }, {
          value: 'tooltip',
          label: 'Tooltip 文字提示'
        }, {
          value: 'popover',
          label: 'Popover 彈出框'
        }, {
          value: 'card',
          label: 'Card 卡片'
        }, {
          value: 'carousel',
          label: 'Carousel 走馬燈'
        }, {
          value: 'collapse',
          label: 'Collapse 折疊面板'
        }]
      }]
    }, {
      value: 'ziyuan',
      label: '資源',
      children: [{
        value: 'axure',
        label: 'Axure Components'
      }, {
        value: 'sketch',
        label: 'Sketch Templates'
      }, {
        value: 'jiaohu',
        label: '組件交互文檔'
      }]
    }]
  }
}


render() {
  return (
    <div>
      <div className="block">
        <span className="demonstration">只可選擇最后一級(jí)菜單的選項(xiàng)</span>
        <Cascader
          placeholder="試試搜索:指南"
          options={this.state.options}
          filterable={true}
        />
      </div>
      <div className="block">
        <span className="demonstration">可選擇任意一級(jí)菜單的選項(xiàng)</span>
        <Cascader
          placeholder="試試搜索:指南"
          options={this.state.options}
          filterable={true}
          changeOnSelect={true}
        />
      </div>
    </div>
  )
}

隱藏代碼

Attributes

參數(shù) 說(shuō)明 類型 可選值 默認(rèn)值
options 可選項(xiàng)數(shù)據(jù)源,鍵名可通過(guò) props 屬性配置 array
props 配置選項(xiàng),具體見(jiàn)下表 object
value 選中項(xiàng)綁定值 array
popperClass 自定義浮層類名 string
placeholder 輸入框占位文本 string 請(qǐng)選擇
disabled 是否禁用 boolean false
clearable 是否支持清空選項(xiàng) boolean false
expandTrigger 次級(jí)菜單的展開(kāi)方式 string click / hover click
showAllLevels 輸入框中是否顯示選中值的完整路徑 boolean true
filterable 是否可搜索選項(xiàng) boolean
debounce 搜索關(guān)鍵詞輸入的去抖延遲,毫秒 number 300
changeOnSelect 是否允許選擇任意一級(jí)的選項(xiàng) boolean false
size 尺寸 string large / small / mini
beforeFilter 可選參數(shù), 篩選之前的鉤子,參數(shù)為輸入的值,若返回 false 或者返回 Promise 且被 reject,則停止篩選。 function(value)

props

參數(shù) 說(shuō)明 類型 可選值 默認(rèn)值
value 指定選項(xiàng)的值為選項(xiàng)對(duì)象的某個(gè)屬性值 string
label 指定選項(xiàng)標(biāo)簽為選項(xiàng)對(duì)象的某個(gè)屬性值 string
children 指定選項(xiàng)的子選項(xiàng)為選項(xiàng)對(duì)象的某個(gè)屬性值 string
disabled 指定選項(xiàng)的禁用為選項(xiàng)對(duì)象的某個(gè)屬性值 string

Events

事件名稱 說(shuō)明 回調(diào)參數(shù)
change 當(dāng)綁定值變化時(shí)觸發(fā)的事件 當(dāng)前值
activeItemChange 當(dāng)父級(jí)選項(xiàng)變化時(shí)觸發(fā)的事件,僅在 change-on-select 為 false 時(shí)可用 各父級(jí)選項(xiàng)組成的數(shù)組
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)