Commit 3ae11e857694b70a572ca1b601d827924c8910ea

Authored by 梁灏
1 parent 2fcd34da

update Cascader

src/components/cascader/cascader.vue
@@ -3,12 +3,17 @@ @@ -3,12 +3,17 @@
3 <div :class="[prefixCls + '-rel']" @click="toggleOpen"> 3 <div :class="[prefixCls + '-rel']" @click="toggleOpen">
4 <slot> 4 <slot>
5 <i-input 5 <i-input
  6 + ref="input"
6 :readonly="!filterable" 7 :readonly="!filterable"
7 :disabled="disabled" 8 :disabled="disabled"
8 - :value="displayRender" 9 + :value="displayInputRender"
9 @on-change="handleInput" 10 @on-change="handleInput"
10 :size="size" 11 :size="size"
11 - :placeholder="placeholder"></i-input> 12 + :placeholder="inputPlaceholder"></i-input>
  13 + <div
  14 + :class="[prefixCls + '-label']"
  15 + v-show="filterable && query === ''"
  16 + @click="handleFocus">{{ displayRender }}</div>
12 <Icon type="ios-close" :class="[prefixCls + '-arrow']" v-show="showCloseIcon" @click.native.stop="clearSelect"></Icon> 17 <Icon type="ios-close" :class="[prefixCls + '-arrow']" v-show="showCloseIcon" @click.native.stop="clearSelect"></Icon>
13 <Icon type="arrow-down-b" :class="[prefixCls + '-arrow']"></Icon> 18 <Icon type="arrow-down-b" :class="[prefixCls + '-arrow']"></Icon>
14 </slot> 19 </slot>
@@ -47,13 +52,14 @@ @@ -47,13 +52,14 @@
47 import clickoutside from '../../directives/clickoutside'; 52 import clickoutside from '../../directives/clickoutside';
48 import { oneOf } from '../../utils/assist'; 53 import { oneOf } from '../../utils/assist';
49 import Emitter from '../../mixins/emitter'; 54 import Emitter from '../../mixins/emitter';
  55 + import Locale from '../../mixins/locale';
50 56
51 const prefixCls = 'ivu-cascader'; 57 const prefixCls = 'ivu-cascader';
52 const selectPrefixCls = 'ivu-select'; 58 const selectPrefixCls = 'ivu-select';
53 59
54 export default { 60 export default {
55 name: 'Cascader', 61 name: 'Cascader',
56 - mixins: [ Emitter ], 62 + mixins: [ Emitter, Locale ],
57 components: { iInput, Drop, Icon, Caspanel }, 63 components: { iInput, Drop, Icon, Caspanel },
58 directives: { clickoutside }, 64 directives: { clickoutside },
59 props: { 65 props: {
@@ -78,8 +84,7 @@ @@ -78,8 +84,7 @@
78 default: true 84 default: true
79 }, 85 },
80 placeholder: { 86 placeholder: {
81 - type: String,  
82 - default: '请选择' 87 + type: String
83 }, 88 },
84 size: { 89 size: {
85 validator (value) { 90 validator (value) {
@@ -128,6 +133,7 @@ @@ -128,6 +133,7 @@
128 `${prefixCls}`, 133 `${prefixCls}`,
129 { 134 {
130 [`${prefixCls}-show-clear`]: this.showCloseIcon, 135 [`${prefixCls}-show-clear`]: this.showCloseIcon,
  136 + [`${prefixCls}-size-${this.size}`]: !!this.size,
131 [`${prefixCls}-visible`]: this.visible, 137 [`${prefixCls}-visible`]: this.visible,
132 [`${prefixCls}-disabled`]: this.disabled 138 [`${prefixCls}-disabled`]: this.disabled
133 } 139 }
@@ -144,6 +150,19 @@ @@ -144,6 +150,19 @@
144 150
145 return this.renderFormat(label, this.selected); 151 return this.renderFormat(label, this.selected);
146 }, 152 },
  153 + displayInputRender () {
  154 + return this.filterable ? '' : this.displayRender;
  155 + },
  156 + localePlaceholder () {
  157 + if (this.placeholder === undefined) {
  158 + return this.t('i.select.placeholder');
  159 + } else {
  160 + return this.placeholder;
  161 + }
  162 + },
  163 + inputPlaceholder () {
  164 + return this.filterable && this.currentValue.length ? null : this.localePlaceholder;
  165 + },
147 querySelections () { 166 querySelections () {
148 let selections = []; 167 let selections = [];
149 function getSelections (arr, label, value) { 168 function getSelections (arr, label, value) {
@@ -226,11 +245,16 @@ @@ -226,11 +245,16 @@
226 const item = this.querySelections[index]; 245 const item = this.querySelections[index];
227 246
228 if (item.item.disabled) return false; 247 if (item.item.disabled) return false;
  248 + // todo 还有bug,选完,删除后,失焦,不能回到上次选择的
229 this.query = ''; 249 this.query = '';
  250 + this.$refs.input.currentValue = '';
230 const oldVal = JSON.stringify(this.currentValue); 251 const oldVal = JSON.stringify(this.currentValue);
231 this.currentValue = item.value.split(','); 252 this.currentValue = item.value.split(',');
232 this.emitValue(this.currentValue, oldVal); 253 this.emitValue(this.currentValue, oldVal);
233 this.handleClose(); 254 this.handleClose();
  255 + },
  256 + handleFocus () {
  257 + this.$refs.input.focus();
234 } 258 }
235 }, 259 },
236 created () { 260 created () {
@@ -270,6 +294,11 @@ @@ -270,6 +294,11 @@
270 if (this.currentValue.length) { 294 if (this.currentValue.length) {
271 this.updateSelected(); 295 this.updateSelected();
272 } 296 }
  297 + } else {
  298 + if (this.filterable) {
  299 + this.query = '';
  300 + this.$refs.input.currentValue = '';
  301 + }
273 } 302 }
274 this.$emit('on-visible-change', val); 303 this.$emit('on-visible-change', val);
275 }, 304 },
src/styles/components/cascader.less
@@ -19,6 +19,29 @@ @@ -19,6 +19,29 @@
19 cursor: @cursor-disabled; 19 cursor: @cursor-disabled;
20 } 20 }
21 21
  22 + &-label{
  23 + width: 100%;
  24 + height: 100%;
  25 + line-height: 32px;
  26 + padding: 0 7px;
  27 + box-sizing: border-box;
  28 + white-space: nowrap;
  29 + text-overflow: ellipsis;
  30 + overflow: hidden;
  31 + cursor: pointer;
  32 + font-size: @font-size-small;
  33 + position: absolute;
  34 + left: 0;
  35 + top: 0;
  36 + }
  37 + &-size-large &-label{
  38 + line-height: 36px;
  39 + font-size: @font-size-base;
  40 + }
  41 + &-size-small &-label{
  42 + line-height: 26px;
  43 + }
  44 +
22 .@{cascader-prefix-cls}-arrow:nth-of-type(1) { 45 .@{cascader-prefix-cls}-arrow:nth-of-type(1) {
23 display: none; 46 display: none;
24 cursor: pointer; 47 cursor: pointer;