Vue--》自定义指令的使用讲解

news2024/9/23 19:16:36

目录

自定义指令

自定义指令的分类

私有自定义指令:

全局自定义指令:

总结


自定义指令

vue官方提供了v-text、v-for、v-model、v-if等常用的指令,还允许开发者自定义指令。

自定义指令的分类

私有自定义指令

在每个vue组件中,可以在directives节点下声明私有自定义指令。代码如下:

注意:directives节点下定义的指令名称必须是要渲染标签样式的 v-指令的v-后面的名称。

bind函数

指令与元素成功绑定时执行bind函数。

<template>
  <div class="app-container">
    <h2  v-color>App根组件</h2><hr>
    <div class="box">
      <!-- 渲染Left组件和Right组件 -->
      <Left></Left>
    </div>
  </div>
</template>
<script>
import Left from '@/components/Left.vue'
export default {
  // 私有自定义指令节点
  directives:{
    // 定义名为color的指令,指向一个配置对象
    color:{
      // 当指令第一次被绑定到元素上的时候,会立即触发 bind 函数。
      bind(el){ //el 表示当前指令所绑定到的那个 DOM 对象。
        console.log('触发了bind函数');
        el.style.color = 'red'
      }
    }
  },
  components:{
    Left,
  }
}
</script>
<style lang="less" scoped>
  .app-container{
    padding: 1px 20px 20px;
    background-color: #ddd;
    .box{
      display: flex;
    }
  }
</style>

当然我们也可以为自定义指令赋予静态值和动态值。如下:

<template>
  <div class="app-container">
    <!-- 自定义指令的静态值 -->
    <h2  v-color="'red'">App根组件</h2><hr>
    <!-- 自定义指令动态值 -->
    <p v-color="color">这是一个p标签</p>
    <div class="box">
      <!-- 渲染Left组件和Right组件 -->
      <Left></Left>
    </div>
  </div>
</template>
<script>
import Left from '@/components/Left.vue'
export default {
  data(){
    return {
      color:'blue'
    }
  },
  // 私有自定义指令节点
  directives:{
    // 定义名为color的指令,指向一个配置对象
    color:{
      // 当指令第一次被绑定到元素上的时候,会立即触发 bind 函数。
      //el 表示当前指令所绑定到的那个 DOM 对象。binding表示给指令赋值时获取值的数据的对象
      bind(el,binding){ 
        console.log('触发了bind函数');
        el.style.color = binding.value
        console.log(binding);
      }
    }
  },
  components:{
    Left,
  }
}
</script>
<style lang="less" scoped>
  .app-container{
    padding: 1px 20px 20px;
    background-color: #ddd;
    .box{
      display: flex;
    }
  }
</style>

inserted函数

指令所在元素被插入页面时调用。

<template>
  <div class="app-container">
    <!-- 自定义指令的静态值 -->
    <h2>App根组件</h2><hr>
    <input type="text" v-fbind="num">
  </div>
</template>
<script>
export default {
  // 私有自定义指令节点
  directives:{
    fbind:{
      bind(el,binding){
        el.value = binding.value
      },
      inserted(el){
        // 在第一次执行时就自动获取输入框的焦点
        el.focus()
      },
    }
  },
}
</script>

update函数

bind函数只调用1次,也就是说:当指令第一次绑定到元素时调用,当DOM更新时bind函数不会被触发。updated函数会在每次DOM更新时被调用。代码如下:

<template>
  <div class="app-container">
    <!-- 自定义指令的静态值 -->
    <h2  v-color="color">App根组件</h2><hr>
    <button @click="color='green'">改变App根组件的颜色</button>
    <div class="box">
      <!-- 渲染Left组件和Right组件 -->
      <Left></Left>
    </div>
  </div>
</template>
<script>
import Left from '@/components/Left.vue'
export default {
  data(){
    return {
      color:'blue'
    }
  },
  // 私有自定义指令节点
  directives:{
    // 定义名为color的指令,指向一个配置对象
    color:{
      // 当指令第一次被绑定到元素上的时候,会立即触发 bind 函数。
      bind(el,binding){ //el 表示当前指令所绑定到的那个 DOM 对象。
        console.log('触发了bind函数');
        el.style.color = binding.value
        console.log(binding);
      },
      // 在 DOM 更新的时候,会触发 update 函数。
      update(el,binding){
        console.log('触发了update函数');
        el.style.color = binding.value
        console.log(binding);
      },
    }
  },
  components:{
    Left,
  }
}
</script>
<style lang="less" scoped>
  .app-container{
    padding: 1px 20px 20px;
    background-color: #ddd;
    .box{
      display: flex;
    }
  }
