探索Vue的组件世界-自定义指令

news2024/11/13 20:41:57

目录

自定义指令

钩子函数参数

使用

什么时候用

在Vue体系下创建一个自定义指令

使用自定义指令及示例要求

全局注册一个自定义指令


自定义指令

全局创建vue自定义指令

Vue.directive("demo", {
    // 只调用一次,指令第一次绑定到元素时调用。
    // 在这里可以进行一次性的初始化设置。
    bind: function(el, binding, vnode) {},
    // 被绑定元素插入父节点时调用
    // (仅保证父节点存在,但不一定已被插入文档中)。
    inserted: function(el, binding, vnode) {},
    // 所在组件的VNode 更新时调用,
    // 但是可能发生在其子VNode更新之前。
    // 指令的值可以发生了改变,也可能没有,
    // 但是可以通过比较更新前后的值来忽略不必要的模板更新
    update: function(el, binding, vnode, oldVnode) {},
    // 指令所在组件的VNode及其子VNode全部更新后调用。
    componentUpdate: function(el, binding, vnode, oldVnode) {},
    // 只调用一次,指令与元素解绑时调用。
    unbind: function(el, binding, vnode) {}
});
  • bind中el.parentNode为null
  • inserted中可以通过el.parentNode访问当前节点的父节点
  • 可以比较oldVnode和vnode之间的差异来判断模板是否需要更新,以减少不必要的模板更新,从而一定程度提高组件性能。

钩子函数参数

function(
    // 指令所绑定的元素,可以用来直接操作DOM
    el,
    // binding一个对象,包含以下属性
    {
        // 指令名,不包括v-前缀。
        name,
        // 指令的绑定值,例如:v-my-directive="1 + 1"中,
        // 绑定值为 2。
        value,
        // 指令绑定的前一个值,
        // 仅在update和componentUpdated钩子中可用。
        oldValue,
        // 字符串形式的指令表达式。
        // 例如 v-my-directive="1 + 1"中,表达式为"1 + 1"。
        expression,
        // 传给指令的参数, 可选。
        // 例如 v-my-directive:foo 中,参数为"foo"。
        arg,
        // 一个包含修饰符的对象。
        // 例如:v-my-directive.foo.bar 中,
        // 修饰符对象为{ foo: true, bar: true }。
        modifiers 
    },
    // Vue 编译生成的虚拟节点
    vnode,
    // 上一个虚拟节点,仅在update和componentUpdated 钩子中可用。
    oldVnode
)

除了el之外,其他参数都应该是只读的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的dataset来进行。

使用

什么时候用

当我们的methods中存在操作DOM/BOM的逻辑的时候,就该思考是否可以抽象成一个自定义指令。

在Vue体系下创建一个自定义指令

使用自定义指令及示例要求

<template>
  <!-- 1. v-resize 指令, 监听浏览器窗口大小改变的时候, 通过监听函数 onResize 响应-->
  <!-- <div v-resize="onResize">window width is: {{ length }}</div> -->
  <!-- 2. 可通过 direction,控制监听页面高度 或者 宽度的变化 -->
  <div v-resize:[direction].quiet="onResize">window Height is: {{ length }}</div>
  <!-- 3. 可通过 修饰符 .quiet 来控制是否在 指令初始化的时候 响应onResize函数 -->
  <!-- <div v-resize.quiet="onResize">window width is: {{ length }}</div> -->
  <!-- <div v-resize="onResize">window width is: {{ length }}</div> -->
</template>
<script>
export default {
  data() {
    return {
      direction: "vertical",
      length: 0
    };
  },
  methods: {
    onResize(length) {
      this.length = length;
    }
  }
};
</script>

全局注册一个自定义指令

