Commit e2a877c46abf9be9b7d436c307485f4e4f7712dd
1 parent
1044a56b
Input add search & enterButton prop
Showing
3 changed files
with
77 additions
and
7 deletions
Show diff stats
examples/routers/input.vue
@@ -128,14 +128,19 @@ | @@ -128,14 +128,19 @@ | ||
128 | <Icon type="ios-alarm-outline" slot="suffix" /> | 128 | <Icon type="ios-alarm-outline" slot="suffix" /> |
129 | <Icon type="ios-aperture" slot="prefix" /> | 129 | <Icon type="ios-aperture" slot="prefix" /> |
130 | </Input> | 130 | </Input> |
131 | - <br> | 131 | + <br><br><br><br> |
132 | + <Input v-model="value" search enter-button style="width: 300px" /> | ||
133 | + <br><br> | ||
134 | + <Input v-model="value" search style="width: 300px" /> | ||
135 | + <br><br> | ||
136 | + <Input v-model="value" search enter-button="搜索" style="width: 300px" /> | ||
132 | </div> | 137 | </div> |
133 | </template> | 138 | </template> |
134 | <script> | 139 | <script> |
135 | export default { | 140 | export default { |
136 | data () { | 141 | data () { |
137 | return { | 142 | return { |
138 | - value: '你好你好你真好你好你好你真好你好你好你真好你好你好你真好', | 143 | + value: '', |
139 | value11: '', | 144 | value11: '', |
140 | value12: '', | 145 | value12: '', |
141 | value13: '', | 146 | value13: '', |
src/components/input/input.vue
@@ -4,6 +4,7 @@ | @@ -4,6 +4,7 @@ | ||
4 | <div :class="[prefixCls + '-group-prepend']" v-if="prepend" v-show="slotReady"><slot name="prepend"></slot></div> | 4 | <div :class="[prefixCls + '-group-prepend']" v-if="prepend" v-show="slotReady"><slot name="prepend"></slot></div> |
5 | <i class="ivu-icon" :class="['ivu-icon-ios-close-circle', prefixCls + '-icon', prefixCls + '-icon-clear' , prefixCls + '-icon-normal']" v-if="clearable && currentValue" @click="handleClear"></i> | 5 | <i class="ivu-icon" :class="['ivu-icon-ios-close-circle', prefixCls + '-icon', prefixCls + '-icon-clear' , prefixCls + '-icon-normal']" v-if="clearable && currentValue" @click="handleClear"></i> |
6 | <i class="ivu-icon" :class="['ivu-icon-' + icon, prefixCls + '-icon', prefixCls + '-icon-normal']" v-else-if="icon" @click="handleIconClick"></i> | 6 | <i class="ivu-icon" :class="['ivu-icon-' + icon, prefixCls + '-icon', prefixCls + '-icon-normal']" v-else-if="icon" @click="handleIconClick"></i> |
7 | + <i class="ivu-icon ivu-icon-ios-search" :class="[prefixCls + '-icon', prefixCls + '-icon-normal', prefixCls + '-search-icon']" v-else-if="search && enterButton === false" @click="handleSearch"></i> | ||
7 | <span class="ivu-input-suffix" v-else-if="showSuffix"><slot name="suffix"><i class="ivu-icon" :class="['ivu-icon-' + suffix]" v-if="suffix"></i></slot></span> | 8 | <span class="ivu-input-suffix" v-else-if="showSuffix"><slot name="suffix"><i class="ivu-icon" :class="['ivu-icon-' + suffix]" v-if="suffix"></i></slot></span> |
8 | <transition name="fade"> | 9 | <transition name="fade"> |
9 | <i class="ivu-icon ivu-icon-ios-loading ivu-load-loop" :class="[prefixCls + '-icon', prefixCls + '-icon-validate']" v-if="!icon"></i> | 10 | <i class="ivu-icon ivu-icon-ios-loading ivu-load-loop" :class="[prefixCls + '-icon', prefixCls + '-icon-validate']" v-if="!icon"></i> |
@@ -32,6 +33,10 @@ | @@ -32,6 +33,10 @@ | ||
32 | @input="handleInput" | 33 | @input="handleInput" |
33 | @change="handleChange"> | 34 | @change="handleChange"> |
34 | <div :class="[prefixCls + '-group-append']" v-if="append" v-show="slotReady"><slot name="append"></slot></div> | 35 | <div :class="[prefixCls + '-group-append']" v-if="append" v-show="slotReady"><slot name="append"></slot></div> |
36 | + <div :class="[prefixCls + '-group-append', prefixCls + '-search']" v-else-if="search && enterButton" @click="handleSearch"> | ||
37 | + <i class="ivu-icon ivu-icon-ios-search" v-if="enterButton === true"></i> | ||
38 | + <template v-else>{{ enterButton }}</template> | ||
39 | + </div> | ||
35 | <span class="ivu-input-prefix" v-else-if="showPrefix"><slot name="prefix"><i class="ivu-icon" :class="['ivu-icon-' + prefix]" v-if="prefix"></i></slot></span> | 40 | <span class="ivu-input-prefix" v-else-if="showPrefix"><slot name="prefix"><i class="ivu-icon" :class="['ivu-icon-' + prefix]" v-if="prefix"></i></slot></span> |
36 | </template> | 41 | </template> |
37 | <textarea | 42 | <textarea |
@@ -152,6 +157,14 @@ | @@ -152,6 +157,14 @@ | ||
152 | suffix: { | 157 | suffix: { |
153 | type: String, | 158 | type: String, |
154 | default: '' | 159 | default: '' |
160 | + }, | ||
161 | + search: { | ||
162 | + type: Boolean, | ||
163 | + default: false | ||
164 | + }, | ||
165 | + enterButton: { | ||
166 | + type: [Boolean, String], | ||
167 | + default: false | ||
155 | } | 168 | } |
156 | }, | 169 | }, |
157 | data () { | 170 | data () { |
@@ -173,11 +186,12 @@ | @@ -173,11 +186,12 @@ | ||
173 | { | 186 | { |
174 | [`${prefixCls}-wrapper-${this.size}`]: !!this.size, | 187 | [`${prefixCls}-wrapper-${this.size}`]: !!this.size, |
175 | [`${prefixCls}-type`]: this.type, | 188 | [`${prefixCls}-type`]: this.type, |
176 | - [`${prefixCls}-group`]: this.prepend || this.append, | ||
177 | - [`${prefixCls}-group-${this.size}`]: (this.prepend || this.append) && !!this.size, | 189 | + [`${prefixCls}-group`]: this.prepend || this.append || (this.search && this.enterButton), |
190 | + [`${prefixCls}-group-${this.size}`]: (this.prepend || this.append || (this.search && this.enterButton)) && !!this.size, | ||
178 | [`${prefixCls}-group-with-prepend`]: this.prepend, | 191 | [`${prefixCls}-group-with-prepend`]: this.prepend, |
179 | - [`${prefixCls}-group-with-append`]: this.append, | ||
180 | - [`${prefixCls}-hide-icon`]: this.append // #554 | 192 | + [`${prefixCls}-group-with-append`]: this.append || (this.search && this.enterButton), |
193 | + [`${prefixCls}-hide-icon`]: this.append, // #554 | ||
194 | + [`${prefixCls}-with-search`]: (this.search && this.enterButton) | ||
181 | } | 195 | } |
182 | ]; | 196 | ]; |
183 | }, | 197 | }, |
@@ -188,7 +202,7 @@ | @@ -188,7 +202,7 @@ | ||
188 | [`${prefixCls}-${this.size}`]: !!this.size, | 202 | [`${prefixCls}-${this.size}`]: !!this.size, |
189 | [`${prefixCls}-disabled`]: this.disabled, | 203 | [`${prefixCls}-disabled`]: this.disabled, |
190 | [`${prefixCls}-with-prefix`]: this.showPrefix, | 204 | [`${prefixCls}-with-prefix`]: this.showPrefix, |
191 | - [`${prefixCls}-with-suffix`]: this.showSuffix | 205 | + [`${prefixCls}-with-suffix`]: this.showSuffix || (this.search && this.enterButton === false) |
192 | } | 206 | } |
193 | ]; | 207 | ]; |
194 | }, | 208 | }, |
@@ -276,6 +290,10 @@ | @@ -276,6 +290,10 @@ | ||
276 | this.$emit('input', ''); | 290 | this.$emit('input', ''); |
277 | this.setCurrentValue(''); | 291 | this.setCurrentValue(''); |
278 | this.$emit('on-change', e); | 292 | this.$emit('on-change', e); |
293 | + }, | ||
294 | + handleSearch () { | ||
295 | + if (this.disable) return false; | ||
296 | + this.$refs.input.focus(); | ||
279 | } | 297 | } |
280 | }, | 298 | }, |
281 | watch: { | 299 | watch: { |
src/styles/components/input.less
@@ -101,6 +101,53 @@ | @@ -101,6 +101,53 @@ | ||
101 | &-with-suffix{ | 101 | &-with-suffix{ |
102 | padding-right: 32px; | 102 | padding-right: 32px; |
103 | } | 103 | } |
104 | + | ||
105 | + // search | ||
106 | + &-search{ | ||
107 | + cursor: pointer; | ||
108 | + padding: 0 16px !important; | ||
109 | + background: @primary-color !important; | ||
110 | + color: #fff !important; | ||
111 | + border-color: @primary-color !important; | ||
112 | + transition: all @transition-time @ease-in-out; | ||
113 | + position: relative; | ||
114 | + z-index: 2; | ||
115 | + | ||
116 | + &:hover{ | ||
117 | + background: tint(@primary-color, 20%) !important; | ||
118 | + border-color: tint(@primary-color, 20%) !important; | ||
119 | + } | ||
120 | + &:active{ | ||
121 | + background: shade(@primary-color, 5%) !important; | ||
122 | + border-color: shade(@primary-color, 5%) !important; | ||
123 | + } | ||
124 | + | ||
125 | + &-icon{ | ||
126 | + cursor: pointer; | ||
127 | + transition: color @transition-time @ease-in-out; | ||
128 | + &:hover{ | ||
129 | + color: inherit; | ||
130 | + } | ||
131 | + } | ||
132 | + | ||
133 | + &:before{ | ||
134 | + content: ''; | ||
135 | + display: block; | ||
136 | + width: 1px; | ||
137 | + position: absolute; | ||
138 | + top: -1px; | ||
139 | + bottom: -1px; | ||
140 | + left: -1px; | ||
141 | + background: inherit; | ||
142 | + } | ||
143 | + } | ||
144 | + &-with-search{ | ||
145 | + &:hover{ | ||
146 | + .@{input-prefix-cls} { | ||
147 | + border-color: tint(@primary-color, 20%); | ||
148 | + } | ||
149 | + } | ||
150 | + } | ||
104 | } | 151 | } |
105 | 152 | ||
106 | .@{input-prefix-cls}-group{ | 153 | .@{input-prefix-cls}-group{ |