自定义指令
官方指令在不够用的情况下,考虑自定义指令,自定义指令用来操作dom
全局定义
Vue.directive("指令名",{
bind:function(el,binding){
},
inserted:function(el,binding){
},
update:function(el,binding){
}
})
钩子函数
- bind: 当指令首次绑定在dom元素上时使用,此时dom还未渲染
- inserted:当dom元素已经渲染到页面上时调用
- updated:当m层数据发生变化时,v层也会跟着变化
钩子函数的参数
- el:绑定指令的dom元素
- binding:是个对象,包含了指令的所有相关信息,指令名、修饰符、所绑定的属性、赋的值(binding.arg代表绑定的属性 binding.value代表绑定属性的值)
v-bind:属性="变量" 实现动态绑定的原理
<div id="box">
<img v-mybind:src="img" />
</div>Vue.directive("mybind", {
bind(el, binding) {
el[binding.arg] = binding.value
},
updated(el, binding) {
el[binding.arg] = binding.value
}
})
let vm = new Vue({
el: "div",
data: {
img: "12312.jpg"
}
})
简写如下(相当于bind+updated)
Vue.directive("mybind", function(el, binding) {
el[binding.arg] = binding.value
})
let vm = new Vue({
el: "div",
data: {
img: "12312.jpg"
}
})
点击回到顶部案例
<div id="box">
<div v-top style="position:fixed;bottom:10px;right:10px;width: 100px;height: 100px;background-color:red;">
回到顶部
</div>
</div>Vue.directive("top", {
inserted(el) {
el.onclick = function() {
document.body.scrollTop = document.documentElement.scrollTop = 0
}
}
});let vm = new Vue({
el: "#box",
data: {}
});
局部定义(只能在该vue对象中使用)
<div id="box">
<img v-mybind:src="img" />
</div>let vm = new Vue({
el: "#box",
data: {
img: "imgsda.jpg"
},
directives: {
"mybind": function(el, binding) {
el[binding.arg] = binding.value;
}
}
})
过滤器
对数据在模板中的表现进行过滤,用于格式的转换,如0/1转换为失败/成功
全局定义
Vue.filter("过滤器名",function(变量,参数,....){
return 转换的结果
})
使用(在模板上使用)
{{变量 | 过滤器名(参数,....)}}
全局定义案例
<div id="box">
<p>是否成年:{{isAdult | convert(2)}}</p>
</div>Vue.filter("convert", function(value, a) {
return value ? "已成年" : "未成年"
});
let vm = new Vue({
el: "div",
data: {
isAdult: true
}
})
局部定义案例
<div id="box">
<p>是否成年:{{a| convert}}</p>
</div>let vm = new Vue({
el: "#box",
data: {
a: false
},
filters: {
convert(val) {
return val ? "成年" : "未成年"
}
}
})
理解:将a变量的值传递给过滤器,过滤器用第一个形参val接收此值,并经过过滤转换,返回结果
混入
意义在于提高复用性,将一些相同的逻辑函数进行封装,如数组去重,排序等,混入对象就是一个json对象,属性就是vue对象的配置项,但没有el
定义格式
let mixin1={
data:{},
methods:{}
}
let mixin2={
data:{},
methods:{}
}
局部混入
let vm=new Vue({
el:"",
mixins:[mixin1,mixin2],
data:{}
})
全局混入(不推荐使用)
Vue.mixin(mixin1)
案例
<div id="box">
<p>msg:{{msg}}</p>
<input type="button" value="测试" @click="fn02">
</div>let m1 = {
data: {
msg: "hello"
},
methods: {
m1fn() {
console.log("m1fn");
}
}
}
let vm = new Vue({
el: "#box",
mixins: [m1],
data: {},
methods: {
fn02() {
this.m1fn();
console.log(this.msg);
}
}
});
面试问题:自定义指令、过滤器、混入的使用场景
- 自定义指令:主要用来完成dom操作,并用在模板上
- 过滤器:主要完成数据格式的转换,不做逻辑运算,如日期的转换,true和false转换成对应的结果
- 混入:主要完成功能,将一些相同的逻辑函数进行封装,提高代码复用性,如排序,数组去重