diff --git a/components/select/option-group.vue b/components/select/option-group.vue index f3055fd..e0c5d7b 100644 --- a/components/select/option-group.vue +++ b/components/select/option-group.vue @@ -18,8 +18,7 @@ }, data () { return { - prefixCls: prefixCls, - hidden: false // for search + prefixCls: prefixCls } } } diff --git a/components/select/select.vue b/components/select/select.vue index 39ce2f3..61a1f5a 100644 --- a/components/select/select.vue +++ b/components/select/select.vue @@ -12,17 +12,21 @@ <span :class="[`${prefixCls}-selected-value`]" v-show="!showPlaceholder && !multiple && !filterable">{{ selectedSingle }}</span> <input type="text" - :class="[`${prefixCls}-input`]" v-if="filterable" v-model="query" - :placeholder="placeholder" + :class="[`${prefixCls}-input`]" + :placeholder="showPlaceholder ? placeholder : ''" :style="inputStyle" - @blur="handleBlur"> + @blur="handleBlur" + @keydown="resetInputState" + @keydown.delete="handleInputDelete" + v-el:input> <Icon type="ios-close" :class="[`${prefixCls}-arrow`]" v-show="showCloseIcon" @click.stop="clearSingleSelect"></Icon> <Icon type="arrow-down-b" :class="[`${prefixCls}-arrow`]"></Icon> </div> <Dropdown v-show="visible" transition="slide-up" v-ref:dropdown> - <ul :class="[`${prefixCls}-dropdown-list`]"><slot></slot></ul> + <ul v-show="notFound" :class="[`${prefixCls}-not-found`]"><li>未找到</li></ul> + <ul v-else :class="[`${prefixCls}-dropdown-list`]"><slot></slot></ul> </Dropdown> </div> </template> @@ -85,7 +89,8 @@ selectedMultiple: [], focusIndex: 0, query: '', - inputLength: 20 + inputLength: 20, + notFound: false } }, computed: { @@ -124,7 +129,11 @@ let style = {}; if (this.multiple) { - style.width = `${this.inputLength}px`; + if (this.showPlaceholder) { + style.width = '100%'; + } else { + style.width = `${this.inputLength}px`; + } } return style; @@ -245,6 +254,12 @@ return false; } this.model.splice(index, 1); + + if (this.filterable && this.visible) { + this.$els.input.focus(); + } + + this.$broadcast('on-update-popper'); }, // to select option for single toggleSingleSelected (value, init = false) { @@ -404,6 +419,14 @@ } } }, 300); + }, + resetInputState () { + this.inputLength = this.$els.input.value.length * 12 + 20; + }, + handleInputDelete () { + if (this.multiple && this.model.length && this.query === '') { + this.removeTag(this.model.length - 1); + } } }, ready () { @@ -423,6 +446,9 @@ }, visible (val) { if (val) { + if (this.multiple && this.filterable) { + this.$els.input.focus(); + } this.$broadcast('on-update-popper'); } else { @@ -430,6 +456,16 @@ }, query (val) { this.$broadcast('on-query-change', val); + let is_hidden = true; + + this.$nextTick(() => { + this.findChild((child) => { + if (!child.hidden) { + is_hidden = false; + } + }); + this.notFound = is_hidden; + }); } }, events: { @@ -443,6 +479,12 @@ this.removeTag(index); } else { this.model.push(value); + this.$broadcast('on-update-popper'); + } + + if (this.filterable) { + this.query = ''; + this.$els.input.focus(); } } else { this.model = value; diff --git a/local/routers/select.vue b/local/routers/select.vue index 7d07926..1bd88d1 100644 --- a/local/routers/select.vue +++ b/local/routers/select.vue @@ -4,7 +4,7 @@ {{ city | json }}<br> <Button @click="city = 'hangzhou'">切换城市</Button> <br> - <i-select v-if="true" :model.sync="city" style="width:200px" @on-change="change"> + <i-select v-if="true" :model.sync="city" style="width:200px" filterable @on-change="change"> <i-option-group label="热门城市"> <i-option value="beijing">北京市</i-option> <i-option value="shanghai" disabled label="上海市">上海市2</i-option> @@ -13,31 +13,16 @@ <i-option-group label="二线城市"> <i-option value="nanjing">南京市</i-option> <i-option value="hangzhou">杭州市</i-option> + <i-option value="heilongjiang" disabled>黑龙江市</i-option> </i-option-group> - <i-option value="heilongjiang" disabled>黑龙江市</i-option> - <i-option-group label="热门城市"> - <i-option value="beijing">北京市</i-option> - <i-option value="shanghai" disabled label="上海市">上海市2</i-option> - <i-option value="shenzhen">深圳市</i-option> - </i-option-group> - <i-option-group label="二线城市"> - <i-option value="nanjing">南京市</i-option> - <i-option value="hangzhou">杭州市</i-option> - </i-option-group> - <i-option value="heilongjiang" disabled>黑龙江市</i-option> - <i-option-group label="热门城市"> - <i-option value="beijing">北京市</i-option> - <i-option value="shanghai" disabled label="上海市">上海市2</i-option> - <i-option value="shenzhen">深圳市</i-option> - </i-option-group> - <i-option-group label="二线城市"> - <i-option value="nanjing">南京市</i-option> - <i-option value="hangzhou">杭州市</i-option> + <i-option-group label="其它城市"> + <i-option value="jyg">嘉峪关市</i-option> + <i-option value="lanzhou">兰州市</i-option> + <i-option value="beijingxi">北京西</i-option> </i-option-group> - <i-option value="heilongjiang" disabled>黑龙江市</i-option> </i-select> - <i-select :model.sync="focus" style="width:200px" @on-change="change" clearable filterable label-in-value> + <i-select v-show="true" :model.sync="focus" style="width:200px" @on-change="change" clearable filterable label-in-value> <i-option value="beijing">北京</i-option> <i-option value="shanghai" label="上海市">上海市</i-option> <i-option value="shenzhen" disabled>深圳市</i-option> @@ -51,6 +36,19 @@ <i-option value="e">e市</i-option> </i-select> + <i-select v-if="true" :model.sync="focus2" style="width:300px" @on-change="change" clearable filterable multiple> + <i-option value="beijing" label="北京市">北京2</i-option> + <i-option value="shanghai">上海市</i-option> + <i-option value="shenzhen" disabled>深圳市</i-option> + <i-option value="guangzhou">广州市</i-option> + <i-option value="shijiazhuang">石家庄市</i-option> + <i-option value="a">a1市</i-option> + <i-option value="b">b2市</i-option> + <i-option value="c">c1市</i-option> + <i-option value="d">d2市</i-option> + <i-option value="e">e1市</i-option> + </i-select> + <i-select v-if="true" :model.sync="focus2" style="width:300px" @on-change="change" clearable multiple> <i-option value="beijing" label="北京市">北京2</i-option> <i-option value="shanghai">上海市</i-option> @@ -84,7 +82,7 @@ return { city: '', focus: '', - focus2: ['beijing', 'guangzhou', 'b'] + focus2: ['beijing'] // focus2: [] } }, diff --git a/styles/components/select.less b/styles/components/select.less index 5b14788..d346311 100644 --- a/styles/components/select.less +++ b/styles/components/select.less @@ -163,6 +163,17 @@ &-small &-input{ height: @input-height-small; } + + &-multiple &-input{ + height: 25px; + line-height: 28px; + padding: 0 0 0 6px; + } + + &-not-found{ + text-align: center; + color: @btn-disable-color; + } } .@{select-item-prefix-cls} { -- libgit2 0.21.4