Vue3自定义指令

2023-09-12 10:04:12

Vue3自定义指令

1. 自定义全局指令v-focus

除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。

  • 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Vue 测试实例  自定义v-focus 在页面加载时,元素获得焦点</title>
        <script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
    </head>
    <body>
    <!--创建一个id为app class为demo的div-->
    <div id="app" class="demo">
        <p>页面加载时,input自动获取焦点</p>
    <!--    使用自定义的v-focus聚焦指令-->
        <input v-focus>
    </div>
    
    <script>
        //    创建HelloVueApp应用
        const HelloVueApp = Vue.createApp({
    
        })
    
        // 注册全局指令v-focus 在页面加载时 元素获得焦点
        HelloVueApp.directive('focus',
        //     当元素被绑定挂载到DOM中时...
            {
                mounted (el) {
                    // 聚焦元素
                    el.focus()
                }
            }
        )
    
    
        // mount('#app') 将 Vue 应用 HelloVueApp 挂载到 <div id="app" class="demo">中
        HelloVueApp.mount("#app")
    </script>
    </body>
    </html>
    

    页面效果:页面载入时,input 元素自动获取焦点
    在这里插入图片描述

    在这里插入图片描述

2. 自定义局部指令v-focus

  • 可以使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Vue 测试实例  自定义局部指令v-focus 使指令只能在这个实例中使用</title>
        <script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
    </head>
    <body>
    <!--创建一个id为app class为demo的div-->
    <div id="app" class="demo">
        <p>页面加载时,input自动获取焦点</p>
    <!--    使用自定义的v-focus聚焦指令-->
        <input v-focus>
    </div>
    
    <script>
        //    定义HelloVueApp应用
        const HelloVueApp = {
            data () {
                return {
    
                }
            },
            // 注册局部指令v-focus 使指令只能在这个实例中使用
            directives : {
                focus : {
                //     获得焦点
                    mounted(el) {
                        el.focus()
                    }
                }
            }
        }
    
        // 创建HelloVueApp应用,使用mount('#app') 将 Vue 应用 HelloVueApp 挂载到 <div id="app" class="demo">中
        Vue.createApp(HelloVueApp).mount("#app")
    </script>
    </body>
    </html>
    

    页面效果:
    在这里插入图片描述
    在这里插入图片描述

3. 指令定义的钩子函数

3.1 概念

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

  • created : 在绑定元素的属性或事件监听器被应用之前调用。

  • beforeMount : 指令第一次绑定到元素并且在挂载父组件之前调用。。

  • mounted : 在绑定元素的父组件被挂载后调用。。

  • beforeUpdate: 在更新包含组件的 VNode 之前调用。。

  • updated: 在包含组件的 VNode 及其子组件的 VNode 更新后调用。

  • beforeUnmount: 当指令与在绑定元素父组件卸载之前时,只调用一次

  • unmounted: 当指令与元素解除绑定且父组件已卸载时,只调用一次

    import { createApp } from 'vue'
    const app = createApp({})
     
    // 注册
    app.directive('my-directive', {
      // 指令是具有一组生命周期的钩子:
      // 在绑定元素的 attribute 或事件监听器被应用之前调用
      created() {},
      // 在绑定元素的父组件挂载之前调用
      beforeMount() {},
      // 绑定元素的父组件被挂载时调用
      mounted() {},
      // 在包含组件的 VNode 更新之前调用
      beforeUpdate() {},
      // 在包含组件的 VNode 及其子组件的 VNode 更新之后调用
      updated() {},
      // 在绑定元素的父组件卸载之前调用
      beforeUnmount() {},
      // 卸载绑定元素的父组件时调用
      unmounted() {}
    })
     
    // 注册 (功能指令)
    app.directive('my-directive', () => {
      // 这将被作为 `mounted` 和 `updated` 调用
    })
     
    // getter, 如果已注册,则返回指令定义
    const myDirective = app.directive('my-directive')
    

3.2 钩子函数参数

钩子函数的参数有:

  • el:el 指令绑定到的元素。这可用于直接操作 DOM

  • binding:binding 是一个对象,包含以下属性:

    • instance:使用指令的组件实例。

    • value:传递给指令的值。例如,在 v-my-directive=“1 + 1” 中,该值为 2。

    • oldValue:先前的值,仅在 beforeUpdate 和 updated 中可用。值是否已更改都可用。

    • arg:参数传递给指令 (如果有)。例如在 v-my-directive:foo 中,arg 为 “foo”。

    • modifiers:包含修饰符 (如果有) 的对象。例如在 v-my-directive.foo.bar 中,修饰符对象为 {foo: true,bar: true}

    • dir:一个对象,在注册指令时作为参数传递。例如,在以下指令中:

      app.directive('focus', {
        mounted(el) {
          el.focus()
        }
      })
      

      dir 将会是以下对象:

      {
        mounted(el) {
          el.focus()
        }
      }
      

