Vue.js自定义指令  传送门

  自定义指令:除了内置指令,Vue也允许用户自定义指令

  注册指令:通过全局API Vue.directive可以注册自定义指令

  自定义指令的钩子函数参数:自定义指令的钩子函数可以传递4个参数,分别是el、binding、vnode、oldVnode

  Learn

    一、自定义指令钩子函数

    二、自定义指令钩子函数的参数

    三、自定义指令简写

  项目结构

  

  【每个demo下方都存有html源码】

一、自定义指令钩子函数  传送门

  自定义指令的钩子函数:

    bind:只调用一次,指令第一次绑定到元素时调用

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

    update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前

    componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用

    unbind:只调用一次,指令与元素解绑时调用

  自定义指令的使用:在自定指令的名称前加 上 v-;

  通过button点击按钮来控制是否解除绑定

<div id="GaryId">
<input type="text" v-model="name"/><br />
name:<span v-if="flag" v-demo ref='name'>{{name}}</span><br />
<button @click="flag=!flag">解除绑定</button>
</div>
Vue.directive('demo',{
//指令的钩子函数
bind(){
alert("bind 首次绑定到元素时候执行,执行一次,常用于数据的初始化操作");
},
inserted(){
alert("instered 插入到父节点之后,DOM对象");
},
unbind(){
alert("unbind 解除绑定");
},
update(){
alert("updata 绑定该指令的元素 所在的Vue实例挂载的DOM树 发生更新时候调用"+"name ="+vm.$refs.name.textContent);
},
componentUpdated(){
alert("componentUpdated 更新后调用"+"name ="+vm.$refs.name.textContent);
} });

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Gary</title>
<script type="text/javascript" src="../js/vue.js"></script> </head>
<body>
<div id="GaryId">
<input type="text" v-model="name"/><br />
name:<span v-if="flag" v-demo ref='name'>{{name}}</span><br />
<button @click="flag=!flag">解除绑定</button>
</div>
</body> <script> Vue.directive('demo',{
//指令的钩子函数
bind(){
alert("bind 首次绑定到元素时候执行,执行一次,常用于数据的初始化操作");
},
inserted(){
alert("instered 插入到父节点之后,DOM对象");
},
unbind(){
alert("unbind 解除绑定");
},
update(){
alert("updata 绑定该指令的元素 所在的Vue实例挂载的DOM树 发生更新时候调用"+"name ="+vm.$refs.name.textContent);
},
componentUpdated(){
alert("componentUpdated 更新后调用"+"name ="+vm.$refs.name.textContent);
} }); let vm = new Vue({
data:{
name:'Gary',
flag:true
}
}).$mount('#GaryId'); </script> </html>

Gary_Custom_Directive.html

二、自定义指令钩子函数的参数  传送门

  自定义指令的钩子函数参数:自定义指令的钩子函数可以传递4个参数,分别是el、binding、vnode、oldVnode;

  el:获取DOM对象;

  binding:一个包含很多属性的对象;

  vnode:Vue编译生成的虚拟节点;

  oldVnode:上一个虚拟节点;

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Gary</title>
<script type="text/javascript" src="../js/vue.js"></script> </head>
<body>
<div id="GaryId">
<input type="text" v-model="name" /><br />
name : <span v-demo.once.stop='name' ref='name'>{{name}}</span><br />
<button v-on:click="flag = !flag">click
</body> <script> Vue.directive('demo',{
//指令的钩子函数
bind(el,binding){
//console.log(el);
el.style.color='red';
console.log(binding.name);
console.log(binding.value); console.log(binding.expression);
console.log(binding.arg);
console.log(binding.modifiers); if(binding.arg === 'click'){
console.log("执行点击事件");
} if(binding.modifiers.once){
console.log("只执行一次");
} },
update(el,binding){
console.log("update value = "+binding.value);
console.log("update oldValue = "+binding.oldValue);
}
}); let vm = new Vue({
data:{
name:'Gary',
flag:true
}
}).$mount('#GaryId'); </script> </html>

Gary_Custom_Directive-02.html

三、自定义指令简写  传送门

  通过directives指令和focus指令实现修改样式和加载页面时自动聚焦

<div id="GaryId">
<!--通过v-focus标签,当页面加载时,自动聚焦到这个表单上-->
<input type="text" v-model="name" v-focus/><br />
name : <span v-font_style:blue>{{name}}</span><br />
</body>
      directives : {
font_style : function(el, binding){
el.style.color = binding.arg;
},
//聚焦
focus:{
inserted(el){
el.focus();
}
}

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Gary</title>
<script type="text/javascript" src="../js/vue.js"></script> </head>
<body>
<div id="GaryId">
<!--通过v-focus标签,当页面加载时,自动聚焦到这个表单上-->
<input type="text" v-model="name" v-focus/><br />
name : <span v-font_style:blue>{{name}}</span><br />
</body> <script> let vm = new Vue({
data : {
name : 'Gary',
flag : true
},
directives : {
font_style : function(el, binding){
el.style.color = binding.arg;
},
focus : {
inserted(el){
el.focus();
}
}
}
}).$mount('#GaryId'); </script> </html>

Gary_Custom_Directive-03.html

最新文章

  1. Flex4 自定义分页组件
  2. MFC 学习 之 状态栏的添加
  3. Temporary Post Used For Theme Detection (da655c32-bc15-41ad-bf89-e76c1ec1bea7 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
  4. bzoj 3033 太鼓达人
  5. DevExpress中SearchLookUpEdit用法总结
  6. ASP.NET打印EXCEl报表技术总结
  7. css 清除浮动 兼容IE+, FF
  8. BZOJ2002(分块)
  9. [平衡树] mingap
  10. Android 串口设置校验位、速率、停止位等参数
  11. Struts(十九):类型转换、类型转换错误消息及显示
  12. TCP三次握手及TCP连接状态 TCP报文首部格式
  13. git bash + gitee
  14. Java 下一代: 函数式编码风格&mdash;&mdash;Groovy、Scala 和 Clojure 共享的函数结构及其优势
  15. js相关判断
  16. Elasticsearch cluster health: yellow unassigned shards
  17. valgrind使用简介
  18. Objective-C中,类方法的getter和setter可以用点运算符吗?
  19. BZOJ 1061 志愿者招募 最小费用流&amp;&amp;线性规划建模
  20. 从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?

热门文章

  1. c# 获取屏幕图片
  2. Eclipse错误提示: Symbol &#39;xxxx&#39; could not be resolved
  3. 【weixin】微信支付简介
  4. 异常-try...catch的方式处理异常2
  5. how to solve error when start Hyper-V quick create app error
  6. O050、Create Volume 操作 (Part I)
  7. [leetcode] 题解记录 11-20
  8. 前端配置jenkins
  9. ConfigurableApplicationContext
  10. vim 去掉自动注释和自动回车