一、自定义指令:

自定义指令分为两种:全局自定义指令和局部自定义指令

全局指令指所有组件都可以使用,局部指令是只有在当前组件中才可以使用。

如,我们现在有个需求,当一个输入框获取焦点时,显示出一个div框,且可点击使之变色,当我们点击div框之外的地方,隐藏弹出的div框

<div v-click-outside="hide">
<input type="text" @focus="show">
<div v-if="isShow" style="width: 100px; height:100px;background: red;" @click="changeColor"></div>
</div>

vue实现方式如下:

let vm = new Vue({
el:"#app",
data(){
return{
isShow:false,
}
},
methods:{
show(){
this.isShow = true;
},
changeColor(e){
let c = [0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'];
let r = "#";
for(let i=0;i<c.length;i++){
r += c[Math.floor(Math.random()*c.length)];
}
e.target.style.background=r;
}
},
directives:{
'click-outside'(el,bindings,vnode){
document.addEventListener("click",function test(e){
if(!el.contains(e.target)){
vnode.context[bindings.expression]();
document.removeEventListener("click",test);
}
})
}
}
});

上面自定义了一个简单的局部指令,指令函数有三个参数

el:当前dom节点,初始化div默认是不展示的:

bingings:当前节点所有绑定的属性:

  name:指令名字

  value:指令的绑定值

  expression:字符串形式的指令表达式

  oldValue:指令绑定的前一个值(仅在update 和 componentUpdated 钩子中可用)

  arg:传给指令的参数(可选)

vnode:虚拟节点,它的上下文context里面有所有当前Vue对象上绑定的属性和方法

再看一个需求:有一个输入框,界面一刷新,输入框就会自动获得焦点。这个需求看起来很简单,但是这里涉及到了一个钩子的生命周期问题

<input type="text" v-focus="focus" />

Vue.directive("focus",function(el, bindings, vnode){
el.focus()
})

上面是最直观想到的方案,但是在实际执行过程中发现,这种做法是无效的。为什么呢?先看下自定义指令的生命周期:

自定义指令默认有5个生命周期:bind, inserted, update, componentUpdated, unbind

  bind::在指令第一次绑定到元素时调用。只会执行一次,且此时dom元素还没有插入页面父节点

  inserted:被绑定元素插入到父节点时调用

  update:被绑定元素所在模板更新时调用,无论绑定值是否变化

  componentUpdated:被绑定元素所在模板完成一次更新时调用

  unbind:指令解绑时调用,也只会执行一次

看了上面的指令生命周期,再看说我们上面的自定义指令为何不能成功?原因是组件在初始化调用指令时,是在bind中调用的,而这时dom元素还没有插入到父节点。

正确的应该怎么实现呢?

<input type='text' v-focus="focus">

new Vue({
el:"app",
directives:{
'focus'(el, bindings, vnode){
bind(){
console.log("bind");
},
inserted(){
el.focus()
},
}
}
})

注意:自定义指令中钩子里面没有Vue实例,this指向window

二、自定义过滤器

如,我们需要将用户英文名第一个字母大写,其他小写

使用方式 :{{ name | toUpper(1)  }}  // | :管道符

Vue.filter("toUpper",function(value, count){
count = count?count:value.length-1
return value.substr(0,count).toUpperCase()+value.substr(count);
});

Vue自定义指令和自定义过滤器的更多相关文章

  1. vue.js之过滤器,自定义指令,自定义键盘信息以及监听数据变化

    一.监听数据变化 1.监听数据变化有两种,深度和浅度,形式如下: vm.$watch(name,fnCb); //浅度 vm.$watch(name,fnCb,{deep:true}); //深度监视 ...

  2. vue.js_06_vue.js的自定义指令和自定义键盘修饰符

    1.全局的自定义指令 实现:当页面刷新时,光标聚焦到搜索框中 <label> 搜索: <input type="text" class="form-co ...

  3. vue_简介_渐进式 js 框架_内置指令_自定义指令_自定义插件

    vue 尤雨溪 华裔 Google 工程师 遵循 MVVM 模式 编码简洁,体积小,运行效率高,适合 移动 / PC 端 开发 动态构建用户界面: 异步获取后台数据,展现到页面 渐进式 js 框架 渐 ...

  4. freemarker实现自定义指令和自定义函数

    自定义指令: 1.指令在前台实现 <#macro name param1,param2,param3...paramN> </#macro> 2.指令在后台实现 1.实现Tem ...

  5. vue自定义指令获取焦点及过滤器修改时间

    <template id="comp3"> <div id="app"> <model :list="selectedl ...

  6. 从零开始学 Web 之 Vue.js(二)过滤器,按键修饰符,自定义指令

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  7. vue中自定义指令vue.direvtive,自定义过滤器vue.filter(),vue过渡transition

    自定义指令 默认设置的核心指令( v-model,v-bind,v-for,v-if,v-on等 ),Vue 也允许注册自定义指令.注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而 ...

  8. Vue.js学习使用心得(二)——自定义指令

    自定义指令 除了核心功能默认内置的指令,Vue 也允许注册自定义指令. 自定义指令可以定义全局指令,也可以定义局部指令. 使用 directives 选项来自定义指令. 定义全局指令: <div ...

  9. Vue.js学习 Item13 – 指令系统与自定义指令

    基础 除了内置指令,Vue.js 也允许注册自定义指令.自定义指令提供一种机制将数据的变化映射为 DOM 行为. 可以用 Vue.directive(id, definition) 方法注册一个全局自 ...

随机推荐

  1. numpy中的mean()函数

    本文链接:https://blog.csdn.net/lilong117194/article/details/78397329mean() 函数定义:numpy.mean(a, axis, dtyp ...

  2. Android 调用.Net WCF服务 .

    本来以为在java平台上用axis2生成了客户端代理类然后移植到Android平台上就好了.没想到在移植过程中出现了很多问题.说明JVM和android的DVM差距还是很大的. JVM执行的是clas ...

  3. Code Quality and Security | SonarQube

    SonarQube - 国内版 Binghttps://cn.bing.com/search?FORM=U227DF&PC=U227&q=SonarQube Code Quality ...

  4. 从0开始学爬虫2之json的介绍和使用

    从0开始学爬虫2之json的介绍和使用 Json 一种轻量级的数据交换格式,通用,跨平台 键值对的集合,值的有序列表 类似于python中的dict Json中的键值如果是字符串一定要用双引号 jso ...

  5. Python中产生随机数

    Python中产生随机数 一.Python自带的random库       1.参生n--m范围内的一个随机数:    random.randint(n,m) 2.产生0到1之间的浮点数:  rand ...

  6. Java 并发基础常见面试题总结

    1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启 ...

  7. Spring的@ExceptionHandler和@ControllerAdvice统一处理异常

    之前敲代码的时候,避免不了各种try..catch, 如果业务复杂一点, 就会发现全都是try…catch try{ ..........}catch(Exception1 e){ ......... ...

  8. 008-SpringBoot发布WAR启动报错:Error assembling WAR: webxml attribute is required

    一.Spring Boot发布war包流程: 1.修改web model的pom.xml <packaging>war</packaging> SpringBoot默认发布的都 ...

  9. 解决:error: Cannot find libmysqlclient_r under /usr/local/mysql.

    libodb-mysql-2.4.0.tar.gz 解压完安装libodb-mysql时,执行完./cofigure后,出现如下错误: checking for libmysqlclient_r... ...

  10. 安卓 android studio 报错 Lint found fatal errors while assembling a release target

    报错截图如下: 解决方法:在app的build.gradle中添加如下代码 android{ lintOptions { checkReleaseBuilds false abortOnError f ...