import Vue from "vue";
import App from "./App.vue";
Vue.config.productionTip = false;
Vue.directive("resize", {
  inserted(el, binding) {
      // 取出回调函数
    const callback = binding.value;
    const direction = binding.arg;// 横纵类型的参数
    const modifiers = binding.modifiers;// true初始化不执行,false初始化执行
    const result = () => { // vertical 高,other 宽
      return direction === "vertical" ? window.innerHeight : window.innerWidth;
    };
    // 要执行的回调函数
    const onResize = () => callback(result());
    // 监听浏览器事件
    window.addEventListener("resize", onResize);
    if (!modifiers || !modifiers.quiet) {
      onResize();
    }
    // 数据共享一下
    el._onResize = onResize;
  },
  unbind(el) {
    if (!el._onResize) return;
    // 存在数据,删除监听,删除共享数据
    window.removeEventListener("resize", el._onResize);
    // 删除
    delete el._onResize;
  }
});
new Vue({
  render: h => h(App)
}).$mount("#app");

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

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

相关文章

MySQL常用SQL

目录 库操作 查询数据库 创建数据库 删除数据库 选择数据库 表操作 查看表 创建表 查看表结构 查看建表sql 删除表 &#xff08;整表删除&#xff09; CRUD操作 insert增加 update修改 delete删除 select查询 去重distinct 空值查询 union合并查询 带in子查询 …

浏览器从输入URL到页面渲染加载的过程(浏览器知识体系整理)

文章目录 前言一、梳理主干流程二、浏览器接收url并开启一个新进程1. 浏览器是多进程的2. 浏览器内核是多线程的3. JS引擎单线程的原因4. GUI渲染线程与JS引擎线程互斥 二、解析URL三、DNS域名解析1. DNS是什么&#xff1f;2. IP和域名的关系3. 域名服务器概念图4. DNS域名解析…

使用 OpenCV 进行基于 ESP32 CAM 的目标检测和识别

概述:基于 ESP32 CAM 的目标检测和识别 本教程介绍了使用OpenCV基于 ESP32 CAM的目标检测和识别主题。OpenCV 是一个开源的图像处理库,不仅在工业界而且在研发领域都得到了非常广泛的应用。 这里对于对象检测,我们使用了cvlib 库。该库使用 COCO 数据集上的预训练 AI 模型…

Flume系列:Flume Sink使用

目录 Apache Hadoop生态-目录汇总-持续更新 1&#xff1a;HDFS Sink HDFS小文件的处理 HDFS存入大量小文件的影响&#xff1a; HDFS小文件处理&#xff1a; 2&#xff1a;logger Sink 3&#xff1a;写入Kafka - 可以使用kafka channel代替 Apache Hadoop生态-目录汇总-持…

力扣sql中等篇练习(十八)

力扣sql中等篇练习(十八) 1 银行账户概要 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT u.user_id,u.user_name,u.creditIFNULL(t1.c1,0) credit,case when u.creditIFNULL…

分享一个无需账号完全免费的 ChatGPT-4 的平台

AIGC从入门到精通教程 1. 访问 SteamShip2. 进入创建页面,选择新建一个 GPT-4 实例。3. 完成创建后,您便可以尽情体验 GPT-4本教程收集于: AIGC从入门到精通教程 大家都知道,ChatGPT4.0是要订阅Plus(一个月20美元)后才能体验的。 今天就给大家弄一个白嫖ChatGPT4.0的教程…

DEJA_VU3D - Cesium功能集 之 107-卫星探测效果

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码,…

c++STL之常用的算法

目录 常用的遍历算法 for_each() transform() for_each()和transform&#xff08;&#xff09;算法比较 常用的查找算法 adjacent_find() binary_search count() count_if() find() 常用的排序算法 merge() sort() random_shuffle() reverse() 常用的拷…

基于`IRIS`,动态解析`HL7`消息

文章目录 基于IRIS&#xff0c;动态解析HL7消息什么是HL7HL7 版本HL7 消息结构段&#xff08;Segment&#xff09;字段&#xff08;Field&#xff09; HL7 数据类型在IRIS中查看HL7数据结构传统方式拼写HL7消息结构动态对象解析HL7消息结构。 基于IRIS&#xff0c;动态解析HL7消…

SpringCloud:微服务保护之隔离和降级

1.FeignClient整合Sentinel SpringCloud中&#xff0c;微服务调用都是通过Feign来实现的&#xff0c;因此做客户端保护必须整合Feign和Sentinel。 1.1.修改配置&#xff0c;开启sentinel功能 修改OrderService的application.yml文件&#xff0c;开启Feign的Sentinel功能&…

