From 7ec0b5330b4893d32d949532b1ad02c506c05e4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E7=81=8F?= Date: Wed, 10 May 2017 18:24:30 +0800 Subject: [PATCH] Cascader support search --- examples/routers/cascader.vue | 37 +++++++++-------- src/components/cascader/cascader.vue | 60 ++++++++++++++++++++++++++-- src/styles/components/cascader.less | 4 ++ 3 files changed, 82 insertions(+), 19 deletions(-) diff --git a/examples/routers/cascader.vue b/examples/routers/cascader.vue index c0b2565b..09e14d5d 100644 --- a/examples/routers/cascader.vue +++ b/examples/routers/cascader.vue @@ -2,8 +2,9 @@ + {{ v1 }} - + @@ -14,23 +15,26 @@ data () { return { v1: [], - data2: [{ - value: 'zhejiang', - label: '浙江', - children: [], - loading: false - }, { - value: 'jiangsu', - label: '江苏', - children: [{ - value: 'nanjing', - label: '南京', + data2: [ + { + value: 'zhejiang', + label: '浙江', + children: [], + loading: false + }, + { + value: 'jiangsu', + label: '江苏', children: [{ - value: 'zhonghuamen', - label: '中华门' + value: 'nanjing', + label: '南京', + children: [{ + value: 'zhonghuamen', + label: '中华门' + }] }] - }] - }], + } + ], data3: [{ value: 'beijing', label: '北京', @@ -67,6 +71,7 @@ label: '苏州', children: [ { + disabled: true, value: 'zhuozhengyuan', label: '拙政园', }, diff --git a/src/components/cascader/cascader.vue b/src/components/cascader/cascader.vue index fa5bb45b..5931facb 100644 --- a/src/components/cascader/cascader.vue +++ b/src/components/cascader/cascader.vue @@ -5,7 +5,8 @@ @@ -16,12 +17,23 @@
+
+
    +
  • {{ item.label }}
  • +
+
@@ -37,6 +49,7 @@ import Emitter from '../../mixins/emitter'; const prefixCls = 'ivu-cascader'; + const selectPrefixCls = 'ivu-select'; export default { name: 'Cascader', @@ -100,11 +113,13 @@ data () { return { prefixCls: prefixCls, + selectPrefixCls: selectPrefixCls, visible: false, selected: [], tmpSelected: [], updatingValue: false, // to fix set value in changeOnSelect type - currentValue: this.value + currentValue: this.value, + query: '' }; }, computed: { @@ -128,6 +143,32 @@ } return this.renderFormat(label, this.selected); + }, + querySelections () { + let selections = []; + function getSelections (arr, label, value) { + for (let i = 0; i < arr.length; i++) { + let item = arr[i]; + item.__label = label ? label + ' / ' + item.label : item.label; + item.__value = value ? value + ',' + item.value : item.value; + + if (item.children && item.children.length) { + getSelections(item.children, item.__label, item.__value); + delete item.__label; + delete item.__value; + } else { + selections.push({ + label: item.__label, + value: item.__value, + item: item, + disabled: !!item.disabled + }); + } + } + } + getSelections(this.data); + selections = selections.filter(item => item.label.indexOf(this.query) > -1); + return selections; } }, methods: { @@ -146,7 +187,7 @@ toggleOpen () { if (this.disabled) return false; if (this.visible) { - this.handleClose(); + if (!this.filterable) this.handleClose(); } else { this.onFocus(); } @@ -177,6 +218,19 @@ }); }); } + }, + handleInput (event) { + this.query = event.target.value; + }, + handleSelectItem (index) { + const item = this.querySelections[index]; + + if (item.item.disabled) return false; + this.query = ''; + const oldVal = JSON.stringify(this.currentValue); + this.currentValue = item.value.split(','); + this.emitValue(this.currentValue, oldVal); + this.handleClose(); } }, created () { diff --git a/src/styles/components/cascader.less b/src/styles/components/cascader.less index 8978f7cf..71a160e6 100644 --- a/src/styles/components/cascader.less +++ b/src/styles/components/cascader.less @@ -49,6 +49,10 @@ .select-item(@cascader-prefix-cls, @cascader-item-prefix-cls); + &-dropdown{ + padding: 5px 0; + } + &-menu{ display: inline-block; min-width: 100px;