Vue的自定义指令、nextTick函数

在Vue框架中,它的一大特点就是指令。框架中为我们提供了很多基础指令,但是有些需求官方提供的指令无法办到,即官方允许我们自己定义指令。

写法:v-指令名     

规定:指令都以v-开头,后跟我们自己取的指令名,注意我们取得指令名不能是官方已经声明过的

如何定义指令?

新学习一个属性directives,在里面定义我们指令的功能,写法:

directives:{
    指令名:{ 
        inserted(el,option){
        //处理程序允许我们操作页面
        }    
    }
}

这里的inserted是钩子函数,其第一个参数el为指令所在的那个元素节点,第二个option是传入的实参对象,就是v-指令名="",引号中的变量的值。

这样创建的一个指令是局部指令,在当前new Vue()对象所关联的标签内部使用。

我们也可以定义一个全局的自定义指令,写法:

Vue.directive("指令名", {
  // 当绑定元素插入到 DOM 中。
  inserted(el) {
    // 处理程序
  }
})

指令定义函数提供了几个钩子函数(可选)

【bind】

  只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。

【inserted】

  被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。

【update】

  所在组件的 VNode 更新时调用,但是可能发生在其孩子的 VNode 更新之前。指令的值可能发生了改变也可能没有。但是可以通过比较更新前后的值来忽略不必要的模板更新。

【componentUpdated】

  所在组件的 VNode 及其孩子的 VNode 全部更新时调用。

【unbind】

  只调用一次, 指令与元素解绑时调用。

注意区别:

bind与inserted:bind时父节点为null,inserted时父节点存在;

update与componentUpdated:update是数据更新前,componentUpdated是数据更新后。

钩子函数参数

第一个参数:指令所绑定的元素,可以用来直接操作 DOM。

第二个参数(可选):一个对象,包含指令名称及该指令所绑定的表达式信息。

第三个参数(可选):Vue 编译生成的虚拟节点。

第四个参数(可选):上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

动手敲一敲,写一个修改字体大小的指令

 <div id="box">
        <div v-size="fs">{{msg}}</div>
    </div>
    <script>
        new Vue({
            el: "#box",
            data: {
                msg:"基尼太没",
                fs:"30px"
            },
            directives: {
                size:{
                    inserted(el,option){
                        console.log(option);
                        el.style.fontSize=option.value
                    }
                }
            }
        })
    </script>

效果:

 

补充:nextTick()函数,类似于window.onload()在这个函数内传入的回调函数,是在组件加载完了才会执行。

学习了生命周期函数以后  会有一个问题:我们在写业务时  总是会考虑一个事情: 现在正在写的业务代码能否操作vm.所以我们需要一个工具  就是让我们写的代码 无论在哪里写  都希望它是组件加载完了以后才运行

例如:在beforecreat(){},vm对象还没创建完成时都可以在这个函数通过nextTick()操作vm对象

代码说明:

 <div id="box">
        {{msg}}
    </div>
    <script>
        new Vue({
            el:"#box",
            data:{
                msg:"666"
            },
            beforeCreate() {
                this.$nextTick(()=>{
                    this.msg=777
                })
            },
            

        })
    </script>

 这时页面打印的不是666,而是777 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值