自定义指令

有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。

<div id="directive-demo">
<input v-focus />
</div>
  • 全局注册

    Vue.directive('focus', {
    /* 注册一个全局自定义指令 `v-focus` */
    inserted: function (el) {
    el.focus()
    }
    /* 当被绑定的元素插入到 DOM 中时…… */
    })
    new Vue({el:'#directive-demo'})
  • 局部注册

    new Vue({
    el:'#directive-demo',
    directives: {
    focus: {
    inserted: function (el) {
    el.focus()
    }
    }
    }
    })

指令钩子函数

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  • inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

<!-- //bind(el[,binding[,vnode[,oldVnode]]]) -->
<!--
// el: 指令所绑定的元素,可以用来直接操作 DOM(读写)。
// binding: {name, value, oldValue, expression, arg, modifiers}
/**
** name: 指令名,不包括 v- 前缀。
** value: 指令的绑定值, 绑定值为表达式时显示结果。如果指令需要多个值,可以传入一个 JavaScript 对象字面 ****量。记住,指令函数能够接受所有合法的 JavaScript 表达式。
** oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。
** expression: 字符串形式的指令表达式,绑定值为表达式时显示表达式。
** arg: 传给指令的参数。形式:v-my-directive:foo。
** modifiers: 一个包含修饰符的对象。
**** 例如: v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
**/
// vnode: Vue 编译生成的虚拟节点。
//oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。--> <div id="hook-args-demo" v-demo:foo.a.b="message"></div>
<script>
Vue.directive('demo', {
bind: function (el, binding, vnode) {
var s = JSON.stringify
el.innerHTML = 'name: ' + s(binding.name) + '<br>' + 'value: ' + s(binding.value) + '<br>' + 'expression: ' + s(binding.expression) + '<br>' + 'argument: ' + s(binding.arg) + '<br>' + 'modifiers: ' + s(binding.modifiers) + '<br>' + 'vnode keys: ' + Object.keys(vnode).join(', ')
}
}) new Vue({
el: '#hook-args-demo',
data: { message: 'hello!' }
})
</script>

函数简写

在很多时候,你可能想在 bind 和 update 时触发相同行为。

Vue.directive('color', function (el,binding) {
el.style.backgroundColor = binding.value;
})

动态指令参数

指令的参数可以是动态的。例如,在 v-mydirective:[argument]="value" 中,argument 参数可以根据组件实例数据进行更新!

<div id="dynamicexample">
<h3>Scroll down inside this section ↓</h3>
<p v-pin:[direction]="200">I am pinned onto the page at 200px to the left</p>
</div>
<script>
Vue.directive('pin', {
bind: function (el, binding, vnode) {
el.style.position = 'fixed'
el.style[binding.arg] = binding.value + 'px';
}
})
new Vue({
el: '#dynamicexample',
data: function () {
return {direction: 'left'}
}
})
</script>

最新文章

  1. unix下输出重定向
  2. vijos-1003等价表达式
  3. 转 猫都能学会的Unity3D Shader入门指南(二)
  4. 【转载】主数据管理(MDM)与元数据管理
  5. 【转】代码编辑器(二)-SynEdit
  6. socket 基础知识
  7. sql over()---转载
  8. Windows下MySQL数据库备份脚本(一)
  9. MFC如何生成一个可串行化的类
  10. QML中多样化的ListModel(MultiDelegate)
  11. 前端到后台ThinkPHP开发整站(7)
  12. 版本号控制-GitHub
  13. 电脑打不开网页,使用dns优化下就可以了。
  14. Spring 将请求参数封装成对象
  15. Docker使用Mysql镜像命令
  16. flask中注册验证码和分页
  17. java 排序算法
  18. 【学习总结】C-翁恺老师-入门-第0周&lt;程序设计与C&gt;
  19. 20144306《网络对抗》MAL_恶意代码分析
  20. JS版日期格式化和解析工具类,毫秒级

热门文章

  1. [图像处理] YUV图像处理入门5
  2. Java求值策略
  3. python之路50 ORM执行SQL语句 操作多表查询 双下线方法
  4. Mac下vscode编辑器设置
  5. vue element admin 关闭eslint校验
  6. JUC并发编程
  7. Java入门与进阶P-3.7+P-3.8
  8. bbs大作业
  9. unity 实现自定义class深度拷贝 deep copy 深度复制 引用类型复制
  10. Vue15 v-for和key的作用及原理