编写vue的输入框的自定义指令研究

  1. 先决条件,准备一个input和vue项目。这里使用了vue3项目。

    html 复制代码
    <template>
        <input>
    </template>
  2. 先确定自定义指令的编写方式。在setup里面直接编写。

    javascript 复制代码
    <template>
        <input v-input>
    </template>
    
    <script setup>
    const vInput = {
        mounted(el, binding, vnode) {
            console.log("222");
        }
    };
    </script>
  3. 测试是否有打印出222。我这边是有直接打印的。

  4. 我们解释一下他的参数 el,binding,vnode都有什么用,这里我们直接使用官网的图片。

  5. 其中vnode是虚拟节点。

  6. 在自定义组件中加入输入框的监听事件,使用el加入addEventListener的时间,就可以实现监听到绑定的指令时,输入框的输入的回调。

    javascript 复制代码
    <template>
        <input v-input ref="inputRef">
    </template>
    
    <script setup>
    const vInput = {
        mounted(el, binding, vnode) {
            if (vnode.type != "input") {
                return;
            }
            
            el.addEventListener('input', (e) => {
                const data = e.data;
            });
        }
    };
    </script>
  7. 这边可以实现一个需求,输入框只能输入整数。详细的需求是,如果输入的字母,不会添加到结果的后面。输入的字符可以从e.data中获取。

    javascript 复制代码
    el.addEventListener('input', (e) => {
        console.log("e", e.data);
    ));
  8. 将输入框的输入内容进行存储。将内容存储到oldValue中。

    javascript 复制代码
    let oldValue = "";
            
    el.addEventListener('input', (e) => {
        if (e.data && !/^\-?\d*\.?\d*$/.test(el.value)) {
            el.value = oldValue;
        }
        oldValue = el.value;
    });
  9. 判断输入框的文本是不是实数,如果是,就使用旧值进行赋值。

    javascript 复制代码
    const vInput = {
        mounted(el, binding, vnode) {
            if (vnode.type != "input") {
                return;
            }
            let oldValue = "";
            el.addEventListener('input', (e) => {
                if (e.data && !/^\-?\d*\.?\d*$/.test(el.value)) {
                    el.value = oldValue;
                }
                oldValue = el.value;
            });
        }
    };
  10. 全部代码

    javascript 复制代码
    <template>
        <input v-input ref="inputRef">
    </template>
    
    <script setup>
    const vInput = {
        mounted(el, binding, vnode) {
            if (vnode.type != "input") {
                return;
            }
            let oldValue = "";
            el.addEventListener('input', (e) => {
                if (e.data && !/^\-?\d*\.?\d*$/.test(el.value)) {
                    el.value = oldValue;
                }
                oldValue = el.value;
            });
        }
    };
    </script>
相关推荐
panxianren4 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
陈随易6 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
可乐鸡翅yeah_7 小时前
FFmpeg 生成 HLS 独立分片 independent‑segments 参数到底有什么用
javascript·ffmpeg·音视频·safari·m3u8
福兮说7 小时前
canvas 旋转图片的六个坑:四角被裁、Math.ceil 多出 1px 黑边、JPG 角发黑、翻转方向反了
前端·javascript·图像处理·canvas
Ai-_Man9 小时前
您您这可以把Grok的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑
传人once9 小时前
多图片上传预览功能如何写
前端·css·html·jquery·html5
Eric.469 小时前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
liangshanbo12159 小时前
JavaScript 异步核心主线
javascript·事件循环·异步操作
传人once11 小时前
悬停旋转放大和位移效果如何写
javascript·css·动画
库拉镜像AI牛牛11 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别