ソースを参照

feat clearBtnPersonnal

shenqistart 5 年 前
コミット
01198fe81d
3 ファイル変更307 行追加244 行削除
  1. 184 146
      src/packages/textinput/demo.vue
  2. 24 9
      src/packages/textinput/doc.md
  3. 99 89
      src/packages/textinput/textinput.vue

+ 184 - 146
src/packages/textinput/demo.vue

@@ -1,174 +1,212 @@
 <template>
-  <div class="textinput-demo">
+    <div class="textinput-demo">
+        <h4>基本用法</h4>
+        <div>
+            <nut-cell>
+                <span slot="title">
+                    <nut-textinput v-model="val" label="基本用法:" placeholder="请输入内容" />
+                </span>
+            </nut-cell>
+            <nut-cell>
+                <span slot="title">Value值: {{val}}</span>
+            </nut-cell>
+        </div>
+        <h4>配置</h4>
+        <div>
+            <nut-cell>
+                <span slot="title">
+                    <nut-textinput
+                        :clearBtn="false"
+                        v-model="val2"
+                        label="无清空按钮:"
+                        placeholder="请输入内容"
+                    />
+                </span>
+            </nut-cell>
+            <nut-cell>
+                <span slot="title">
+                    <nut-textinput :disabled="true" label="禁用状态:" placeholder="请输入内容" />
+                </span>
+            </nut-cell>
+            <nut-cell>
+                <span slot="title">
+                    <nut-textinput placeholder="请输入密码" v-model="val3" label="密码框:" type="password" />
+                </span>
+            </nut-cell>
+            <nut-cell>
+                <span slot="title">
+                    <nut-textinput
+                        placeholder="请输入内容"
+                        v-model="val4"
+                        label="无边框:"
+                        :hasBorder="false"
+                    />
+                </span>
+            </nut-cell>
+        </div>
+        <h4>使用input原生属性</h4>
+        <div>
+            <nut-cell>
+                <span slot="title">
+                    <nut-textinput
+                        placeholder="maxlength=5"
+                        maxlength="5"
+                        label="限制文字数:"
+                        :outline="false"
+                        :hasBorder="false"
+                    />
+                </span>
+            </nut-cell>
+            <nut-cell>
+                <span slot="title">
+                    <nut-textinput
+                        placeholder="请输入内容"
+                        v-model="val5"
+                        readonly
+                        label="只读:"
+                        :outline="false"
+                    />
+                </span>
+            </nut-cell>
+        </div>
 
