vue element el-input 输入框当内容长度超出时显示el-tooltip提示

参考资料:https://blog.csdn.net/qq_40190624/article/details/105730596

基于el-input与el-tooltip进行二次封装,当el-input 输入框当内容长度超出时显示el-tooltip提示,支持所有el-input的配置与事件。效果如图:

输入内容长度未超过输入框

输入内容长度超过输入框

组件代码如下(ts写法)

 1 <template>
 2     <el-tooltip effect="light" :content="value" :disabled="!isTip" ref="tip">
 3         <!-- v-bind="$attrs" v-on="$listeners"这样写只要组件没有拦截配置和事件,父组件中可以直接配置el-input -->
 4         <el-input
 5             ref="input"
 6             v-model="inputValue"
 7             v-bind="$attrs"
 8             v-on="$listeners"
 9             @input="onInput"
10         ></el-input>
11     </el-tooltip>
12 </template>
13 <script lang="ts">
14 import { Component, Vue, Model, Emit, Watch } from "vue-property-decorator";
15 /**
16  *
17  * el-input组件增强,当文字内容过长超过输入框宽度时,移动上去会浮动显示输入内容
18  *
19  * 用法和el-input一样
20  *
21  */
22 @Component({
23     name: "ZbTipInput"
24 })
25 export default class ZbTipInput extends Vue {
26     // 输入框值
27     inputValue: String = "";
28     // 是否显示tip
29     isTip: boolean = false;
30     // 是否初始化
31     isInit: boolean = true;
32     // v-model绑定值
33     @Model("change", { type: String }) value!: String;
34     @Emit("change") setValue() {}
35     // 抛出input事件
36     @Emit("input") input() {}
37     // 监听v-model绑定值
38     @Watch("value")
39     updateValue(v: string) {
40         const me = this as any;
41         // 设值输入框的值
42         me.inputValue = v;
43         // 视图绘制完处理逻辑
44         me.$nextTick(() => {
45             const input = me.$refs.input.getInput(),
46                 // 判断输入框文字内容是否超过输入框宽度
47                 isTip = input.offsetWidth < input.scrollWidth;
48             // 标识是否显示tip
49             me.isTip = isTip;
50             if (isTip) {
51                 if (!me.isInit) {
52                     // 如果文字内容超长,并且不是初始化状态
53                     // 显示tip提示
54                     const tip = me.$refs.tip;
55                     // 执行这个方法后tip提示才能实时显示
56                     tip.updatePopper();
57                     // 显示tip
58                     tip.show();
59                 } else {
60                     // 标识初始化完毕
61                     me.isInit = false;
62                 }
63             }
64         });
65     }
66     // 输入内容改变时
67     onInput(v: string) {
68         const me = this as any;
69         // 更新v-model绑定值
70         me.setValue(v);
71         // 组件拦截了el-input的input事件,这里手动抛出同样的事件,未验证
72         me.input(v);
73     }
74 }
75 </script>

使用

1                 <zb-tip-input
2                     v-model="formData.enterpriseMailbox"
3                     placeholder="请输入企业邮箱"
4                     clearable
5                     maxlength="40"
6                 ></zb-tip-input>

 

posted @ 2020-08-17 09:57  魔狼再世  阅读(8833)  评论(0编辑  收藏  举报