Vue(Vue2+Vue3)——21.自定义指令

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
云解析DNS,个人版 1个月
简介: Vue(Vue2+Vue3)——21.自定义指令

21 自定义指令


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

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

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


21.1 函数式


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

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

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

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

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

元素和绑定对象内容如下

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

查看页面,功能实现


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

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

代码如下

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>初始vue</title>
    <!-- 引入vue.js -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>当前n的值是:<span v-text="n"></span></h2>
        <h2>放大10倍后的n值是:<span v-big="n"></span></h2>
        <button @click="n++">点我n+1</button>
    </div>
</body> 
<script type="text/javascript">
     const vm=  new Vue({
        el:'#root',
        data:{
            n:1,
        },
         // 自定义指令
        directives:{
           // 函数式  有两个参数 参数1是绑定元素,参数2是绑定对象
             // 有两个时机会被调用:1:指令与元素成功绑定时(初始化),会被调用 2:指令所在的模板被重新解析的时候
            big(element,binging){
                element.innerText=binging.value*10
            }
        }
    })
</script>
</html>


21.2 对象式


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

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

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

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

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

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

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

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

使用对象式编写代码

一上就来获取焦点

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

代码如下

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>初始vue</title>
    <!-- 引入vue.js -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>当前n的值是:<span v-text="n"></span></h2>
        <h2>放大10倍后的n值是:<span v-big="n"></span></h2>
        <button @click="n++">点我n+1</button>
        <hr/>
        <input type="text" v-fbind:value="n" >
    </div>
</body> 
<script type="text/javascript">
     const vm=  new Vue({
        el:'#root',
        data:{
            n:1,
        },
         // 自定义指令
        directives:{
           // 函数式  有两个参数 参数1是绑定元素,参数2是绑定对象
              // 有两个时机会被调用:1:指令与元素成功绑定时(初始化),会被调用 2:指令所在的模板被重新解析的时候
            big(element,binging){
                element.innerText=binging.value*10
            },
            // 对象式
            fbind:{
                // 指令与元素成功绑定时(一上来)
                bind(element,binging){
                    element.value=binging.value
                },
                // 指令所在元素被插入页面的时候调用
                inserted(element,binging){
                    // 获取焦点
                    element.focus()
                },
                // 指令所在的模板被重新解析时
                update(element,binging){
                    element.value=binging.value
                },
            }
        }
    })
</script>
</html>


21.3 自定义指令容易踩的坑


1 多个单词的指令名


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

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

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

解决


2 指令回调函数的this


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

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

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

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



21.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命名
相关文章
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)
这篇文章通过一个实际的Vue项目案例,演示了如何在Vuex中实现多组件间共享数据。文章内容包括在Vuex的state中新增用户数组,创建Person.vue组件用于展示和添加用户信息,以及在Count组件中使用Person组件操作的数据。通过测试效果展示了组件间数据共享和状态更新的流程。
Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)
|
1天前
|
JavaScript 前端开发 开发者
Vue学习之--------深入理解Vuex、原理详解、实战应用(2022/9/1)
这篇文章详细介绍了Vuex的基本概念、使用场景、安装配置、基本用法、实际应用案例以及注意事项,通过一个数字累加器的实战示例,帮助开发者深入理解Vuex的原理和应用。
|
1天前
|
存储 JavaScript API
vue后台管理权限码处理
【8月更文挑战第19天】vue后台管理权限码处理
8 0
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之getters、mapState、mapGetters(2022/9/3)
这篇文章深入探讨了Vuex中的getters概念和用法,以及如何通过mapState、mapGetters、mapActions和mapMutations四个辅助函数简化组件中的Vuex状态访问和操作,通过实际项目案例展示了这些概念的应用和效果。
|
4天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
存储 前端开发 JavaScript
为什么我不再用Vue,改用React?
当我走进现代前端开发行业的时候,我做了一个每位开发人员都要做的决策:选择一个合适的框架。当时正逢 jQuery 被淘汰,前端开发者们不再用它编写难看的、非结构化的老式 JavaScript 程序了。
|
4天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
4天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。
|
1天前
|
JavaScript
Vue学习之--------路由的query、params参数、路由命名(3)(2022/9/5)
这篇文章详细介绍了Vue路由中的query参数、命名路由、params参数以及props配置的使用方式,并通过实际项目案例展示了它们在开发中的应用和测试结果,同时解释了`<router-link>`的`replace`属性如何影响浏览器历史记录。
Vue学习之--------路由的query、params参数、路由命名(3)(2022/9/5)
|
1天前
|
JavaScript
Vue学习之--------VueX(2022/8/31)
这篇文章是关于VueX的基础知识介绍,涵盖了VueX中的state、mutations、getters和actions的定义和使用,以及Action提交mutation而非直接变更状态,以及mutations的同步执行特性。
Vue学习之--------VueX(2022/8/31)