Blame view

src/components/input/input.vue 5.22 KB
7fa943eb   梁灏   init
1
  <template>
7d5431d8   梁灏   update some style
2
      <div :class="wrapClasses">
0f822c9b   梁灏   add Input component
3
          <template v-if="type !== 'textarea'">
6ff31952   梁灏   optimize Input sh...
4
              <div :class="[prefixCls + '-group-prepend']" v-if="prepend" v-show="slotReady" v-el:prepend><slot name="prepend"></slot></div>
0f822c9b   梁灏   add Input component
5
6
              <i class="ivu-icon" :class="['ivu-icon-' + icon, prefixCls + '-icon']" v-if="icon" @click="handleIconClick"></i>
              <input
6c145a04   梁灏   fixed #77
7
                  :type="type"
0f822c9b   梁灏   add Input component
8
9
10
11
                  :class="inputClasses"
                  :placeholder="placeholder"
                  :disabled="disabled"
                  :maxlength="maxlength"
0a48ac45   梁灏   Input add readonl...
12
                  :readonly="readonly"
0f822c9b   梁灏   add Input component
13
                  v-model="value"
0a48ac45   梁灏   Input add readonl...
14
15
16
                  @keyup.enter="handleEnter"
                  @focus="handleFocus"
                  @blur="handleBlur">
6ff31952   梁灏   optimize Input sh...
17
              <div :class="[prefixCls + '-group-append']" v-if="append" v-show="slotReady" v-el:append><slot name="append"></slot></div>
0f822c9b   梁灏   add Input component
18
19
20
21
22
23
          </template>
          <textarea
              v-else
              v-el:textarea
              :class="textareaClasses"
              :style="textareaStyles"
7d5431d8   梁灏   update some style
24
              :placeholder="placeholder"
0f822c9b   梁灏   add Input component
25
26
27
              :disabled="disabled"
              :rows="rows"
              :maxlength="maxlength"
0a48ac45   梁灏   Input add readonl...
28
              :readonly="readonly"
0f822c9b   梁灏   add Input component
29
              v-model="value"
0a48ac45   梁灏   Input add readonl...
30
31
32
              @keyup.enter="handleEnter"
              @focus="handleFocus"
              @blur="handleBlur">
0f822c9b   梁灏   add Input component
33
          </textarea>
7d5431d8   梁灏   update some style
34
      </div>
7fa943eb   梁灏   init
35
36
37
  </template>
  <script>
      import { oneOf } from '../../utils/assist';
0f822c9b   梁灏   add Input component
38
      import calcTextareaHeight from '../../utils/calcTextareaHeight';
7fa943eb   梁灏   init
39
40
41
42
43
44
  
      const prefixCls = 'ivu-input';
  
      export default {
          props: {
              type: {
0f822c9b   梁灏   add Input component
45
                  validator (value) {
6c145a04   梁灏   fixed #77
46
                      return oneOf(value, ['text', 'textarea', 'password']);
0f822c9b   梁灏   add Input component
47
                  },
7fa943eb   梁灏   init
48
49
50
51
52
53
54
                  default: 'text'
              },
              value: {
                  type: [String, Number],
                  default: '',
                  twoWay: true
              },
7fa943eb   梁灏   init
55
56
57
58
              size: {
                  validator (value) {
                      return oneOf(value, ['small', 'large']);
                  }
0f822c9b   梁灏   add Input component
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
              },
              placeholder: {
                  type: String,
                  default: ''
              },
              maxlength: {
                  type: Number
              },
              disabled: {
                  type: Boolean,
                  default: false
              },
              icon: String,
              autosize: {
                  type: [Boolean, Object],
                  default: false
              },
              rows: {
                  type: Number,
                  default: 2
0a48ac45   梁灏   Input add readonl...
79
80
81
82
              },
              readonly: {
                  type: Boolean,
                  default: false
7fa943eb   梁灏   init
83
84
85
86
              }
          },
          data () {
              return {
0f822c9b   梁灏   add Input component
87
88
89
                  prefixCls: prefixCls,
                  prepend: true,
                  append: true,
6ff31952   梁灏   optimize Input sh...
90
                  slotReady: false,
0f822c9b   梁灏   add Input component
91
                  textareaStyles: {}
7fa943eb   梁灏   init
92
93
94
              }        
          },
          computed: {
7d5431d8   梁灏   update some style
95
              wrapClasses () {
0f822c9b   梁灏   add Input component
96
97
98
                  return [
                      `${prefixCls}-wrapper`,
                      {
12418c6a   梁灏   fixed #74
99
                          [`${prefixCls}-wrapper-${this.size}`]: !!this.size,
0f822c9b   梁灏   add Input component
100
101
102
103
104
105
106
107
108
109
110
111
112
113
                          [`${prefixCls}-type`]: this.type,
                          [`${prefixCls}-group`]: this.prepend || this.append,
                          [`${prefixCls}-group-${this.size}`]: (this.prepend || this.append) && !!this.size
                      }
                  ]
              },
              inputClasses () {
                  return [
                      `${prefixCls}`,
                      {
                          [`${prefixCls}-${this.size}`]: !!this.size,
                          [`${prefixCls}-disabled`]: this.disabled
                      }
                  ]
7d5431d8   梁灏   update some style
114
              },
0f822c9b   梁灏   add Input component
115
              textareaClasses () {
7fa943eb   梁灏   init
116
117
118
                  return [
                      `${prefixCls}`,
                      {
0f822c9b   梁灏   add Input component
119
                          [`${prefixCls}-disabled`]: this.disabled
7fa943eb   梁灏   init
120
121
122
                      }
                  ]
              }
0f822c9b   梁灏   add Input component
123
124
125
126
127
128
129
130
          },
          methods: {
              handleEnter () {
                  this.$emit('on-enter');
              },
              handleIconClick () {
                  this.$emit('on-click');
              },
0a48ac45   梁灏   Input add readonl...
131
132
133
134
135
136
              handleFocus () {
                  this.$emit('on-focus');
              },
              handleBlur () {
                  this.$emit('on-blur');
              },
0f822c9b   梁灏   add Input component
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
              resizeTextarea () {
                  const autosize = this.autosize;
                  if (!autosize || this.type !== 'textarea') {
                      return false;
                  }
  
                  const minRows = autosize.minRows;
                  const maxRows = autosize.maxRows;
  
                  this.textareaStyles = calcTextareaHeight(this.$els.textarea, minRows, maxRows);
              }
          },
          watch: {
              value (val) {
                  this.$nextTick(() => {
                      this.resizeTextarea();
                  });
                  this.$emit('on-change', val);
              }
          },
          ready () {
              if (this.type === 'text') {
                  this.prepend = this.$els.prepend.innerHTML !== '';
                  this.append = this.$els.append.innerHTML !== '';
              } else {
                  this.prepend = false;
                  this.append = false;
              }
6ff31952   梁灏   optimize Input sh...
165
              this.slotReady = true;
0f822c9b   梁灏   add Input component
166
              this.resizeTextarea();
7fa943eb   梁灏   init
167
168
169
          }
      }
  </script>