阅读目录

1.理解VUE中的自定义指令

默认核心指令有 (v-model 和 v-show), 但是有时候我们需要用到自定义指令,在vue中,代码复用主要形式和抽象是组件,但是在有的情况下,我们仍然需要对DOM元素进行底层操作,所以这个时候我们需要用到自定义指令。

比如下面的一个input框,当页面加载时,元素将获得焦点,我们还没有点击input框,input就获得焦点了,如下demo代码:

<!DOCTYPE html>
<html>
<head>
<title>演示Vue</title>
<style> </style>
</head>
<body>
<div id='demo'>
<input v-focus>
</div>
</body>
<script src="./vue.js"></script>
<script type="text/javascript"> // 注册一个全局定义指令 v-focus
Vue.directive('focus', { // 绑定元素插入到DOM 中
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
new Vue({
el: '#demo'
})
</script>
</html>

查看效果

上面的是全局定义指令 v-foucs, 当然我们也可以局部定义,如下代码:

<!DOCTYPE html>
<html>
<head>
<title>演示Vue</title>
<style> </style>
</head>
<body>
<div id='demo'>
<input v-focus>
</div>
</body>
<script src="./vue.js"></script>
<script type="text/javascript">
new Vue({
el: '#demo',
directives: {
focus: {
// 指令的定义
inserted: function (el) {
// 聚焦元素
el.focus()
}
}
}
})
</script>
</html>

查看效果

然后我们就可以在任何input元素框或者textarea使用 v-focus 了,如下代码:

<input v-focus />

2. 指令定义函数提供了如下几个钩子函数(根据VUE教程来):
bind: 只调用一次,指令第一次绑定到元素时调用,也就是说初始化时候调用一次。
inserted: 被绑定元素插入父节点时调用(父节点需要存在才会调用)。
update: 被绑定元素所在的模板更新时调用(通过比较更新前后的绑定值)。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 指令与元素解绑时调用,只调用一次,和bind对应。

上面几个钩子函数有如下参数 (el, binding, vnode, oldVnode)
el: 指令所绑定的元素,可用来直接操作DOM。
binding: {Object} obj有如下属性:
name: 指令名,不包括 v- 前缀
value: 指令绑定值。比如 v-my-directive = '1+1', 那么value就是2.
oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
expression: 绑定值的字符串形式。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。
arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 "foo"。
modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。

vnode: Vue编译生成的虚拟节点。
oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

注意: 除了 el 之外,其它参数都应该是只读的,尽量不要修改他们。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。

如下demo代码:

<!DOCTYPE html>
<html>
<head>
<title>演示Vue</title>
<style> </style>
</head>
<body>
<div id='demo' v-demo:hello.a.b='message'> </div>
</body>
<script src="./vue.js"></script>
<script type="text/javascript">
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: ' + Object.keys(vnode).join(', ')
}
})
new Vue({
el: '#demo',
data: {
message: 'hello!'
}
})
</script>
</html>

查看效果

对象字面量
如果指令需要多个值,可以传入一个 JavaScript 对象字面量。
如下代码:

<!DOCTYPE html>
<html>
<head>
<title>演示Vue</title>
<style> </style>
</head>
<body>
<div id='demo' v-demo="{ color: 'white', text: 'hello!' }"> </div>
</body>
<script src="./vue.js"></script> <script type="text/javascript">
Vue.directive('demo', function (el, binding) {
console.log(binding.value.color) // => "white"
console.log(binding.value.text) // => "hello!"
})
new Vue({
el: '#demo'
})
</script>
</html>

查看效果

在控制台可以看到输出了字符串了。

2. Vue.js自定义指令的用途。
上面是教程中的一些demo,但是在实际当中我们需要用到什么地方呢?我们可以预想到可以使用到预加载数据的地方,比如预加载图片,由于图片加载需要一些时间,因此我们先加载一张占位符图片,
等图片真正加载完成时候,才加载真正的图片,这样的用户体验效果更能更好点。下面是使用vue自定义指令来实现这个功能,代码如下:

<!DOCTYPE html>
<html>
<head>
<title>演示Vue</title>
<style>
img { width: 180px; height: 180px; overflow: hidden;}
</style>
</head>
<body>
<div id='demo'>
<img v-for='item in list' v-img='item.url'/>
</div>
</body>
<script src="./vue.js"></script> <script type="text/javascript">
Vue.directive('img', {
inserted: function(el, binding) {
console.log(el)
// 下面使用一张背景颜色来演示一下,
var color = Math.floor(Math.random()*1000000);
el.style.backgroundColor = '#' + color; // 随机的背景颜色 var img = new Image();
img.src = binding.value;
img.onload = function() {
el.style.backgroundImage = 'url(' + binding.value + ')';
}
}
});
new Vue({
el: '#demo',
data: {
list: [
{
url: 'http://img.alicdn.com/imgextra/i3/730692984/TB2.dQMdxXkpuFjy0FiXXbUfFXa_!!730692984-0-beehive-scenes.jpg_180x180q70'
},
{
url: 'http://img.alicdn.com/imgextra/i2/730692984/TB239AJdw0kpuFjSspdXXX4YXXa_!!730692984-0-beehive-scenes.jpg_180x180q70'
},
{
url: 'http://img.alicdn.com/imgextra/i4/730692984/TB29TsZdrVkpuFjSspcXXbSMVXa_!!730692984-0-beehive-scenes.jpg_180x180q70'
}
]
}
})
</script>
</html>

