Commit 165bb7c9ed134eaebe5cdfce6ff5634c49635942

Authored by 梁灏
1 parent bd4e3b9b

update Cascader

update Cascader
src/components/cascader/cascader.vue
@@ -92,7 +92,8 @@ @@ -92,7 +92,8 @@
92 return [ 92 return [
93 `${prefixCls}`, 93 `${prefixCls}`,
94 { 94 {
95 - [`${prefixCls}-show-clear`]: this.showCloseIcon 95 + [`${prefixCls}-show-clear`]: this.showCloseIcon,
  96 + [`${prefixCls}-visible`]: this.visible
96 } 97 }
97 ] 98 ]
98 }, 99 },
@@ -105,28 +106,42 @@ @@ -105,28 +106,42 @@
105 label.push(this.selected[i].label); 106 label.push(this.selected[i].label);
106 } 107 }
107 108
108 - return this.renderFormat(label); 109 + return this.renderFormat(label, this.selected);
109 } 110 }
110 }, 111 },
111 methods: { 112 methods: {
112 clearSelect () { 113 clearSelect () {
113 - 114 + const oldVal = JSON.stringify(this.value);
  115 + this.value = this.selected = this.tmpSelected = [];
  116 + this.handleClose();
  117 + this.emitValue(this.value, oldVal);
  118 + this.$broadcast('on-clear');
114 }, 119 },
115 handleClose () { 120 handleClose () {
116 this.visible = false; 121 this.visible = false;
117 }, 122 },
118 onFocus () { 123 onFocus () {
119 this.visible = true; 124 this.visible = true;
  125 + if (!this.value.length) {
  126 + this.$broadcast('on-clear');
  127 + }
120 }, 128 },
121 updateResult (result) { 129 updateResult (result) {
122 this.tmpSelected = result; 130 this.tmpSelected = result;
123 }, 131 },
124 - updateSelected () {  
125 - this.$broadcast('on-find-selected', this.value); 132 + updateSelected (init = false) {
  133 + if (!this.changeOnSelect || init) {
  134 + this.$broadcast('on-find-selected', this.value);
  135 + }
  136 + },
  137 + emitValue (val, oldVal) {
  138 + if (JSON.stringify(val) !== oldVal) {
  139 + this.$emit('on-change', this.value, JSON.parse(JSON.stringify(this.selected)));
  140 + }
126 } 141 }
127 }, 142 },
128 ready () { 143 ready () {
129 - this.updateSelected(); 144 + this.updateSelected(true);
130 }, 145 },
131 events: { 146 events: {
132 // lastValue: is click the final val 147 // lastValue: is click the final val
@@ -140,10 +155,10 @@ @@ -140,10 +155,10 @@
140 this.selected.forEach((item) => { 155 this.selected.forEach((item) => {
141 newVal.push(item.value); 156 newVal.push(item.value);
142 }); 157 });
143 - this.value = newVal;  
144 158
145 - if (JSON.stringify(this.value) !== oldVal) {  
146 - this.$emit('on-change', this.value); 159 + if (!fromInit) {
  160 + this.value = newVal;
  161 + this.emitValue(this.value, oldVal);
147 } 162 }
148 } 163 }
149 if (lastValue && !fromInit) { 164 if (lastValue && !fromInit) {
src/components/cascader/casitem.vue
@@ -18,9 +18,6 @@ @@ -18,9 +18,6 @@
18 } 18 }
19 ] 19 ]
20 } 20 }
21 - },  
22 - ready () {  
23 -  
24 } 21 }
25 } 22 }
26 </script> 23 </script>
27 \ No newline at end of file 24 \ No newline at end of file
src/components/cascader/caspanel.vue
@@ -105,6 +105,10 @@ @@ -105,6 +105,10 @@
105 } 105 }
106 } 106 }
107 } 107 }
  108 + },
  109 + 'on-clear' () {
  110 + this.sublist = [];
  111 + this.tmpItem = {};
108 } 112 }
109 } 113 }
110 } 114 }
src/styles/components/cascader.less
@@ -24,14 +24,10 @@ @@ -24,14 +24,10 @@
24 } 24 }
25 25
26 &-arrow { 26 &-arrow {
27 - position: absolute;  
28 - top: 50%;  
29 - right: 8px;  
30 - line-height: 1;  
31 - margin-top: -6px;  
32 - font-size: @font-size-base;  
33 - color: @subsidiary-color;  
34 - .transition(all @transition-time @ease-in-out); 27 + .inner-arrow();
  28 + }
  29 + &-visible &-arrow:nth-of-type(2){
  30 + .transform(rotate(180deg));
35 } 31 }
36 32
37 .@{select-dropdown-prefix-cls} { 33 .@{select-dropdown-prefix-cls} {
@@ -78,7 +74,7 @@ @@ -78,7 +74,7 @@
78 74
79 &-active{ 75 &-active{
80 background-color: @background-color-select-hover; 76 background-color: @background-color-select-hover;
81 - font-weight: bold; 77 + color: @primary-color;
82 } 78 }
83 } 79 }
84 } 80 }
src/styles/components/select.less
@@ -41,13 +41,7 @@ @@ -41,13 +41,7 @@
41 } 41 }
42 42
43 &-arrow { 43 &-arrow {
44 - position: absolute;  
45 - top: 50%;  
46 - right: 8px;  
47 - line-height: 1;  
48 - margin-top: -6px;  
49 - color: @subsidiary-color;  
50 - .transition(all @transition-time @ease-in-out); 44 + .inner-arrow();
51 } 45 }
52 46
53 &-visible{ 47 &-visible{
src/styles/mixins/common.less
@@ -18,4 +18,16 @@ @@ -18,4 +18,16 @@
18 -webkit-user-select: @type; 18 -webkit-user-select: @type;
19 -moz-user-select: @type; 19 -moz-user-select: @type;
20 user-select: @type; 20 user-select: @type;
  21 +}
  22 +
  23 +// for select and input like component's arrow
  24 +.inner-arrow() {
  25 + position: absolute;
  26 + top: 50%;
  27 + right: 8px;
  28 + line-height: 1;
  29 + margin-top: -7px;
  30 + font-size: @font-size-base;
  31 + color: @subsidiary-color;
  32 + .transition(all @transition-time @ease-in-out);
21 } 33 }
22 \ No newline at end of file 34 \ No newline at end of file
test/routers/cascader.vue
1 <template> 1 <template>
2 <div style="margin: 50px;width:300px"> 2 <div style="margin: 50px;width:300px">
3 - <Cascader :data="data" :value.sync="value" @on-change="change" trigger="click"></Cascader> 3 + {{ value | json }}
  4 + <Cascader size="large" :data="data" :value.sync="value" @on-change="change" trigger="hover" :render-format="format"></Cascader>
4 </div> 5 </div>
5 </template> 6 </template>
6 <script> 7 <script>
@@ -50,8 +51,12 @@ @@ -50,8 +51,12 @@
50 51
51 }, 52 },
52 methods: { 53 methods: {
53 - change (data) {  
54 - console.log(data) 54 + change (data, opts) {
  55 + console.log(data);
  56 + console.log(opts)
  57 + },
  58 + format (label, data) {
  59 + return label[label.length - 1];
55 } 60 }
56 } 61 }
57 } 62 }