前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue 常用自定义指令(v-copy,v-debounce)

vue 常用自定义指令(v-copy,v-debounce)

作者头像
用户9260067
发布2022-03-09 11:27:58
1.3K0
发布2022-03-09 11:27:58
举报
文章被收录于专栏:开发小白的笔记

/* 需求:实现一键复制文本内容,用于鼠标右键粘贴。

思路:1、动态创建 textarea 标签,并设置 readOnly 属性及移出可视区域

2、将要复制的值赋给 textarea 标签的 value 属性,并插入到 body

3、选中值 textarea 并复制

4、将 body 中插入的 textarea 移除

5、在第一次调用时绑定事件,在解绑时移除事件

使用:给 Dom 加上 v-copy 及复制的文本即可 例子:<button v-copy="copyText">一键复制</button> */

代码语言:javascript
复制
Vue.directive('copy', {
    bind: function (el, binding, vnode) {
    el.$value = binding.value;
    el.handler = function () {
        if (!el.$value) {
            console.log("无复制内容")
            return
        }
        console.log(el.$value)
        // 动态创建 textarea 标签
        const textarea = document.createElement('textarea')
        // 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域
        textarea.readOnly = 'readonly'
        textarea.style.position = 'absolute'
        textarea.style.left = '-9999px'
        // 将要 copy 的值赋给 textarea 标签的 value 属性
        textarea.value = el.$value
        // 将 textarea 插入到 body 中
        document.body.appendChild(textarea)
        // 选中值并复制
        textarea.select()
        const result = document.execCommand('Copy')
        if (result) {
            console.log('复制成功') // 可根据项目UI仔细设计
        }
        document.body.removeChild(textarea);
        }
        // 绑定点击事件,就是所谓的一键 copy 啦
            el.addEventListener('click', el.handler)
        },
        //
        componentUpdated: function (el, value) {
            el.$value = value.value
            console.log(el.$value)
        },
        // 指令与元素解绑的时候,移除事件绑定
        unbind(el) {
            el.removeEventListener('click', el.handler)
        },
    })

/*  需求:防止按钮在短时间内被多次点击,使用防抖函数限制规定时间内只能点击一次。

     思路:

                1、第一次点击,立即调用方法并禁用按钮,等延迟结束再次激活按钮

                2、将需要触发的方法绑定在指令上

    使用:给 Dom 加上 v-debounce 及回调函数即可

<button v-debounce="debounceClick">防抖提交</button>

*/

代码语言:javascript
复制
Vue.directive('debounce', {
    bind: function (el, value) {
        // 添加点击事件
        el.addEventListener('click', function () {
            // 如果存在$timer,清除后从新点击
            if (el.$timer) {
                clearTimeout(el.$timer);
            }
            if (!el.disabled) {
                el.disabled = true
                value.value();
                el.$timer = setTimeout(() => {
                    el.disabled = false
                }, 1000)
            }
       })
    }
})

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档