</style>

注意:bind函数和update函数两者的区别是bind函数是第一次被执行往后都不执行了,而update函数是第一次不执行,往后都执行,所以两者是都需要的,不能只写一个。

函数简写

如果 bind 和 update 函数中的逻辑完全相同,则对象格式的自定义指令可以简写为函数格式:

// 私有自定义指令节点
directives:{
  color(el,binding){
      el.style.color = binding.value
  }
},

全局自定义指令

全局共享的自定义指令需要通过 Vue.directive() 进行声明,代码如下:注意:全局声明的自定义指令或者说之前讲解的全局声明的过滤器都要放到 main.js 中去声明。

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

// 全局自定义指令
Vue.directive('color',function(el,binding){
  el.style.color = binding.value
})

// 创建 Vue 的实例对象
new Vue({
  // 把render函数指定的组件,渲染到 HTML 页面中。
  render: h => h(App),
}).$mount('#app')

总结

定义语法:

1)局部指令

new Vue({ directives:{指令名:配置对象} }) 或 new Vue({ directives:{指令名:回调函数} })

2)全局指令

Vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数)

配置对象中常用的3个回调

1、bind指令:指令与元素绑定时使用

2、inserted指令:指令所在元素被插入页面时使用

3、update指令:所在模板结构被重新解析时使用

3)注意

1、指令定义时不加 v- ,但使用时要加 v-

2、指令名如果是多个单词,要使用kebab-case命名方式,例:v-big-house

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计框架的食品安全监督平台的设计与实现Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

u-BOOT启动流程

1、u-boot入口&#xff1a;入口即第一行程序&#xff0c;程序的链接是由链接脚本决定的&#xff0c;编译uboot之后&#xff0c;可以在根目录下生成u-boot.lds文件 打开lds文件可以看到代码当前入口点&#xff1a; &#xff1a;_start&#xff0c;_start后面就是中断向量表&…

[附源码]Python计算机毕业设计Django演唱会门票售卖系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

股票接口怎样获取数据方便?

目前很多交易者对股票数据行情查询相关使用的系统也是很普遍&#xff0c;就比如说你查询A股的大秦铁路可以使用实时股票数据接口来获取它的实时股价&#xff0c;成交量&#xff0c;成交金额等情况。那么在这个过程中&#xff0c;股票接口是如何获取数据更方便呢&#xff1f;小编…

化工厂人员定位系统:聚焦化工安全问题,提升智慧管理水平

化工厂人员定位系统&#xff0c;以人员定位技术为核心&#xff0c;整合访客管理、出入口控制、地图、人脸识别、视频监控数据采集等各种管控技术&#xff0c;提供精准实时定位、轨迹查询、货物跟踪等功能&#xff0c;又称“智能化二道门人员管理系统”。 12月1日&#xff0c;鞍…

[附源码]计算机毕业设计剧本杀交流分享平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Spring进阶(二十一)之循环Bean详解

目录 什么是循环依赖 检测是否存在循环依赖 Spring底层是如何解决循环依赖的问题 循环依赖无法解决的情况 为什么需要用3级缓存 问题 原因 案例 单例bean解决了循环依赖&#xff0c;还存在什么问题 什么是循环依赖 这个很好理解&#xff0c;多个bean之间相互依赖&#…

Python制作进度条,原来有这么多方法

如果你之前没用过进度条&#xff0c;八成是觉得它会增加不必要的复杂性或者很难维护&#xff0c;其实不然。要加一个进度条其实只需要几行代码。 在这几行代码中&#xff0c;我们可以看看如何在命令行脚本以及 PySimpleGUI UI 中添加进度条。 下文将介绍 4 个常用的 Python 进度…

TL431介绍及其应用电路

TL431介绍及其应用电路 硬件攻城狮 1. TL431简介 TL431是常用的三端并联稳压器&#xff0c;具有较好的热稳定性&#xff0c;输出电压可以设置为Vref~36V之间的任何值。被广泛用作基准源、比较器、运放等功能。在隔离电源中&#xff0c;TL431经常与光耦配合构成隔离反馈回路&…

PDF文件怎么合并?看完这篇就懂了!