3.3 vnode & prevNode

  • vnode:作为 el 参数收到的真实 DOM 元素的蓝图

  • prevNode上一个虚拟节点,仅在 beforeUpdateupdated 钩子中可用。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Vue 测试实例  vnode:作为 el 参数收到的真实 DOM 元素的蓝图</title>
        <script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
    </head>
    <body>
    <!--创建一个id为app class为demo的div-->
    <div id="app" class="demo">
    <!--    使用自定义的runoob组件-->
        <div v-runoob="{name: '比亚迪', url: 'https://www.bydglobal.com/cn/index.html'}"></div>
    </div>
    
    <script>
        //    创建HelloVueApp应用
        const HelloVueApp = Vue.createApp({
    
        })
    
        // 指令定义的钩子函数参数: el绑定到的元素,可用于直接操作 DOM
        // binding 是一个对象,vnode:作为 el 参数收到的真实 DOM 元素的蓝图。
        HelloVueApp.directive('runoob', (el, binding, vnode)=>{
            console.log(binding.value.name)
            console.log(binding.value.url)
            var s = JSON.stringify
            el.innerHTML = s(binding.value)
        })
    
    
        // mount('#app') 将 Vue 应用 HelloVueApp 挂载到 <div id="app" class="demo">中
        HelloVueApp.mount("#app")
    </script>
    </body>
    </html>
    

    页面效果:
    在这里插入图片描述
    在这里插入图片描述

3.4 简写

有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:

Vue.directive('runoob', function (el, binding) {
  // 设置指令的背景颜色
  el.style.backgroundColor = binding.value.color
})

3.5 指令函数接受JavaScript表达式

  • 指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Vue 测试实例 指令函数可接受所有合法的 JavaScript 表达式 传入了 JavaScript 对象</title>
        <script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
    </head>
    <body>
    <!--创建一个id为app class为demo的div-->
    <div id="app" class="demo">
    <!--    使用自定义的runoob组件  传入了 JavaScript 对象-->
        <div v-runoob="{color: 'green', text: '比亚迪'}"></div>
    </div>
    
    <script>
        //    创建HelloVueApp应用
        const HelloVueApp = Vue.createApp({
    
        })
    
        // 指令定义的钩子函数参数: el绑定到的元素,可用于直接操作 DOM
        // binding 是一个对象,vnode:作为 el 参数收到的真实 DOM 元素的蓝图。
        HelloVueApp.directive('runoob', (el, binding, vnode)=>{
            // el:绑定到的元素 直接直接操作DOM
            // binding:接收的对象
            el.innerHTML = binding.value.text
            el.style.backgroundColor = binding.value.color
    
        })
    
    
        // mount('#app') 将 Vue 应用 HelloVueApp 挂载到 <div id="app" class="demo">中
        HelloVueApp.mount("#app")
    </script>
    </body>
    </html>
    

    页面效果:在这里插入图片描述
    在这里插入图片描述

更多推荐

网络安全(黑客技术)学习笔记

1.网络安全是什么网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。2.网络安全市场一、是市场需求量高;二、则是发展相对成熟入门比较容易。3.所需要的技术水平需要掌握的知识点偏多(举例):外围打点能力渗透漏洞挖掘流量分析代

LLM系列 | 20 : Llama2 实战(下篇)-中文语料微调(附完整代码)

简介紧接前文:万字长文细说ChatGPT的前世今生Llama2实战(上篇):本地部署(附代码)上篇主要介绍Llama2的基本情况和基于官方模型实测Llama2在中英上的效果,包括单轮和多轮对话。今天这篇小作文作为Llama2的下篇,主要介绍如何用中文语料对Llama2的基座模型(7B版)进行微调并实测微调后模型的效果。

八大排序(一)冒泡排序,选择排序,插入排序,希尔排序

一、冒泡排序冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。代

面试题五:computed的使用

题记大部分的工作中使用computed的频次很低的,所以今天拿出来一文对于computed进行详细的介绍,因为Vue的灵魂之一就是computed。模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护,所以,对于复杂逻辑,vue提倡使用计算属性。需要特别说明:计算属性

python基础语法回顾

1/1pythoneval函数1/1eval()函数是Python中的一个内置函数,它用于执行一个字符串形式的Python表达式,并返回表达式的结果。这个函数接受一个字符串参数,然后将其解析并执行,将结果返回。通常情况下,eval()用于动态地执行Python代码。以下是eval()函数的基本语法:pythonresu

共享股东:让你的连锁店铺更有竞争力

你是否有过这样的困扰:你经营了一家或多家连锁店铺,但是客流量不稳定,收入不理想,资金周转困难,竞争对手层出不穷,你怎么才能让你的店铺更有吸引力,更有利润,更有发展前景呢?如果你有这样的困扰,那么你可能需要了解一下共享股东这个新兴的商业模式。共享股东是一种利用互联网平台,将线下实体店铺的资源和利润与消费者和投资者进行共享

Mysql

视频链接黑马Mysql基础篇通用语法及分类DDL:数据定义语言,用来定义数据库对象(数据库、表、字段)DML:数据操作语言,用来对数据库表中的数据进行增删改DQL:数据查询语言,用来查询数据库中表的记录DCL:数据控制语言,用来创建数据库用户、控制数据库的控制权限DDL(数据定义语言)数据定义语言数据库操作查询所有数据

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

MySQL数据库详解 二:数据库的高级语言和操作

文章目录1.克隆表----将数据表的数据记录生成到新的表中1.1方式一:先创建新表,再导入数据1.2方式二:创建的时候同时导入2.清空表----删除表内的所有数据2.1delete删除2.2truncate删除(重新记录)2.3创建临时表(退出数据库自动删除)3.创建外键约束----保证数据的完整性和一致性3.1MyS

UI自动化测试实践

一、设计背景随着IT行业的发展,产品愈渐复杂,web端业务及流程更加繁琐,目前UI测试仅是针对单一页面,操作量大。为了满足多页面功能及流程的需求及节省工时,设计了这款UI自动化测试程序。旨在提供接口,集成到蜗牛自动化测试框架,方便用例的设计。整个程序是基于selenium设计的。程序对selenium提供的接口进行了二

基于Java+微信小程序实现《医院管理系统小程序》

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

热文推荐