除了核心功能默认内置的指令外,vue也允许用户注册自定义指令。虽然在vue2.0中,代码复用和抽象的主要形式是组件,但是有些情况下,我们仍需要对普通DOM元素进行底层操作,这个时候就需要用到自定义指令,例如,我们希望将元素的背景色变为红色,就可以通过指令实现。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<style></style>
<script src="vue.js"></script>
</head>
<body>
<div id="box">
<p v-red>aaaaa</p>
<p v-red>12345</p>
<p v-red>自定义</p>
</div>
<script>
Vue.directive('red',function(){
this.el.style.background='red';
});
var vm=new Vue({
el:'#box',
data:{
msg:'welcome'
}
});
</script>
</body>
</html>

上面简单的实例中,主要是展示了自定义组件的用法:

其中"red"为我们自定义的指令,在使用的时候,需要加上"v-"的前缀,后面接的方法是该指令需要实现的功能;"el"是指令所绑定的元素,可以用来直接操作DOM。

自定义指令传参

在上面的自定义指令中,我们实现了将元素背景色变为红色,那么如果我们需要将背景色改为蓝色,只是颜色改变了,其他的都是一样的,若这样再重新定义一个指令,就完全没必要了,因此我们可以考虑传参的方法了。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<style></style>
<script src="vue.js"></script>
</head>
<body>
<div id="box">
<p v-red='r'>aaaaa</p>
<p v-red='g'>12345</p>
<p v-red='p'>自定义</p>
</div>
<script>
Vue.directive('red',function(color){
this.el.style.background=color;
});
var vm=new Vue({
el:'#box',
data:{
r:'red',
g:'gray',
p:'pink'
}
});
</script>
</body>
</html>

但是上面的这种的方式的要求是我们必须现在vue实例中声明这些颜色参数,并不能满足我们想要随意更换颜色的要求,因此,需要继续优化。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<style></style>
<script src="vue.js"></script>
</head>
<body>
<div id="box">
<p v-red="'red'">aaaaa</p>
<p v-red="'gray'">12345</p>
<p v-red="'pink'">自定义</p>
</div>
<script>
Vue.directive('red',function(color){
this.el.style.background=color;
});
var vm=new Vue({
el:'#box',
});
</script>
</body>
</html>

自定义指令获取事件属性

和其他JavaScript事件一样,自定义指令事件也能获取事件属性,例如键盘事件,鼠标事件等,下面通过获取鼠标位置实现自定义拖拽指令。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<style>
</style>
<script src="vue.js"></script> </head>
<body>
<div id="box">
<div v-drag :style="{width:'100px', height:'100px', background:'blue', position:'absolute', right:0, top:0}"></div>
<div v-drag :style="{width:'100px', height:'100px', background:'red', position:'absolute', left:0, top:0}"></div>
</div>
<script>
Vue.directive('drag',function(){
var oDiv=this.el;
oDiv.onmousedown=function(ev){
var disX=ev.clientX-oDiv.offsetLeft;
var disY=ev.clientY-oDiv.offsetTop; document.onmousemove=function(ev){
var l=ev.clientX-disX;
var t=ev.clientY-disY;
oDiv.style.left=l+'px';
oDiv.style.top=t+'px';
};
document.onmouseup=function(){
document.onmousemove=null;
document.onmouseup=null;
};
};
});
var vm=new Vue({
el:'#box',
data:{
msg:'welcome'
}
});
</script>
</body>
</html>

拖拽前:

拖拽后:

自定义元素指令

所谓自定义元素指令,就是指该指令能够像其他的元素如div,span等一样直接使用,既然是元素指令,自然就和其他的自定义指令不一样了,下面通过一个简单的例子来展示自定义元素指令的用法,依旧是改变元素的背景色,具体实现如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<style>
</style>
<script src="vue.js"></script> </head>
<body>
<div id="box">
<zns-red>自定义元素指令</zns-red>
</div>
<script>
Vue.elementDirective('zns-red',{
bind:function(){
this.el.style.background='red';
}
}); var vm=new Vue({
el:'#box',
data:{
a:'blue'
}
});
</script>
</body>
</html>

自定义指令和自定义元素指令相比,主要存在三个不同之处:

  • 自定义指令使用elementDirective
  • 自定义指令的功能函数直接写在后面的方法中,自定义元素指令的功能函数必须写在钩子函数中(bind、inserted等)
  • 自定义指令在使用时,需要用v-开头,添加到需要的元素中;自定义元素指令则是直接像其他元素一样使用即可。

