Vue自定义指令

浅浅的花香味﹌ 2023-09-26 23:00 242阅读 0赞

自定义指令

vue里面不仅仅有内置的指令,也可以根据自己的需求构建自定义指令

它其实就是操作DOM元素的属性以及内容

通过directives属性配置自定义指令,有函数式和对象式两种写法,下面分别去写下

1 函数式

通过案例去实现自定义函数式指令

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

41d5733c2b8dcba1cc774bcdebfcd2d6.png

控制台报错,说解析指令失败

e09f4c068e022b61839e47f1865d36c9.png

接下来就要定义指令了,需要一个全新的配置项:directives,它的值也是一个对象,和computed,watch是类似的写法

函数式写法如下,有两个参数 参数1是绑定元素,参数2是绑定对象

317375a59fd48851a646c106ecc5de42.png

元素和绑定对象内容如下

3457e12fb8c4442dc5eca348313697ce.png

接下来就可以使用dom操作改变元素了

ddc66c40b68e3ab062b737f91cb38193.png

查看页面,功能实现

468c6709d30db1a37fc3b0c72b8ca2ea.png

那么这个函数什么时候会被调用呢?

有两个时机会被调用:1:指令与元素成功绑定时(初始化),会被调用 2:指令所在的模板被重新解析的时候

代码如下

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>初始vue</title>
  6. <!-- 引入vue.js -->
  7. <script type="text/javascript" src="../js/vue.js"></script>
  8. </head>
  9. <body>
  10. <div id="root">
  11. <h2>当前n的值是:<span v-text="n"></span></h2>
  12. <h2>放大10倍后的n值是:<span v-big="n"></span></h2>
  13. <button @click="n++">点我n+1</button>
  14. </div>
  15. </body>
  16. <script type="text/javascript">
  17. const vm= new Vue({
  18. el:'#root',
  19. data:{
  20. n:1,
  21. },
  22. // 自定义指令
  23. directives:{
  24. // 函数式 有两个参数 参数1是绑定元素,参数2是绑定对象
  25. // 有两个时机会被调用:1:指令与元素成功绑定时(初始化),会被调用 2:指令所在的模板被重新解析的时候
  26. big(element,binging){
  27. element.innerText=binging.value*10
  28. }
  29. }
  30. })
  31. </script>
  32. </html>

2 对象式

对象式写起来比函数式复杂,但是功能比函数式更强大

它有三个不同的函数,在不同的时刻去被调用

bind:指令与元素成功绑定时(一上来)调用

inserted:指令所在元素被插入页面的时候调用

update:指令所在的模板被重新解析时调用

通过案例去实现自定义对象式指令

需求:定义一个v-fbind指令,和v-bind功能类似,但是可以让其绑定的input默认获取焦点

fd51d8048dd3457082f3aad1454a07c5.png

一上来肯定找不到指令,因为既不是内置的,也没有自定义

9230cd7419174e8a123ece1c3d8bd5ad.png

使用对象式编写代码

b70f1718ca0240be143974018e09fd1f.png

一上就来获取焦点

68688d8bff9fa79e07ec00646a1f4f0d.png

并且会随着n的值变化而变化

1161cb88892a316e9c5a310d907f9845.png

代码如下

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>初始vue</title>
  6. <!-- 引入vue.js -->
  7. <script type="text/javascript" src="../js/vue.js"></script>
  8. </head>
  9. <body>
  10. <div id="root">
  11. <h2>当前n的值是:<span v-text="n"></span></h2>
  12. <h2>放大10倍后的n值是:<span v-big="n"></span></h2>
  13. <button @click="n++">点我n+1</button>
  14. <hr/>
  15. <input type="text" v-fbind:value="n" >
  16. </div>
  17. </body>
  18. <script type="text/javascript">
  19. const vm= new Vue({
  20. el:'#root',
  21. data:{
  22. n:1,
  23. },
  24. // 自定义指令
  25. directives:{
  26. // 函数式 有两个参数 参数1是绑定元素,参数2是绑定对象
  27. // 有两个时机会被调用:1:指令与元素成功绑定时(初始化),会被调用 2:指令所在的模板被重新解析的时候
  28. big(element,binging){
  29. element.innerText=binging.value*10
  30. },
  31. // 对象式
  32. fbind:{
  33. // 指令与元素成功绑定时(一上来)
  34. bind(element,binging){
  35. element.value=binging.value
  36. },
  37. // 指令所在元素被插入页面的时候调用
  38. inserted(element,binging){
  39. // 获取焦点
  40. element.focus()
  41. },
  42. // 指令所在的模板被重新解析时
  43. update(element,binging){
  44. element.value=binging.value
  45. },
  46. }
  47. }
  48. })
  49. </script>
  50. </html>

3 自定义指令容易踩的坑

1 多个单词的指令名

现在我的两个自定义指令都是一个单词的,v-big,v-fbind,如果需要用到多个单词,比如v-binNum,这时候使用驼峰就不好使了

a07fef98e9854f132c85ec608a4b5964.png

可以看到,找不到这个指令

36e775c2ba1b3985edcc077ba252d4b8.png

这不是官网推荐的风格,多个单词应该-继续分割,比如v-big-num,此时在函数编写的地方需要使用原生的形式,使用单引号把key包起来,不能再用简写形式了,不然出现-(杠)会报错

22bf0282e3220e005488515fe2422dd8.png

解决

5d2fa56a99cfea4f196b48b8fea6b0ed.png

2 指令回调函数的this

所有被vue管理的函数,里面的this都是vm实例对象

现在把回调函数里面的this都输出下

b81780cbbca6c20f6337f1aaf36cae47.png

发现this都是全局的window,而不是vue实例

49291e6bdadd17bab4bd7718df875f7d.png

虽然没写剪头函数,但是只要是指令directives里面的this,都不是vue实例,就是window

4 自定义指令总结

  • 1 定义语法
  • (1)局部指令
  • new Vue({direvtives:{指令名:配置对象}})或 new Vue({direvtives()})
  • (2)全局指令
  • Vue.directive(指令名,配置对象)或Vue.directive(指令名,回调函数)

  • 2 配置对象中常用的三个回调

  • (1) bind:指令与元素成功绑定时(一上来)调用
  • (2) inserted:指令所在元素被插入页面的时候调用
  • (3) update:指令所在的模板被重新解析时调用

  • 3 备注:

  • (1):指令定义时不加v-,但是使用时需要加v-
  • (2) :指令名如果是多个单词,要使用kebab-case命令方式,不要使用camelCase命名

发表评论

表情:
评论列表 (有 0 条评论,242人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue定义指令

    自定义指令 vue里面不仅仅有内置的指令,也可以根据自己的需求构建自定义指令 它其实就是操作DOM元素的属性以及内容 通过directives属性配置自定义指令,有函

    相关 vue 定义指令

    除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你

    相关 Vue定义指令

     `v-on 、v-model、v-show` 等指令,在操作 dom 时使用了 ref 属性,其实指令也是操作dom 的一种方式,但有时,这些指令并不能满足我们的需求,因此

    相关 vue定义指令

    除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。有的情况下,对普通 DOM 元素进行底层操作,这时候就会用到自定义指令 下面