Vue自定义指令、过滤器、混入的介绍和案例

自定义指令

官方指令在不够用的情况下,考虑自定义指令,自定义指令用来操作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转换成对应的结果
  • 混入:主要完成功能,将一些相同的逻辑函数进行封装,提高代码复用性,如排序,数组去重

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值