vue3自定义全局指令(过滤前后空格,输入框自动聚焦,点击复制内容到粘贴板)

背景:产品要求,客户输入框可以输入空格,但提交数据的时候需要过滤前后空格。这就导致了v-model.trim不能用,因为trim会限制用户的输入。

在页面中的用法(因为是全局引入,单页面直接用即可)

// v-trim 可实现正常输入,但离开焦点或者回车,会过滤前后空格
// v-focus 实现打开页面自动聚焦,目前发现单行输入框可以,多文本输入框会报错
<el-input v-model="name" type="text" v-trim v-focus placeholder="请输入" @keyup.enter="getList" />

项目结构:
在这里插入图片描述
main.js (指令挂载到全局)

import { createApp } from 'vue'
import App from './App.vue'
import defineDirectives from '@/directive/index

const app = createApp(App)
defineDirectives(app)
app.mount('#app')

directive —> index.js

import $ from 'jquery'

function getInput(el) {
  let inputEle
  if (el.tagName !== 'INPUT') {
    inputEle = el.querySelector('input')
  } else {
    inputEle = el
  }
  return inputEle
}
function dispatchEvent(el, type) {
  const evt = document.createEvent('HTMLEvents')
  evt.initEvent(type, true, true)
  el.dispatchEvent(evt)
}
// 聚焦指令 v-focus
const focus = (app) => {
  app.directive('focus', {
    mounted(el) {
      const children = $(el).find('input')[0]
      $(children).focus()
    }
  })
}
// 过滤前后空格的指令 v-trim
const trim = (app) => {
  app.directive('trim', {
    mounted(el) {
      const inputEle = getInput(el)
      const handler = function(event) {
        const newVal = event.target.value.trim()
        if (event.target.value !== newVal) {
          event.target.value = newVal
          dispatchEvent(inputEle, 'input')
        }
      }
      // 回车后过滤空格(因为输入框可以回车调接口查询,所以这时候单纯的失去焦点过滤不起作用,要对回车键单独做一下处理)
      const keydown = function(event) {
        if (event.keyCode === 13) {
          const newVal = event.target.value.trim()
          if (event.target.value !== newVal) {
            event.target.value = newVal
            dispatchEvent(inputEle, 'input')
          }
        }
      }
      el.inputEle = inputEle
      el._blurHandler = handler
      el._keyHandler = keydown
      inputEle.addEventListener('blur', handler)
      inputEle.addEventListener('keydown', keydown)
    },
    unmounted(el) {
      const { inputEle } = el
      inputEle.removeEventListener('blur', el._blurHandler)
      inputEle.removeEventListener('keydown', el._keyHandler)
    }
  })
}
export default (app) => {
  focus(app)
  trim(app)
}

点击复制内容到粘贴板

1、最简单的方式是引入插件,也比较好用,直接百度就有。
2、手写指令的方式实现复制内容到粘贴板

具体实现效果如图:
在这里插入图片描述

代码里面的用法:
vue页面部分

<!-- 复制表格里面的url参数,复制到粘贴板的内容是 URL:具体的值,如果需要直接复制值,去掉前面拼接的字符串即可 -->
<span v-copy="'URL:'+row.url" class="blue-color">{{ row.url || '--' }}</span>

指令页面:

function copyFunction(value) {
  navigator.clipboard.writeText(value)
  ElMessage.success('成功复制到粘贴板!')
}
const copy = (app) => {
  app.directive('copy', {
    mounted(el, binding) {
      el.addEventListener('click', () => copyFunction(binding.value))
    },
    unmounted(el, binding) {
      el.removeEventListener('click', () => copyFunction(binding.value))
    }
  })
}

export default (app) => {
  copy(app)
}

会出现线上环境报错找不到writeText的问题,解决方案参考:

文章链接
菜鸟一枚,发现有问题的欢迎评论指导。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值