Blame view

src/components/input/input.vue 5.12 KB
7fa943eb   梁灏   init
1
  <template>
7d5431d8   梁灏   update some style
2
      <div :class="wrapClasses">
0f822c9b   梁灏   add Input component
3
4
5
6
          <template v-if="type !== 'textarea'">
              <div :class="[prefixCls + '-group-prepend']" v-if="prepend" v-el:prepend><slot name="prepend"></slot></div>
              <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">
0f822c9b   梁灏   add Input component
17
18
19
20
21
22
23
              <div :class="[prefixCls + '-group-append']" v-if="append" v-el:append><slot name="append"></slot></div>
          </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
90
                  prefixCls: prefixCls,
                  prepend: true,
                  append: true,
                  textareaStyles: {}
7fa943eb   梁灏   init
91
92
93
              }        
          },
          computed: {
7d5431d8   梁灏   update some style
94
              wrapClasses () {
0f822c9b   梁灏   add Input component
95
96
97
                  return [
                      `${prefixCls}-wrapper`,
                      {
12418c6a   梁灏   fixed #74
98
                          [`${prefixCls}-wrapper-${this.size}`]: !!this.size,
0f822c9b   梁灏   add Input component
99
100
101
102
103
104
105
106
107
108
109
110
111
112
                          [`${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
113
              },
0f822c9b   梁灏   add Input component
114
              textareaClasses () {
7fa943eb   梁灏   init
115
116
117
                  return [
                      `${prefixCls}`,
                      {
0f822c9b   梁灏   add Input component
118
                          [`${prefixCls}-disabled`]: this.disabled
7fa943eb   梁灏   init
119
120
121
                      }
                  ]
              }
0f822c9b   梁灏   add Input component
122
123
124
125
126
127
128
129
          },
          methods: {
              handleEnter () {
                  this.$emit('on-enter');
              },
              handleIconClick () {
                  this.$emit('on-click');
              },
0a48ac45   梁灏   Input add readonl...
130
131
132
133
134
135
              handleFocus () {
                  this.$emit('on-focus');
              },
              handleBlur () {
                  this.$emit('on-blur');
              },
0f822c9b   梁灏   add Input component
136
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;
              }
              this.resizeTextarea();
7fa943eb   梁灏   init
165
166
167
          }
      }
  </script>