查看效果

如上演示可以看到,刚开始载入页面的时候,有那么一瞬间先是背景颜色 最后是图片,这里只是简单的演示一下,在实际使用中,我们可以先放一张预加载的图片,当真正图片加载完成的时候,才显示真正的图片,省的在图片未加载完成的时候,背景图片是空白的效果就不是很好了。

VUE2第五天学习---自定义指令的更多相关文章

  1. VUE2 第五天学习--过渡效果

    阅读目录 1.理解VUE---过渡效果 回到顶部 1.理解VUE---过渡效果 1. 过渡的-css-类名会有4个(css) 类名在 enter/leave 在过渡中切换.1. v-enter: 进入 ...

  2. angualar入门学习-- 自定义指令 指令编译执行过程

    3个阶段: 一.加载阶段 加载angular.js的源码,找到ng-app确定应用边界范围. 二.编译阶段 compile 查找所有指令,保存在一个列表中 对所有指令按优先级(property属性值) ...

  3. angualar入门学习-- 自定义指令 认识属性

    个AngularJS指令在HTML代码中可以有四种表现形式: 1.作为一个新的HTML元素来使用 2.作为一个元素的属性来使用 3.作为一个元素的类来使用 4.作为注释来使用 一.创建指令 angul ...

  4. vue2.0自定义指令

    前面一片文章说了vue2.0过滤器,其实自定义指令跟过滤器非常相似,单就定义方式而言,其与过滤器完全一致,分为局部指令,和全局指令.不过就是filter改为directive的区别. 过滤器一般用于对 ...

  5. 带你走近AngularJS - 创建自定义指令

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  6. 带你走近AngularJS 之创建自定义指令

    带你走近AngularJS 之创建自定义指令 为什么使用AngularJS 指令? 使用过 AngularJS 的朋友应该最感兴趣的是它的指令.现今市场上的前端框架也只有AngularJS 拥有自定义 ...

  7. vue3.0自定义指令(drectives)

    在大多数情况下,你都可以操作数据来修改视图,或者反之.但是还是避免不了偶尔要操作原生 DOM,这时候,你就能用到自定义指令. 举个例子,你想让页面的文本框自动聚焦,在没有学习自定义指令的时候,我们可能 ...

  8. AngularJS学习笔记(五)自定义指令(1)

    先来说说自定义指令 ng通过内置指令的方式实现了对html的增强,同时也赋予了我们自定义指令的功能,让我们根据实际需求进行指令的定制.自定义指令涉及到模板(template).作用域(scope).数 ...

  9. Vue2.0 【第二季】第1节 Vue.directive自定义指令

    目录 Vue2.0 [第二季]第1节 Vue.directive自定义指令 一.什么是全局API? 二. Vue.directive自定义指令 三.自定义指令中传递的三个参数 四.自定义指令的生命周期 ...

随机推荐

  1. Matlab adaptive quadrature

    % script to perform adaptive quadrature clear all, close all global pts % function to be integrated ...

  2. nginx重启服务

    修改完nginx配置后,需要使用 nginx -s reload使修改的配置生效,配置生效是平滑的,不会对访问产生任何影响reload后会启动新的进程接受新请求,对于未处理完的请求还是用老的配置,直到 ...

  3. STOMP

    STOMP: 说明:STOMP is a simple text-orientated messaging protocol. 面向文本消息协议 spring 之stomp https://www.c ...

  4. node 跨域问题

    node跨域有很多方法 1.引入 中间件cors 我觉的最好的方法 var express=require('express'); var cors=require('cors'); var app= ...

  5. TCP协议学习总结

    1.TCP协议通过三次握手建连接,四次挥手断连接. 2.TCP的定时器都有哪些? 做什么用途? 3.TCP的慢启动是什么意思? 4.TCP的快速重传是什么意思?

  6. 后台返回xml格式转json

    之前后台做了一个xml格式的数据返回给前端,这个可愁坏了我,不过现在还是解决了,虽然方法有点笨,但没有找到其他的方法,先将就着用吧. 后台返回的是这样的: 那么我们就要这样处理:commonMetho ...

  7. 小程序 青少儿书画 利用engineercms作为服务端

    因为很多妈咪们喜欢发布自己宝宝的作品,享受哪些美好时刻,记录亲子创作过程. 为了方便妈咪们展示亲子创作,比如宝宝们画作,涂鸦,书法,作文,其他才艺,特利用engineercms作为服务端,重新设计了一 ...

  8. winsock编程学习笔记

    以下部分转自博客http://blog.csdn.net/phunxm/article/details/5085869 套接字地址(sockaddr.sockaddr_in) /* * Structu ...

  9. OneAlert 携手 BearyChat(倍洽)快速构建 IT 运维 on-call 机制

    OneAlert 是北京蓝海讯通科技股份有限公司旗下产品,中国第⼀个 SaaS 模式的免费的云告警平台,集成国内外主流监控/⽀撑系统,实现⼀个平台上集中处理所有 IT 事件,提升 IT 可靠性.并且能 ...

  10. python之装饰器函数

    本章内容 引入 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 引入 作为一个会写函数的python开发,我们从今天开始要去公司上班了.写了一 ...