Vue2.0 Vue自定义指令_函数式

接下来自定义的过程中所有对DOM元素的操作都要我们自己来写
v-show(它能显示和隐藏元素) ==> 怎么让元素隐藏呢?还是Vue帮你动了DOM元素的display属性

从某种程度上来说vue的自定义指令就是操作DOM进行了一次封装

需求1:定义一个v-big指令,和v-text功能类似,但是把绑定数值放大10倍

<h2>当前的n值是:<span v-text="n"></span></h2>
<h2>放大10倍后的n值:<span v-big="n"></span></h2>
<button @click="n++">点我,n+1</button>
Vue.config.productionTip = false

const vm = new Vue({
    el: '#root',
    data(){
        return{
            n: 1,
        }
    }
})

directive: 指令
big指令解析失败了不是v-big
有俩种情况:

  • 1.你写代码写错,人家给你报错,人家报的错误是不带v-
  • 2.你去定义这个指令的时候不要再写v-big了,指令的名字就直接是big

定义你的指令

这得用到一个全新的配置项:directives,它的值也是一个对象

Vue.config.productionTip = false

const vm = new Vue({
    el: '#root',
    data(){
        return{
            n: 1,
        }
    },
    directives:{

    },
})

在这个里面你就可以写各种各样的指令了:

directives:{

},

第一种写法:写成一个对象

big: {
    k:v,
    k:v,
    k:v,
}

写起来麻烦,但是优势在于能够处理一些细节上的问题

第二种写法:值写成一个函数

big: function(){

}

优势在于写起来简单;但是弊端就是不能处理细节上的问题

需求1怎么简单怎么来写成函数式
需求2用对象式


directives:{
        big(){
            
        }
    },

写到这里你的代码就不报错了
这个指令和计算属性要根据返回值拿数据的不一样, 不要搞混了
不靠返回值,靠big()函数收到的参数有俩个参数非常常用,先ab

directives:{
    big(a,b){
        console.log('a=',a,',b=',b)
    }
},
a是:a= <span>​</span>​(是真实的DOM元素)
b是:b= {name: 'big', rawName: 'v-big', value: 1, expression: 'n', modifiers: {…}, …}

怎么确认真实DOM

console.dir(a)

在控制台(Console)查看,里面都是真实DOM属性和方法
还有一种方法:

console.log(a instanceof HTMLElement)

instanceof: 判断谁是否是谁的实例

> true

这真真实实的确认了a就是真实DOM
人家文档里用的就是element:元素

从语法层面来讲b是一个对象,对象里面包含什么?

{name: 'big', rawName: 'v-big', value: 1, expression: 'n', modifiers: {…}, …}
    def: {bind: ƒ, update: ƒ}
    expression: "n"
    modifiers: {}
    name: "big"
    rawName: "v-big"
    value: 1
    [[Prototype]]: Object

包含的东西很多,但是现在不是所有都用
我们更关注value;value1,1指的是v-big这个指令所用到的值n,n是1如果把n改成99保存,页面中b对象里的value值变成了99
其他的

expression: 表达式(因为你代码里的v-big表达式写的就是"n")
name: 这是你定义时候的名字
rawName: 这是你使用时的名字

这个b别人一般也是写成binding(绑定)
也就是说v-big(指令)与span(元素)要进行一次绑定这里的绑定不是v-bind(属性里面绑定值用的)这里是指令和元素的一种关联关系

Vue.config.productionTip = false

const vm = new Vue({
    el: '#root',
    data(){
        return{
            n: 1,
        }
    },
    directives:{
        big(element,binding){
            // console.log('a=',a,',b=',b)
            //console.log(a instanceof HTMLElement)
            console.log(element,binding.value)
        }
    },
})

接下来就开始你的原生DOM操作:

element.innerText = binding.value * 10

当我按下按钮时v-text肯定变,就是自己定义的v-big会不会变?
取决于这个big()会不会再被调用了;实时证明了big函数会再次被调用
所以这个big()函数到底什么时候会被被调用呢?
其实是有俩个时机的:

  • 1.指令与元素成功绑定时。(一上来)

    • 1.是你元素写错,不能成功绑定

    • 2.是你写的指令不存在,不能成功绑定

  • 2.指令所在的模板被重新解析时

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结城明日奈是我老婆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值