Cascader support search

This commit is contained in:
梁灏 2017-05-10 18:24:30 +08:00
parent 7959adf7a8
commit 7ec0b5330b
3 changed files with 82 additions and 19 deletions

View file

@ -2,8 +2,9 @@
<Row> <Row>
<i-col span="4"> <i-col span="4">
<Button @click="handleLoad">load</Button> <Button @click="handleLoad">load</Button>
{{ v1 }}
</i-col> </i-col>
<i-col span="6"> <i-col span="4">
<Cascader :data="data3" filterable v-model="v1"></Cascader> <Cascader :data="data3" filterable v-model="v1"></Cascader>
<!--<Cascader :data="data2" filterable v-model="v1" :loadData="loadData"></Cascader>--> <!--<Cascader :data="data2" filterable v-model="v1" :loadData="loadData"></Cascader>-->
</i-col> </i-col>
@ -14,12 +15,14 @@
data () { data () {
return { return {
v1: [], v1: [],
data2: [{ data2: [
{
value: 'zhejiang', value: 'zhejiang',
label: '浙江', label: '浙江',
children: [], children: [],
loading: false loading: false
}, { },
{
value: 'jiangsu', value: 'jiangsu',
label: '江苏', label: '江苏',
children: [{ children: [{
@ -30,7 +33,8 @@
label: '中华门' label: '中华门'
}] }]
}] }]
}], }
],
data3: [{ data3: [{
value: 'beijing', value: 'beijing',
label: '北京', label: '北京',
@ -67,6 +71,7 @@
label: '苏州', label: '苏州',
children: [ children: [
{ {
disabled: true,
value: 'zhuozhengyuan', value: 'zhuozhengyuan',
label: '拙政园', label: '拙政园',
}, },

View file

@ -5,7 +5,8 @@
<i-input <i-input
:readonly="!filterable" :readonly="!filterable"
:disabled="disabled" :disabled="disabled"
v-model="displayRender" :value="displayRender"
@on-change="handleInput"
:size="size" :size="size"
:placeholder="placeholder"></i-input> :placeholder="placeholder"></i-input>
<Icon type="ios-close" :class="[prefixCls + '-arrow']" v-show="showCloseIcon" @click.native.stop="clearSelect"></Icon> <Icon type="ios-close" :class="[prefixCls + '-arrow']" v-show="showCloseIcon" @click.native.stop="clearSelect"></Icon>
@ -16,12 +17,23 @@
<Drop v-show="visible"> <Drop v-show="visible">
<div> <div>
<Caspanel <Caspanel
v-show="!filterable || (filterable && query === '')"
ref="caspanel" ref="caspanel"
:prefix-cls="prefixCls" :prefix-cls="prefixCls"
:data="data" :data="data"
:disabled="disabled" :disabled="disabled"
:change-on-select="changeOnSelect" :change-on-select="changeOnSelect"
:trigger="trigger"></Caspanel> :trigger="trigger"></Caspanel>
<div :class="[prefixCls + '-dropdown']" v-show="filterable && query !== ''">
<ul :class="[selectPrefixCls + '-dropdown-list']">
<li
:class="[selectPrefixCls + '-item', {
[selectPrefixCls + '-item-disabled']: item.disabled
}]"
v-for="(item, index) in querySelections"
@click="handleSelectItem(index)">{{ item.label }}</li>
</ul>
</div>
</div> </div>
</Drop> </Drop>
</transition> </transition>
@ -37,6 +49,7 @@
import Emitter from '../../mixins/emitter'; import Emitter from '../../mixins/emitter';
const prefixCls = 'ivu-cascader'; const prefixCls = 'ivu-cascader';
const selectPrefixCls = 'ivu-select';
export default { export default {
name: 'Cascader', name: 'Cascader',
@ -100,11 +113,13 @@
data () { data () {
return { return {
prefixCls: prefixCls, prefixCls: prefixCls,
selectPrefixCls: selectPrefixCls,
visible: false, visible: false,
selected: [], selected: [],
tmpSelected: [], tmpSelected: [],
updatingValue: false, // to fix set value in changeOnSelect type updatingValue: false, // to fix set value in changeOnSelect type
currentValue: this.value currentValue: this.value,
query: ''
}; };
}, },
computed: { computed: {
@ -128,6 +143,32 @@
} }
return this.renderFormat(label, this.selected); 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: { methods: {
@ -146,7 +187,7 @@
toggleOpen () { toggleOpen () {
if (this.disabled) return false; if (this.disabled) return false;
if (this.visible) { if (this.visible) {
this.handleClose(); if (!this.filterable) this.handleClose();
} else { } else {
this.onFocus(); 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 () { created () {

View file

@ -49,6 +49,10 @@
.select-item(@cascader-prefix-cls, @cascader-item-prefix-cls); .select-item(@cascader-prefix-cls, @cascader-item-prefix-cls);
&-dropdown{
padding: 5px 0;
}
&-menu{ &-menu{
display: inline-block; display: inline-block;
min-width: 100px; min-width: 100px;