-    <h4>基本用法</h4>
-    <div>
-      <nut-cell>
-        <span slot="title">
-          <nut-textinput v-model="val" label="基本用法:" placeholder="请输入内容" />
-        </span>
-      </nut-cell>
-      <nut-cell>
-        <span slot="title">Value值: {{val}}</span>
-      </nut-cell>
-    </div>
-    <h4>配置</h4>
-    <div>
-      <nut-cell>
-        <span slot="title">
-          <nut-textinput :clearBtn="false" v-model="val2" label="无清空按钮:" placeholder="请输入内容" />
-        </span>
-      </nut-cell>
-      <nut-cell>
-        <span slot="title">
-          <nut-textinput :disabled="true" label="禁用状态:" placeholder="请输入内容" />
-        </span>
-      </nut-cell>
-      <nut-cell>
-        <span slot="title">
-          <nut-textinput placeholder="请输入密码" v-model="val3" label="密码框:" type="password" />
-        </span>
-      </nut-cell>
-      <nut-cell>
-        <span slot="title">
-          <nut-textinput placeholder="请输入内容" v-model="val4" label="无边框:" :hasBorder="false" />
-        </span>
-      </nut-cell>
-    </div>
-    <h4>使用input原生属性</h4>
-    <div>
-      <nut-cell>
-        <span slot="title">
-          <nut-textinput
-            placeholder="maxlength=5"
-            maxlength="5"
-            label="限制文字数:"
-            :outline="false"
-            :hasBorder="false"
-          />
-        </span>
-      </nut-cell>
-      <nut-cell>
-        <span slot="title">
-          <nut-textinput placeholder="请输入内容" v-model="val5" readonly label="只读:" :outline="false" />
-        </span>
-      </nut-cell>
-    </div>
-    
-    <h4>使用input原生事件</h4>
-    <div>
-      <nut-cell>
-        <span slot="title">
-          <nut-textinput
-            placeholder="请输入内容"
-            label="focus/blur事件:"
-            @focus="onFocus"
-            @blur="onBlur"
-            v-model="val6"
-            :hasBorder="false"
-          />
-        </span>
-      </nut-cell>
-      <nut-cell>
-        <span slot="title">事件触发结果:{{result}}</span>
-      </nut-cell>
-    </div>
-    <h4>自定义Class</h4>
-    <div>
-      <nut-cell>
-        <span slot="title">
-          <nut-textinput class="my-input" v-model="val7" placeholder="请输入搜索内容" />
-        </span>
-      </nut-cell>
-    </div>
-    
-    <h4>自动聚焦</h4>
-    <div class="autoFucus">
-      <nut-textinput  class="my-input" type="search" v-model="val8"  placeholder="请输入搜索内容" ref="myInput" @keyup.enter="submit" />
+        <h4>使用input原生事件</h4>
+        <div>
+            <nut-cell>
+                <span slot="title">
+                    <nut-textinput
+                        placeholder="请输入内容"
+                        label="focus/blur事件:"
+                        @focus="onFocus"
+                        @blur="onBlur"
+                        v-model="val6"
+                        :hasBorder="false"
+                    />
+                </span>
+            </nut-cell>
+            <nut-cell>
+                <span slot="title">事件触发结果:{{result}}</span>
+            </nut-cell>
+        </div>
+        <h4>自定义Class</h4>
+        <div>
+            <nut-cell>
+                <span slot="title">
+                    <nut-textinput class="my-input" v-model="val7" placeholder="请输入搜索内容"></nut-textinput>
+                </span>
+            </nut-cell>
+        </div>
+        <h4>自定义关闭按钮样式</h4>
+        <div>
+            <nut-cell>
+                <span slot="title">
+                    <nut-textinput
+                        class="my-input"
+                        v-model="val9"
+                        placeholder="请输入搜索内容"
+                        :clearBtnPersonnal="true"
+                    >
+                        <template v-slot:clearBtn>
+                            <nut-icon type="cross"></nut-icon>
+                        </template>
+                    </nut-textinput>
+                </span>
+            </nut-cell>
+        </div>
+        <h4>自动聚焦</h4>
+        <div class="autoFucus">
+            <nut-textinput
+                class="my-input"
+                type="search"
+                v-model="val8"
+                placeholder="请输入搜索内容"
+                ref="myInput"
+                @keyup.enter="submit"
+            />
 
-      <div class="searchBtn" @click="submit">搜索</div>
+            <div class="searchBtn" @click="submit">搜索</div>
+        </div>
     </div>
