Commit 2739fc29cc959772d8750a4d1a3f47a09e7f4504

Authored by 梁灏
1 parent 707898f2

Select add prefix prop and slot. close #5477

examples/routers/select.vue
1 <template> 1 <template>
2 - <div style="margin: 200px;">  
3 - <Select size="small" v-model="model10" multiple style="width:260px"> 2 + <div style="margin: 100px;">
  3 + <Select v-model="model1" style="width:200px" prefix="ios-albums">
4 <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option> 4 <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
5 </Select> 5 </Select>
6 - <Select v-model="model10" multiple style="width:260px"> 6 +
  7 + <Select v-model="model10" multiple style="width:260px" prefix="ios-albums">
7 <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option> 8 <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
8 </Select> 9 </Select>
9 - <Select size="large" v-model="model10" multiple style="width:260px"> 10 +
  11 + <br><br>
  12 +
  13 + <Select v-model="model1" style="width:200px">
  14 + <Icon type="ios-alarm" slot="prefix" color="red" />
  15 + <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
  16 + </Select>
  17 +
  18 + <Select v-model="model1" style="width:200px">
  19 + <Avatar src="https://dev-file.iviewui.com/userinfoPDvn9gKWYihR24SpgC319vXY8qniCqj4/avatar" slot="prefix" size="small" />
  20 + <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
  21 + </Select>
  22 +
  23 + <Select v-model="model10" multiple style="width:260px" prefix="ios-albums">
  24 + <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
  25 + </Select>
  26 +
  27 + <br><br>
  28 +
  29 + <Select size="small" v-model="model1" style="width:200px" prefix="ios-albums">
  30 + <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
  31 + </Select>
  32 +
  33 + <Select size="small" v-model="model10" multiple style="width:260px" prefix="ios-albums">
  34 + <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
  35 + </Select>
  36 +
  37 + <br><br>
  38 +
  39 + <Select size="large" v-model="model1" style="width:200px" prefix="ios-albums">
  40 + <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
  41 + </Select>
  42 +
  43 + <Select size="large" v-model="model10" multiple style="width:260px" prefix="ios-albums">
10 <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option> 44 <Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
11 </Select> 45 </Select>
12 </div> 46 </div>
@@ -22,7 +56,7 @@ @@ -22,7 +56,7 @@
22 }, 56 },
23 { 57 {
24 value: 'London', 58 value: 'London',
25 - label: 'LondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondon' 59 + label: 'London'
26 }, 60 },
27 { 61 {
28 value: 'Sydney', 62 value: 'Sydney',
@@ -41,7 +75,8 @@ @@ -41,7 +75,8 @@
41 label: 'Canberra' 75 label: 'Canberra'
42 } 76 }
43 ], 77 ],
44 - model10: ['New York', 'London'] 78 + model1: '',
  79 + model10: []
45 } 80 }
46 } 81 }
47 } 82 }
src/components/select/select-head.vue
1 <template> 1 <template>
2 <div @click="onHeaderClick"> 2 <div @click="onHeaderClick">
  3 + <span :class="[prefixCls + '-prefix']" v-if="$slots.prefix || prefix">
  4 + <slot name="prefix">
  5 + <Icon :type="prefix" v-if="prefix" />
  6 + </slot>
  7 + </span>
3 <div class="ivu-tag ivu-tag-checked" v-for="item in selectedMultiple"> 8 <div class="ivu-tag ivu-tag-checked" v-for="item in selectedMultiple">
4 <span class="ivu-tag-text">{{ item.label }}</span> 9 <span class="ivu-tag-text">{{ item.label }}</span>
5 <Icon type="ios-close" @click.native.stop="removeTag(item)"></Icon> 10 <Icon type="ios-close" @click.native.stop="removeTag(item)"></Icon>
@@ -77,7 +82,10 @@ @@ -77,7 +82,10 @@
77 queryProp: { 82 queryProp: {
78 type: String, 83 type: String,
79 default: '' 84 default: ''
80 - } 85 + },
  86 + prefix: {
  87 + type: String
  88 + },
81 }, 89 },
82 data () { 90 data () {
83 return { 91 return {
@@ -92,6 +100,7 @@ @@ -92,6 +100,7 @@
92 singleDisplayClasses(){ 100 singleDisplayClasses(){
93 const {filterable, multiple, showPlaceholder} = this; 101 const {filterable, multiple, showPlaceholder} = this;
94 return [{ 102 return [{
  103 + [prefixCls + '-head-with-prefix']: this.$slots.prefix || this.prefix,
95 [prefixCls + '-placeholder']: showPlaceholder && !filterable, 104 [prefixCls + '-placeholder']: showPlaceholder && !filterable,
96 [prefixCls + '-selected-value']: !showPlaceholder && !multiple && !filterable, 105 [prefixCls + '-selected-value']: !showPlaceholder && !multiple && !filterable,
97 }]; 106 }];
src/components/select/select.vue
@@ -33,6 +33,7 @@ @@ -33,6 +33,7 @@
33 :multiple="multiple" 33 :multiple="multiple"
34 :values="values" 34 :values="values"
35 :clearable="canBeCleared" 35 :clearable="canBeCleared"
  36 + :prefix="prefix"
36 :disabled="disabled" 37 :disabled="disabled"
37 :remote="remote" 38 :remote="remote"
38 :input-element-id="elementId" 39 :input-element-id="elementId"
@@ -44,7 +45,9 @@ @@ -44,7 +45,9 @@
44 @on-input-focus="isFocused = true" 45 @on-input-focus="isFocused = true"
45 @on-input-blur="isFocused = false" 46 @on-input-blur="isFocused = false"
46 @on-clear="clearSingleSelect" 47 @on-clear="clearSingleSelect"
47 - /> 48 + >
  49 + <slot name="prefix" slot="prefix"></slot>
  50 + </select-head>
48 </slot> 51 </slot>
49 </div> 52 </div>
50 <transition name="transition-drop"> 53 <transition name="transition-drop">
@@ -235,6 +238,9 @@ @@ -235,6 +238,9 @@
235 transferClassName: { 238 transferClassName: {
236 type: String 239 type: String
237 }, 240 },
  241 + prefix: {
  242 + type: String
  243 + },
238 }, 244 },
239 mounted(){ 245 mounted(){
240 this.$on('on-select-selected', this.onOptionClick); 246 this.$on('on-select-selected', this.onOptionClick);
src/styles/components/select.less
@@ -256,6 +256,21 @@ @@ -256,6 +256,21 @@
256 & &-dropdown{ 256 & &-dropdown{
257 width: auto; 257 width: auto;
258 } 258 }
  259 +
  260 + &-prefix{
  261 + display: inline-block;
  262 + vertical-align: middle;
  263 + }
  264 + &-head-with-prefix{
  265 + display: inline-block !important;
  266 + vertical-align: middle;
  267 + }
  268 + &-single &-prefix{
  269 + padding-left: 4px;
  270 + }
  271 + &-single &-head-with-prefix, &-multiple &-head-with-prefix{
  272 + padding-left: 0 !important;
  273 + }
259 } 274 }
260 275
261 .select-item(@select-prefix-cls, @select-item-prefix-cls); 276 .select-item(@select-prefix-cls, @select-item-prefix-cls);