• vue自定义指令directive Vue.directive() directives


        全局自定义指令:Vue.directive()
        局部自定义指令:directives
     
        directive(参数一,参数二)
            参数一:指令名称
            参数二:指令的配置项,可以是函数,也可以是对象
                函数:
                    参数一:使用当前指令的元素
                    参数二:指令的详细信息
                        {
                            modifiers:修饰符(只要自定义指令后面跟了修饰符,modifiers对象中就有值,为true),
                            value:指令的值(假设指令这样写:<div v-test="'aaa'"></div>,那么value就是aaa)
                        }
                        
        指令的作用:操作DOM元素
     
        步骤:
            ①src下新建utils/utils.js:
    import Vue from "vue";
    
    /**
     *  v-test指令:
     *      <div v-test="'发发发'"></div>
     *      相当于
     *      <div>发发发</div>
     * 
     */
    Vue.directive("test",(el,{value})=>{
        el.innerText=value;
    });
    
    /**
     *  设置背景颜色的指令 
     * 
     */
    Vue.directive("backgroundColor",(el,{value,...rest})=>{
        el.style.backgroundColor=value;
    });
    
    /**
     *  阻止浏览器默认事件:v-event.prev
     * 
     */
    Vue.directive("event",(el,{modifiers})=>{
        let {prev}=modifiers;
        el.addEventListener("contextmenu",(e)=>{
            if(prev){
                e.preventDefault();
            }
        });
    });
    
    /**
     *  自动聚焦
     * 
     */
    Vue.directive("focus",{
        // 获取光标在inserted中操作,此时元素已经插入到父节点了
        inserted(el){
            el.focus();
        }
    });
    
    /**
     *  第一个参数是指令名称,第二个参数如果是一个函数,这个函数是指令要做的事情,如果是一个对象,这个对象是指令的配置项。
     * 
     * 
     */
    Vue.directive("wql",{
        bind(){ 
            // 当前元素使用当前指令的时候会被调用,只会调用一次,用来做初始化
            console.log("bind")
        },
        inserted(){
            // 当使用指令的元素被插入到父节点(#app)的时候会被触发
            console.log("inserted")
        },
        update(){
            // 只要当前元素不被移除,其他操作几乎都会触发这2个生命周期,先触发update后触发componentUpdate
            // 虚拟DOM只要涉及到元素的隐藏、显示(display)值的改变、内容的改变等都会触发虚拟DOM更新
            console.log("update")
        },
        componentUpdated(){
            console.log("componentUpdate")
        },
        unbind(){
            // 当只用指令的元素被卸载的时候会执行,简单的说就是当前元素被移除的时候
            console.log("unbind")
        }
    });
    
    
    /**
     *  v-drag
     * 
     */
    Vue.directive("drag",(el,{modifiers,value})=>{
        if(value){
            var disX,disY;
            var {l,t} = modifiers;
            el.style.position = "absolute";
            el.addEventListener("mousedown",mousedown)
            function mousedown(e){
                disX = e.offsetX;
                disY = e.offsetY;
                document.addEventListener("mousemove",move)
                document.addEventListener("mouseup",up)
            }
            function move(e){
                var x = e.clientX - disX;
                var y = e.clientY - disY;
                if((l&&t) || (!l&&!t)){
                     el.style.left = x + 'px';
                     el.style.top = y + 'px';
                     return;
                }
                if(l){
                    el.style.left = x + 'px';
                     return;
                }
                if(t){
                    el.style.top = y + 'px';
                     return;
                }
            }
            function up(){
                document.removeEventListener("mousemove",move)
                document.removeEventListener("mouseup",up)
            }
        }
    });
            ②main.js中引入:
                import "./utils/utils.js";
     
            ③App.vue中使用自定义指令:
                <div v-test="'发发发'" v-backgroundColor.not="'blue'"></div>
                <div v-test="'阻止浏览器默认事件'" v-backgroundColor="'yellow'" v-event.prev></div>
                <input type="text" v-focus>
        指令的生命周期:
            bind():当元素只用当前指令的时候会被调用,只会调用一次,用来做初始化
            inserted():当使用指令的元素被插入到父节点(#app)的时候会被触发
            update():只要当前元素不被移除,其他操作几乎都会触发这2个生命周期,先触发update后触发componentUpdate。虚拟DOM什么时候更新:只要涉及到元素的隐藏、显示(display)值的改变、内容的改变等都会触发虚拟DOM更新
            componentUpdate():组件更新
            unbind():当使用指令的元素被卸载的时候会执行,就是当前元素被移除的时候




















































  • 相关阅读:
    MySQL根据表前缀批量修改、删除表
    SpringBoot如何打印带参数的sql和执行时间p6spy
    linux指令查找字符串所在行,输出行号
    金蝶云星空常用数据表
    java基础复习流水账
    Vue脚手架——手把手教你安装和使用
    Vue2脚手架安装 百度
    什么是面向对象编程?用自己的话说出来讲出来
    methods属性 就是里面写方法的属性 computed是里面写计算的属性
    vue零基础 基础教程P5第05节:计算属性与侦听器
  • 原文地址:https://www.cnblogs.com/wuqilang/p/12345244.html
Copyright © 2020-2023  润新知