不知道小伙伴们有没有这样的经历&#xff0c;那就是准备好一些pdf去打印店打印的时候&#xff0c;本来想要打印双面的&#xff0c;但是店家却表示pdf太小&#xff0c;只能一页一页的单页打印。这就给我们的钱包无形之中增加了很多的负担&#xff0c;因为有时候我们没必要打印单…

搜索与图论-有向图的拓扑序列

文章目录一、有向图的拓扑序列1. 拓扑序列2. 拓扑排序3. 如何进行拓扑排序4. 拓扑排序具体实现详见例题有向图的拓扑序列二、有向图的拓扑序列例题——有向图的拓扑序列具体实现1. 样例演示2. 实现思路3. 代码注解4. 实现代码一、有向图的拓扑序列 有向图的拓扑序列就是图的广…

遥感测深方法综述(二)CZMIL 机载LiDAR 测深系统

机载激光雷达测深测量是集激光测距、GNSS定位/姿态测量、航空摄影等多种技术于一体的新型主动机载激光测绘&#xff0c;可应用于海滩和海岸线、浅海编图、海岛、岛礁、水下障碍物的调查&#xff0c;是高效获取高精度近岸海底地形的重要技术&#xff0c;尤其对“人下不去、船上不…

31_ADC基本原理及单次采集实验

目录 ADC简介 STM32F10x ADC特点 ADC执行模式 相关寄存器及数据对齐方式 ADC的采样时间 常用库函数 单次转换一般步骤 实验源码 ADC简介 Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。…

Hylicos --- krprint实现

可变参函数的工作原理 函数调用时先用寄存器R0 ~R3 存放参数&#xff0c;如果不够放还要使用到堆栈&#xff0c;参数列表的形参从右到左依次入栈&#xff0c;弹栈时就是从左到右的顺序。 如果函数参数的个数固定&#xff0c;编译器就可以很清楚地在函数运行时依次从堆栈中弹出…

关于城市旅游的HTML网页设计 HTML+CSS上海博物馆网站 dreamweaver作业静态HTML网页设计 html网页制作期末大作业

&#x1f468;‍&#x1f393;静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计&#x1f469;‍&#x1f393;&#xff0c;一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

JVM--这一篇就够了

1、JVM内存模型 Java内存模型是指Java虚拟机的内存模型&#xff0c;我们来看下Java内存模型的图片: 其中&#xff0c;在JAVA的JVM调优中&#xff0c;我们JAVA程序员需要重点关注的&#xff0c;首先是堆&#xff0c;我们看下堆内存的内存模型: 2、类的加载过程 (1)、加载 …

基于jsp+ssm的高速公路收费管理系统-计算机毕业设计

项目介绍 现阶段&#xff0c;政府都会对高速公路收费进行管理&#xff0c;用户通过进入相关系统对高速公路收费状况进行了解&#xff0c;简化了高速公路收费管理流程&#xff0c;进而提高政府高速收费管理效率&#xff0c;达到更好的管理目的。 本设计利用JSP作为开发语言。后…

Nature Communications:人类大脑的皮层下-皮层的动态状态及其在中风中的损伤

摘要 控制大脑自发活动中的动态模式的机制尚不清楚。在这里&#xff0c;我们提供的证据表明&#xff0c;在超低频率范围内&#xff08;<0.01-0.1Hz&#xff09;的皮层动力学需要完整的皮层-皮层下通信。利用静息态功能磁共振成像&#xff08;fMRI&#xff09;&#xff0c;我…

2021-2022 ICPC, NERC, Northern Eurasia Onsite L. Labyrinth

翻译&#xff1a; 莱斯利和利昂进入了一个迷宫。迷宫由&#x1d45b;大厅和&#x1d45a;大厅之间的单向通道组成。大厅编号从1到&#x1d45b;。 莱斯利和利昂在大厅开始了他们的旅程&#x1d460;。他们立刻争吵起来&#xff0c;决定各自去探索迷宫。然而&#xff0c;他们希…

分享一个你很可能不知道的Java异常实现的缺陷

前言 Java中一个大家熟知的知识点就是异常捕获&#xff0c;try…catch…finally组合&#xff0c;但是很多人不知道这里面有一个关于Java的缺陷&#xff0c;或者说是异常实现的一点不足之处。 我这边就通过一个很简单的实验给大家演示下效果玩玩儿&#xff0c;希望大家能觉得有趣…