详细版易学版TypeScript - 类

一、类 - 类的属性和方法 class MyPreson {// 类的属性// 属性需要在类里先定义并确定类型&#xff0c;才可以在constructor里面用this访问name: stringage: numberconstructor(name: string, age: number) {this.name name;this.age age;}// 类的方法sendStr(str: string) {…

工业4.0时代来临,POWERLINK协议在千兆网卡下的性能

“工业 4.0”的高歌猛进&#xff0c; “智能制造”&#xff0c;“智慧工厂”的呼声越来越响亮。这些需求使得数据传输量越来越大&#xff0c;实时性越来越高&#xff0c;因此我们将 POWERLINK 从 100Mbps 升级到1000Mbps。测试下POWERLINK这种工业总线协议的性能&#xff0c;最…

jest基础指示

describ&#xff08;类似java中的class&#xff0c;在这里定义的变量可以在所有it中使用&#xff09; 针对某一方面的测试&#xff0c;一个描述性的东西&#xff0c;针对某一个方面的测试&#xff0c;或者说是一个作用域 一组测试用例的集合。 有两个参数&#xff0c;参数1 &…

Vue 3.0 学习笔记

Vue 3 学习笔记 文章目录 Vue 3 学习笔记[toc]一、初识vue3二、 常用Composition API&#xff08;组合式API&#xff09;**1. setup函数****2. ref函数****3. reactive函数****4. Vue3.0中的响应式原理****Vue2.x的响应式****Vue3.x的响应式** **5. reactivce对比ref****6. set…

为什么我在大厂待了三个月就选择离开?我聊聊应届生该选择大厂还是小公司

我在互联网大厂只待了3个月就离开了&#xff0c;主要原因不是大厂的福利或者薪资不够好&#xff0c;只是因为我发现在大厂里每天都有开不完的会&#xff0c;忙碌到没有自己的生活。当时我每天10点上班&#xff0c;晚上要工作到11甚至是12点&#xff0c;甚至半夜两三点都接到过工…

LangChain-Agents 入门指南

LangChain-Agents 入门指南 LangChain-Agents 入门指南注册 Serpapi运行高级 Agents API 测试运行 Google Search其它 Here’s the table of contents: LangChain-Agents 入门指南 LangChain是一个使用LLMs构建应用程序的工具箱&#xff0c;包含Models、Prompts、Indexes、Mem…

Vue3-黑马(二)

目录&#xff1a; &#xff08;1&#xff09;vue3-ref与reactive &#xff08;2&#xff09;vue3-基础-属性绑定与事件绑定 &#xff08;3&#xff09;vue3-基础-表单绑定 &#xff08;1&#xff09;vue3-ref与reactive ref函数可以把普通的数据变成响应式的数据&#xff0…

Firewall Testing Checklist 分析

不管是在服务器、云技术、嵌入式、车载等场景&#xff0c;防火墙的作用尤为重要&#xff0c;下面从信息收集、管理审核流程、操作系统安全、已实现规则和检查配置&#xff0c;这五个方面来进行分析firewall的具体作用和能力&#xff0c;然后提供一些实用的网络firewall工具给大…

【Spring框架全系列】SpringBoot配置文件相关操作

&#x1f307;哈喽&#xff0c;大家好&#xff0c;我是小浪。上篇博客我们已经学习了如何创建一个Spring项目&#xff0c;那么创建Spirng项目还可以直接通过在Spring官网的方式来创建&#xff0c;做法也非常的简单&#xff0c;感兴趣的小伙伴可以在C站搜个教程尝试一下&#xf…

22年广东河南省赛-隐藏信息探索

任务十: 1、访问服务器的FTP服务,下载图片QR,从图片中获取flag,并将flag提交; QR.png的内容如下,可以看到,找到二维码的前三块都被反转了,需要反转回来,把这个二维码做成一个正方形,使用截图工具分隔、配合画图工具拼接+旋转。平均分为4块,分出4个方块。即可。 2、…