最近项目中有一个需求,所有的文本输入框需要过滤掉表情符号,但是觉得每次表单验证的时候去判断,有点麻烦。于是我想到了自定义一个指令,后续遇到需要删除表情符号的输入框,直接通过指令将表情符号删除就好了,方便快捷!

一、首先看看Vue自定义指令文档

https://cn.vuejs.org/v2/guide/custom-directive.html

二、在项目的directive中自定义一个指令:noEmoji

  这里需要用到的是对传入的binding的参数进行dom操作,将组件中的vue实例传入,改变vue实例中data的值

import Vue from 'vue';
import { Message } from 'element-ui' // 过滤输入框表情
Vue.directive('noEmoji', {
bind: function (el) {
console.log(el, 'bind')
},
inserted: function (el) {
console.log(el, 'inserted')
},
update: function clearEmoji(el, binding, vnode, oldVnode) {
let emojiRegex = require('emoji-regex')
let regex = emojiRegex()
let match = regex.exec(el.value)
if(match) {
Message('此输入框不支持表情')
el.value = el.value.replace(match[0], "")
if (binding && binding.value) {
let vm = binding.value.vm
let attr = binding.value.attr
let length = attr.length
switch (length) {
case 1:
vm.$set(vm, attr[0], el.value);
break;
case 2:
vm.$set(vm[attr[0]], attr[1], el.value);
break;
default:
return false
}
}
clearEmoji(el)
}
},
componentUpdated: function(el, binding, vnode, oldVnode) {
console.log(el, 'componentUpdated')
},
unbind: function(el, binding, vnode, oldVnode) {
console.log(el, 'unbind')
},
})

三、组件中使用指令后,input框中的表情符号会实时删除:

<input v-model="addForm.name" class="el-input__inner"  v-noEmoji="{vm : this, attr: ['addForm','name']}" placeholder="表单名称" />

四、注意点:

  这个指令只支持原生的dom,对于el-input这样的UI组件标签失效,因为自定义指令没有办法改变el-input标签的dom

Vue用递归实现一个消除输入框表情符的自定义directive的更多相关文章

  1. Vue学习笔记【13】——键盘修饰符以及自定义键盘修饰符

    1.x版本中自定义键盘修饰符[了解] Vue.directive('on').keyCodes.f2 = 113; 2.x版本中自定义键盘修饰符 通过Vue.config.keyCodes.名称 = ...

  2. 用Vue.js递归组件构建一个可折叠的树形菜单

    在Vue.js中一个递归组件调用的是其本身,如: Vue.component('recursive-component', {   template: `<!--Invoking myself! ...

  3. H5页面input输入框含有键盘自带的表情符时显示异常

    在做一个关于新闻的评论功能的H5页面时,需求里面要求能够发送表情显示表情,如果使用自定义的表情库,则在评论也还要加载大量的表情符图片,极大的影响加载速度,消耗流量,去看了下别的新闻网页版的评论部分也没 ...

  4. 【Vue.js实战案例】- Vue.js递归组件实现组织架构树和选人功能

    大家好!先上图看看本次案例的整体效果. 浪奔,浪流,万里涛涛江水永不休.如果在jq时代来实这个功能简直有些噩梦了,但是自从前端思想发展到现在的以MVVM为主流的大背景下,来实现一个这样繁杂的功能简直不 ...

  5. 谈谈Vue的递归组件

    2月最后一天,而且还四年一遇,然而本月居然一篇博客没写,有点说不过去.所以,今天就来谈谈Vue的递归组件.我们先来看一个例子: See the Pen 递归组件 by imgss (@imgss) o ...

  6. vue element-ui怎样提炼一个自己写的js当作公共js

    vue element-ui怎样提炼一个自己写的js当作公共js请教一下各位大神,我刚刚触摸vue element-ui几天,写的一个清晰检索的input框,现在需当作项目公共的部分,可遭需的html ...

  7. vue 学前班002(创建一个实例)

    创建一个Vue实例 我们之前说过,Vue是数据驱动视图的,只要model(模型层)的数据改变了,Vue就会帮我们改变视图上显示的内容,不用我们自己去动手写代码更新.那么,它是怎么做到的,我们的代码要怎 ...

  8. 【笔试题】Java 中如何递归显示一个目录下面的所有目录和文件?

    笔试题 Java 中如何递归显示一个目录下面的所有目录和文件? import java.io.File; public class Test { private static void showDir ...

  9. 如何使用Vue.js来搭建一个后台管理系统

    目录 使用的技术 基础但不好版 1.初始化项目 2.实现初始页内容自定义 3.使用路由 原始代码 自建页面 修改路由 4.测试路由跳转 补充 子路由版 嵌套router-view 定义子路由 修改菜单 ...

随机推荐

  1. Activity中使用PagerAdapter实现切换代码

    主活动 public class ViewPagerManager extends AppCompatActivity { private ViewPager viewPager; @Override ...

  2. 预处理、const、static与sizeof-内联函数与宏有什么区别

    1:二者的区别如下: (1)内联函数在编译时展开,宏在预编译时展开. (2)在编译的时候,内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的文本替换. (3)内联函数可以完成诸如类型检测.语句是否 ...

  3. 使用<bind>元素创建变量

    在使用模糊查询sql时,如果使用${}进行字符拼接,无法防止sql诸如问题,如果使用concat函数则只对mysql有效果,用Oracle则需要用连接符||,这样在数据库变的时候需要修改,不利于移植. ...

  4. Java学习回顾总结

    java-01初识Java见上一篇 Java-02 1.命名规范与规范: 标识符命名规则:首字母为字母|下划线|$ 其余部分数字|字母|下划线|$ 命名规范: 变量属性方法命名规范:第一个单词首字母小 ...

  5. np数组转换函数

    1.多维数组降为一维: a = np.arange(24) np.ravel(a)或者a.ravel a.flatten 2.数据类型转换 a = a.astype(np.float32) //tf是 ...

  6. 慎用String.intern()作为synchronized的对象锁

    https://www.cnblogs.com/yhlx/p/3498387.html

  7. C# WinForm设置窗口大小不可调,取消最大、最小化按键

    this.FormBorderStyle = FormBorderStyle.FixedDialog;//设置边框为不可调节 this.MaximizeBox = false;//取消最大化按键 th ...

  8. Rancher Server部署方式及Rancher HA环境部署

    类似Rancher这种的容器管理和编排工具,它可以很快地让每个组织获得高效的弹性集群管理能力.当前技术世界的发展形势就是让开发人员从繁琐的应用配置和管理中解放出来,使用容器镜像来处理复杂的程序运行依赖 ...

  9. 用python做线性规划

    scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simplex', ...

  10. MATLAB学习(六)绘图图形功能

    >> x=0:.1:2*pi;plot(x,sin(x),x,cos(x))                               >> plot(x,sin(x),'p ...