vue之自定义组件的更多相关文章

  1. vue中自定义组件(插件)

    vue中自定义组件(插件) 原创 2017年01月04日 22:46:43 标签: 插件 在vue项目中,可以自定义组件像vue-resource一样使用Vue.use()方法来使用,具体实现方法: ...

  2. 【VUE】自定义组件

    [VUE]自定义组件 转载: ============================================ ======================================== ...

  3. vue的自定义组件和组件传值

    <div id="app"> <div>{{pmessage}}</div> //父组件 <child :message="pm ...

  4. vue 相邻自定义组件渲染错误正确的打开方式

    话不多说看问题: 当封装自定义组件时例如(自定义下拉列表)两个相同的组件在多次v-if变化时偶尔会发生渲染错误,明明赋值正确但是组建中的ajax方法可能返回的数据乱掉,或者其他神逻辑错误. 经过查询发 ...

  5. 编程小白入门分享五:Vue的自定义组件

    前言 上篇博客简单介绍了vue,本篇博客要在对vue有一定了解后,才可以比较容易理解自定义组件.想要封装好一个组件,一定要熟练掌握这三个技能,父组件 -> 子组件传值(props).子组件 -& ...

  6. 四、vue基础--自定义组件

    1.语法:Vue.component("组件名字",{data,template}),代码如下: a. data: 必须是一个函数,有一个返回值.和vue里面的使用方法一样 b. ...

  7. vue发布自定义组件到npm

    一.使用 vue create currentdatetime创建项目(可查考https://cli.vuejs.org/zh/guide/creating-a-project.html),创建成功后 ...

  8. Vue之自定义组件的v-model

    最近在学习vue,今天看到自定义事件的表单输入组件,纠结了一会会然后恍然大悟...官方教程写得不是很详细,所以我决定总结一下. v-model语法糖 v-model实现了表单输入的双向绑定,我们一般是 ...

  9. Vue的自定义组件之间的数据传递

    一,父级传向子级 1,在子级的属性中添加props:['myname',......],参数可以传多个,看具体而定: 2,在父级data中定义好需要传递的变量数据,例如name:"rose& ...

随机推荐

  1. python selenium自动化点击页面链接测试

    python selenium自动化点击页面链接测试 需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回 ...

  2. linux----CenterOS7中在线安装jdk

    summary: 一直以来,都在windows上玩java,今天是一个具有里程碑的一天,感觉正式踏入进入了linux大门. 原来一直以为在linux上安装jdk,需要去官网下载适合linux的jdk, ...

  3. linux-----初学命令和理解

    the following Codes has been confirmed by me 1.头部标识[pecool@demo ~]: 其中pecool代表登入用户:demo代表系统名称:~代表当前处 ...

  4. python----函数与函数式编程

    一. 函数与函数式编程 1. 面向对象编程 (类)class 2.面向过程编程 (过程) def 3.函数式编程 (函数) def (1)  函数的特点:          代码重用:         ...

  5. 使用fastjson解析数据后导致顺序改变问题

    在开发过程中遇到一个问题,服务器经过排序返回后的字符串数据使用fastjson解析后,数据顺序发生变化,引起业务异常. 解决办法: 1.解析时增加参数不调整顺序 JSONObject responde ...

  6. 不输入密码执行sudo 命令

    命令行执行的crontab 命令,但是需要包含sudo 才可以执行的命令,怎么办呢?见下: leo@leo-Ubuntu:/etc$ visudovisudo: /etc/sudoers: 权限不够v ...

  7. 【SpringBoot】SpringBoot热部署和配置文件自动注入实战

    ========================3.SpringBoot热部署devtool和配置文件自动注入实战 ============================ 1.SpringBoot2 ...

  8. Java数组逆序排列

    //逆序排列原理 /* A: 数组逆序原理* a: 题目分析* 通过观察发现,本题目要实现原数组元素倒序存放操作.即原数组存储元素为{12,69,852,25,89,588},逆序后为原数组存储元素变 ...

  9. openresty 集成 sentry 异常系统

    sentry 是一个方便的错误异常追踪系统,同时社区也提供了openresty 的lua 包,使用docker-compose 进行测试 备注: sentry 部分的配置来自官方文档 环境准备 doc ...

  10. skipper lua 添加luarocks 包管理

    skipper 支持基于lua 的script 扩展,同时设计比较方便的filter模型,让我们可以方便 进行request.response的扩展,结合lua 社区的包我们可以快速的进行新功能的开发 ...