-  </div>
 </template>
 
 <script>
 export default {
-  data() {
-    return {
-      val: "",
-      val2: "",
-      val3: "",
-      val4: "",
-      val5: "我使用了readonly原生属性",
-      val6: "",
-      val7: "",
-      val8: "",
-      result: "尚未触发"
-    };
-  },
-
-  mounted() {
-    const th = this
-			this.$nextTick(function() {
-				setTimeout(function() {
-					th.$refs.myInput.focus()
-				}, 2000)
-				
-			})
-  },
-  methods: {
-    onFocus() {
-      this.result = "focus事件触发!";
+    data() {
+        return {
+            val: "",
+            val2: "",
+            val3: "",
+            val4: "",
+            val5: "我使用了readonly原生属性",
+            val6: "",
+            val7: "",
+            val8: "",
+            val9: "",
+            result: "尚未触发"
+        };
     },
-    onBlur() {
-      this.result = "blur事件触发!";
+
+    mounted() {
+        const th = this;
+        this.$nextTick(function() {
+            setTimeout(function() {
+                th.$refs.myInput.focus();
+            }, 2000);
+        });
     },
+    methods: {
+        onFocus() {
+            this.result = "focus事件触发!";
+        },
+        onBlur() {
+            this.result = "blur事件触发!";
+        },
 
-    submit() {
-        this.$refs.myInput.blur()
+        submit() {
+            this.$refs.myInput.blur();
+        }
     }
-  }
 };
 </script>
 
 <style lang="scss">
 .textinput-demo {
-  padding-left: 0;
-  padding-right: 0;
+    padding-left: 0;
+    padding-right: 0;
 }
 .textinput-demo h4 {
-  padding: 0 10px;
+    padding: 0 10px;
 }
 
-.autoFucus{
-  background: #fff;
-  padding: 10px;
+.autoFucus {
+    background: #fff;
+    padding: 10px;
 
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
 
-  .my-input{
-    flex: 1;
-  }
-  .searchBtn{
-    margin-left: 10px;
-  }
+    .my-input {
+        flex: 1;
+    }
+    .searchBtn {
+        margin-left: 10px;
+    }
 }
 .nut-textinput {
-  &.my-input {
-    input {
-      height: 36px;
-      border-radius: 20px;
-      padding-left: 40px;
-      padding-right: 40px;
-      background: url("data:image/svg+xml, %3Csvg version='1' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M15.8 14.3l-3.3-3.1c1-1.1 1.6-2.6 1.6-4.1 0-3.6-3.1-6.6-7-6.6s-7 3-7 6.6c0 3.6 3.1 6.6 7 6.6 1.7 0 3.2-.6 4.4-1.5l3.3 3.1c.1.1.3.2.5.2s.4-.1.5-.2c.3-.3.3-.7 0-1zM1.5 7.1c0-2.9 2.5-5.2 5.6-5.2 3.1 0 5.6 2.3 5.6 5.2 0 2.9-2.5 5.2-5.6 5.2-3.2 0-5.6-2.3-5.6-5.2z' fill-rule='evenodd' clip-rule='evenodd' fill='%23999999'/%3E%3C/svg%3E")
-        no-repeat 10px center;
-      background-size: 18px;
-    }
-    .nut-textinput-clear {
-      right: 15px;
+    &.my-input {
+        input {
+            height: 36px;
+            border-radius: 20px;
+            padding-left: 40px;
+            padding-right: 40px;
+            background: url("data:image/svg+xml, %3Csvg version='1' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M15.8 14.3l-3.3-3.1c1-1.1 1.6-2.6 1.6-4.1 0-3.6-3.1-6.6-7-6.6s-7 3-7 6.6c0 3.6 3.1 6.6 7 6.6 1.7 0 3.2-.6 4.4-1.5l3.3 3.1c.1.1.3.2.5.2s.4-.1.5-.2c.3-.3.3-.7 0-1zM1.5 7.1c0-2.9 2.5-5.2 5.6-5.2 3.1 0 5.6 2.3 5.6 5.2 0 2.9-2.5 5.2-5.6 5.2-3.2 0-5.6-2.3-5.6-5.2z' fill-rule='evenodd' clip-rule='evenodd' fill='%23999999'/%3E%3C/svg%3E")
+                no-repeat 10px center;
+            background-size: 18px;
+        }
+        .nut-textinput-clear {
+            right: 15px;
+        }
     }
-  }
 }
 </style>

+ 24 - 9
src/packages/textinput/doc.md

@@ -63,6 +63,19 @@
 />
 ```
 
+自定义关闭按钮样式
+```html
+<nut-textinput
+    class="my-input"
+    v-model="val7"
+    placeholder="请输入搜索内容"
+    :clearBtnPersonnal="true"
+>
+    <template v-slot:clearBtn>
+        <nut-icon type="cross"></nut-icon>
+    </template>
+</nut-textinput>
+```
 自动聚焦
 
 注:由于移动设备的不同,第一次自动获取焦点并不一定能吊起键盘,需要手动吊起来一次,当再次进入时则正常吊起键盘
@@ -106,15 +119,17 @@ export default {
 
 ## Prop
 
-| 字段 | 说明 | 类型 | 默认值
-|----- | ----- | ----- | ----- 
-| value | 当前input值,可使用 v-model 双向绑定数据 | String | ''
-| type | input输入框的类型 | String | 'text'
-| placeholder | 占位文本 | String | ''
-| label | 文本框前面的标签 | String | ''
-| disabled | 是否禁用 | Boolean | false
-| clear-btn | 是否需要清空按钮 | Boolean | true
-| has-border | 是否需要边框 | Boolean | true
+| 字段              | 说明                                                                                     | 类型    | 默认值 |
+| ----------------- | ---------------------------------------------------------------------------------------- | ------- | ------ |
+| value             | 当前input值,可使用 v-model 双向绑定数据                                                 | String  | ''     |
+| type              | input输入框的类型                                                                        | String  | 'text' |
+| placeholder       | 占位文本                                                                                 | String  | ''     |
+| label             | 文本框前面的标签                                                                         | String  | ''     |
+| disabled          | 是否禁用                                                                                 | Boolean | false  |
+| clear-btn         | 是否需要清空按钮                                                                         | Boolean | true   |
+| has-border        | 是否需要边框                                                                             | Boolean | true   |
+| clearBtnPersonnal | 是否需要定制化清除按钮,如果是true,需要配合slot:  clearBtn使用,如案例自定义关闭按钮样式 | Boolean | false  |
+
 
 ## 特殊说明 
 

+ 99 - 89
src/packages/textinput/textinput.vue

@@ -1,102 +1,112 @@
 <template>
-  <form action="javascript:return true" :class="['nut-textinput',{'nut-textinput-disabled':disabled}]">
-    
-      <span class="nut-textinput-label" v-if="label">{{label}}</span>
-      <input
-        :type="type"
-        :placeholder="placeholder"
-        :value="value"
-        :disabled="disabled"
-        ref='nutUiInput'
-        :style="{'borderWidth':hasBorder?'':0,'outline':outline?'':'none','padding-right':clearBtn?'':'10px'}"
-        v-bind="$attrs"
-        v-on="inputListeners"
-        
-      />
-      <span class="nut-textinput-clear" v-if="clearBtn" v-show="clearBtnShow" @click="clear">
-        <svg version="1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
-          <path
-            d="M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm2.8 9.7c.3.3.3.8 0 1.1s-.8.3-1.1 0L8 9.1l-1.7 1.7c-.3.3-.8.3-1.1 0-.3-.3-.3-.8 0-1.1L6.9 8 5.2 6.3c-.3-.3-.3-.8 0-1.1.3-.3.8-.3 1.1 0L8 6.9l1.7-1.7c.3-.3.8-.3 1.1 0 .3.3.3.8 0 1.1L9.1 8l1.7 1.7z"
-          ></path>
-        </svg>
-      </span>
-  </form>
+    <form
+        action="javascript:return true"
+        :class="['nut-textinput',{'nut-textinput-disabled':disabled}]"
+    >
+        <span class="nut-textinput-label" v-if="label">{{label}}</span>
+        <input
+            :type="type"
+            :placeholder="placeholder"
+            :value="value"
+            :disabled="disabled"
+            ref="nutUiInput"
+            :style="{'borderWidth':hasBorder?'':0,'outline':outline?'':'none','padding-right':clearBtn?'':'10px'}"
+            v-bind="$attrs"
+            v-on="inputListeners"
+        />
+        <span class="nut-textinput-clear" v-if="clearBtn" v-show="clearBtnShow" @click="clear">
+            <svg
+                version="1"
+                xmlns="http://www.w3.org/2000/svg"
+                viewBox="0 0 16 16"
+                v-if="!clearBtnPersonnal"
+            >
+                <path
+                    d="M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm2.8 9.7c.3.3.3.8 0 1.1s-.8.3-1.1 0L8 9.1l-1.7 1.7c-.3.3-.8.3-1.1 0-.3-.3-.3-.8 0-1.1L6.9 8 5.2 6.3c-.3-.3-.3-.8 0-1.1.3-.3.8-.3 1.1 0L8 6.9l1.7-1.7c.3-.3.8-.3 1.1 0 .3.3.3.8 0 1.1L9.1 8l1.7 1.7z"
+                />
+            </svg>
+            <slot name="clearBtn" v-else></slot>
+        </span>
+    </form>
 </template>
 <script>
 export default {
-  name: "nut-textinput",
-  props: {
-    value: {
-      type: String,
-      default: ""
-    },
-    type: {
-      type: String,
-      default: "text"
-    },
-    label: {
-      type: String,
-      default: ""
-    },
-    placeholder:{
-      type: String,
-      default: ""
-    },
-    
-    disabled: {
-      type: Boolean,
-      default: false
-    },
-    hasBorder: {
-      type: Boolean,
-      default: true
+    name: "nut-textinput",
+    props: {
+        value: {
+            type: String,
+            default: ""
+        },
+        type: {
+            type: String,
+            default: "text"
+        },
+        label: {
+            type: String,
+            default: ""
+        },
+        placeholder: {
+            type: String,
+            default: ""
+        },
+
+        disabled: {
+            type: Boolean,
+            default: false
+        },
+        hasBorder: {
+            type: Boolean,
+            default: true
+        },
+        outline: {
+            type: Boolean,
+            default: false
+        },
+        clearBtn: {
+            type: Boolean,
+            default: true
+        },
+        clearBtnPersonnal: {
+            type: Boolean,
+            default: false
+        }
     },
-    outline: {
-      type: Boolean,
-      default: false
+    computed: {},
+    data() {
+        return {
+            clearBtnShow: false
+        };
     },
-    clearBtn: {
-      type: Boolean,
-      default: true
-    }
-  },
-  computed: {},
-  data() {
-    return {
-      clearBtnShow: false
-    };
-  },
-  computed: {
-    inputListeners() {
-      let vm = this;
-      return Object.assign({}, this.$listeners, {
-        input: function(event) {
-          vm.clearBtnShow = !!event.target.value;
-          vm.$emit("input", event.target.value);
+    computed: {
+        inputListeners() {
+            let vm = this;
+            return Object.assign({}, this.$listeners, {
+                input: function(event) {
+                    vm.clearBtnShow = !!event.target.value;
+                    vm.$emit("input", event.target.value);
+                }
+            });
         }
-      });
-    }
-  },
-
-  methods: {
-    clear() {
-      this.$emit("input", "");
-      this.clearBtnShow = false;
     },
 
-    focus() {
-      this.$nextTick(function() {
-        this.$refs.nutUiInput.focus()
-      })
-    },
+    methods: {
+        clear() {
+            this.$emit("input", "");
+            this.clearBtnShow = false;
+        },
 
-    blur() {
-      this.$refs.nutUiInput.blur()
-    }
-  },
-  mounted() {
-    this.clearBtnShow = !!this.value;
+        focus() {
+            this.$nextTick(function() {
+                this.$refs.nutUiInput.focus();
+            });
+        },
 
-  }
+        blur() {
+            this.$refs.nutUiInput.blur();
+        }
+    },
+    mounted() {
+        this.clearBtnShow = !!this.value;
+    }
 };
 </script>