Vue2x的自定义指令和render函数使用自定义指令

在某些情况下,我们需要对底层DOM进行操作,而内置的指令不能满足需求,就需要自定义指令。一个自定义指令由一个包含类似组件的生命周期的钩子的对象来定义,钩子函数会接收到指令所绑定的元素作为参数。

定义指令

常用两种方式进行自定义指令,一种是全局定义,另一种在当前组件中定义

// 局部定义
export default {
  name:'test',
  data(){
    return {}
 },
  directives: {
    focus: {
	    bind: function(el, bindings, vnode) {/* ... */},
		inserted: function(el, bindings, vnode) { el.focus(); },
		update: function(el, bindings, vnode) { /* ... */ },
		componentUpdated: function(el, bindings, vnode) { /* ... */ },
		unbind: function(el, bindings, vnode) { /* ... */ }
    }
  },
  methos:{}
};
// 全局定义
const app = createApp({});
// 使 v-focus 在所有组件中都可用
app.directive("focus", {
	bind: function(el, bindings, vnode) {/* ... */},
	inserted: function(el, bindings, vnode) { el.focus(); },
	update: function(el, bindings, vnode) { /* ... */ },
	componentUpdated: function(el, bindings, vnode) { /* ... */ },
	unbind: function(el, bindings, vnode) { /* ... */ }
});
// 全局和局部的调用方式相同
<input v-focus>

钩子函数
钩子函数就是拦截模块渲染流程的“挂钩”,在不同的节点拦截或监听事件,以完成自定义指令的操作。五种钩子拦截的事件分别是初始化、插入节点、渲染完成,监听绑定值的变化和销毁节点。

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  • inserted:节点第一次插入到父节点(页面)中会触发,只会触发这一次.
  • update:当前元素渲染完成,绑定的值发生改变的时候触发
  • componentUpdated:当前元素所在的区域全部渲染完成,绑定的额值发生改变时触发。
  • unbind:只调用一次,指令与元素解绑时调用。(比如离开页面或销毁组件等)

钩子参数

钩子参数即绑定到钩子函数上的参数

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

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

    • value:传递给指令的值。例如在 v-my-directive="1 + 1" 中,值是 2。
    • oldValue:修改前的值,仅在 beforeUpdateupdated 中生效。无论是否修改都可以访问。
    • arg:传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 "foo"
    • modifiers:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }
    • instance:使用该指令的组件实例。
  • dir:指令的定义对象。

  • vnode:代表绑定元素的底层 VNode。

  • prevNode:代表之前的渲染中指令所绑定元素的 VNode。仅在 beforeUpdateupdated 钩子中可用。

传递参数

传递钩子参数的方式有如下几种

  1. 实例化一个指令,但没有参数 v-xxx。例如上面提到的 v-focus
  2. 传递值的指令 v-xxx=“value”。value 值是变量,一般会绑定到 bingdingsvalue
  3. 传递字符串的指令 v-xxx=“‘string’”,例如 v-html="'<p>Content</p>'"
  4. 传递参数的指令 v-xxx:arg1=value1,值arg1value1分别绑定到bingdingsargvalue
  5. 传递动态参数的指令 v-xxx:[arg]=value1,变量 arg 可以实现动态指令参数
  6. 使用修饰符(modifier)的指令 v-xxx:arg.m1=“value”m1会被绑定到 bingdingsmodifier上。允许多个修饰符用逗号连接绑定。例如 a.b.c 对应的是{a:true,b:true,c:true}

函数简写

在很多时候,你可能想在 bind 和 update 时触发相同行为,而不关心其它的钩子。比如这样写:

Vue.directive('color-swatch', function (el, binding) {  
	el.style.backgroundColor = binding.value  
})

对象字面量

如果指令需要多个值,可以传入一个 JavaScript 对象字面量。记住,指令函数能够接受所有合法的 JavaScript 表达式。

<div v-demo="{ color: 'white', text: 'hello!' }"></div>

render函数使用自定义指令

在vue当时我们使用指令一般是如下的方式

<template>
  <div>
  <el-button type="primary" v-norepeat.disabled="{time:3000}" @click="doUpdateItem">保存</el-button>
  </div>
</template>

但是我们想在render函数里面写上面的指令,改怎么写呢?
首先想到的就是下面的写法,但是报错了
在这里插入图片描述

1.使用创建虚拟节点的函数

export default {
  render(h) {
    const time = 3000; // 这里是 v-norepeat.disabled 的值

    return h(
      'div',
      [
        h(
          'el-button',
          {
            props: {
              type: 'primary'
            },
            directives: [
              {
		          name: 'norepeat',
		          value: {time }, // value 是指令绑定的值
		          arg: null, // arg 是指令的参数
		          modifiers: {
		            disabled: true // modifiers 是指令的修饰符
		          }
           		}
            ],
            on: {
              click: this.doUpdateItem
            }
          },
          '保存'
        )
      ]
    );
  },
  methods: {
    doUpdateItem() {
      console.log('Button clicked!');
      // 这里放置点击后的操作
    }
  }
};

  1. jsx写法
export default {
  render() {
    const time = 3000; // 这里是 v-norepeat.disabled 的值
    const directives= [
              {
		          name: 'norepeat',
		          value: {time}, // value 是指令绑定的值
		          arg: null, // arg 是指令的参数
		          modifiers: {
		            disabled: true // modifiers 是指令的修饰符
		          }
           		}
            ]
    return (<div><el-button type='primary' {...{directives}} onClick={this.doUpdateItem}>保存</el-button></div>)
  },
  methods: {
    doUpdateItem() {
      console.log('Button clicked!');
      // 这里放置点击后的操作
    }
  }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【天龙怀旧服】攻略day7

关键字&#xff1a; 新星1.49、金针渡劫、10灵 1】新星&#xff08;苍山破煞&#xff09; 周三周六限定副本&#xff0c;19.00-24.00 通常刷1.49w&#xff0c;刷149点元佑碎金 boss选择通常为狂鬼难度&#xff0c;八风不动即放大不选&#xff0c;第二排第一个也不选&#xf…

SAP SD-DN-MM 交货单相关物料凭证的视图的日期问题

眼下有个需求 获取交货单对应的物料凭证的过账日期BLDAT。 同步BW数据过去 新增一个数据库视图 但是实际使用时&#xff0c;有效部分仅本月&#xff0c;再选择条件里面要加上 MATdoc-bldat > sy-datum - sydatum6(2). 于是使用ST05 跟踪了一下&#xff0c;发现在DD28S…

算法通关村第十五关—继续研究超大规模数据场景的问题(黄金)

继续研究超大规模数据场景的问题 一、对20GB文件进行排序 题目要求&#xff1a;假设你有一个20GB的文件&#xff0c;每行一个字符串&#xff0c;请说明如何对这个文件进行排序&#xff1f;  分析&#xff1a;这里给出大小是20GB,其实面试官就在暗示你不要将所有的文件都装入到…

【ROS2】使用C++实现简单的发布订阅方

1 构建自定义数据类型 1、自定义消息类型Student 1.1 创建base_interfaces_demo包 1.2 创建Student.msg文件 string name int32 age float64 height 1.2 在cmakeLists.txt中增加如下语句 #增加自定义消息类型的依赖 find_package(rosidl_default_generators REQUIRED) # 为…

Pytorch基础知识点复习

文章目录 并行计算单卡训练多卡训练单机多卡DP多机多卡DDPDP 与 DDP 的优缺点 PyTorch的主要组成模块Pytorch的主要组成模块包括那些呢&#xff1f;Dataset和DataLoader的作用是什么&#xff0c;我们如何构建自己的Dataset和DataLoader&#xff1f;神经网络的一般构造方法&…

机器学习~从入门到精通(三)梯度下降法

一、梯度下降法 # 梯度下降不是一种算法&#xff0c;是一种最优化方法 # 上节课讲解的梯度下降的案例 是一个简单的一元二次方程 # 最简单的线性回归&#xff1a;只有一个特征的线性回归&#xff0c;有两个theta # 二、在多元线性回归中使用梯度下降求解 三、### R…

泊松流生成模型简介

一、说明 泊松流生成模型 (PFGM) 是一种新型的生成深度学习模型&#xff0c;与扩散模型类似&#xff0c;其灵感来自物理学。在这本简单易懂的指南中了解 PFGM 背后的理论以及如何使用它们生成图像。 生成式人工智能模型在过去几年中取得了长足的进步。受物理启发的扩散…

使用pygame实现简单的烟花效果

import pygame import sys import random import math# 初始化 Pygame pygame.init()# 设置窗口大小 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption("Fireworks Explosion")# 定义颜色 black (0, 0, 0) wh…

BLDC 电机和 PMSM 的结构区别

BLDC 电机和 PMSM 的结构类似&#xff0c;其永磁体均置于转子&#xff0c;并被定义为同步电机。在同步电机中&#xff0c;转子与定子磁场同步&#xff0c;即转子的旋转速度与定子磁场相同。它们的主要区别在于其反电动势&#xff08;反 EMF&#xff09;的形状。电机在旋转时充当…

MySQL进阶篇(五) 锁

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问…

基于JavaWeb的酒店管理系统

基于JavaWeb的酒店管理系统 文章目录 基于JavaWeb的酒店管理系统系统介绍技术选型成果展示源码获取账号地址及其他说明 系统介绍 基于JavaWeb的酒店管理系统是为酒店打造的管理平台&#xff0c;其主要功能有管理员登陆、客房预订、客房入住、房间管理、数据查询(预订单查询、入…

ros2 基础学习 15- URDF:机器人建模方法

URDF&#xff1a;机器人建模方法 ROS是机器人操作系统&#xff0c;当然要给机器人使用啦&#xff0c;不过在使用之前&#xff0c;还得让ROS认识下我们使用的机器人&#xff0c;如何把一个机器人介绍给ROS呢&#xff1f; 为此&#xff0c;ROS专门提供了一种机器人建模方法——…

数据结构.线性表(2)

一、模板 例子&#xff1a; a: b: 二、基本操作的实现 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;销毁和清空 &#xff08;3&#xff09;求长度和判断是否为空 &#xff08;4&#xff09;取值 &#xff08;5&#xff09;查找 &#xff08;6&#xff09;插入 &…

【rust/bevy】从game template开始

目录 说在前面步骤进入3D控制方块问题 说在前面 操作系统&#xff1a;win11rust版本&#xff1a;rustc 1.77.0-nightlybevy版本&#xff1a;0.12 步骤 rust安装 这里 windows下建议使用msvc版本bevy安装 这里clone代码git clone https://github.com/NiklasEi/bevy_game_templa…

Jetpack Flow 、Room 初学者学习记录

学习使用响应式Flow操作数据&#xff0c;记录自己学习的过程。 ContactViewModel 是一个 ViewModel&#xff0c;它依赖于一个Room操作接口 ContactDao &#xff0c;访问对象来获取联系人数据。它使用了 StateFlow 来处理状态的变化和数据的更新。ViewModels 通常用于管理应用的…

emc防护原理

emc原理 emc设计的根本是对于干扰电流的阻塞和疏导。通过阻抗变化来实现对于特定频率的电流的防护。 emc设计 在485等信号线emc实验中&#xff0c;一般使用8us/20us的脉冲波形进行浪涌信号线实验即可。在特殊场景&#xff08;军品&#xff09;会使用到更高等级的浪涌实验&am…

在illustrator中按大小尺寸选择物体 <脚本 018>

在Illustrator中我们可以依据对象的属性 如&#xff1a;填充颜色、描边颜色或描边宽度来选择相同属性的对象&#xff0c;但是Illustrator中没有根据不同大小尺寸来选择对象的功能&#xff0c;下面介绍的就是根据大小尺寸选择对象的脚本。 1、下面是当前画板中的所有对象&#…

Linux远程登陆协议ssh

目录 一、SSH服务 1. ssh基础 2. 原理 3. 服务端配置 3.1 常用配置项 3.2 具体操作 3.2.1 修改默认端口号 3.2.2 禁止root用户登录 3.2.3 白名单列表 3.2.4 黑名单列表 3.2.5 使用秘钥对及免交互验证登录 3.2.6 免交互式登录 一、SSH服务 1. ssh基础 SSH&…

【嘿,“怪”回来了】半年未见,好久不见。新年伊始,共赴新约。

您的阅读概要&#xff1a; 故事的开头总是极尽温柔&#xff0c;故事会一直温柔……半年未见&#xff0c;好久不见新年伊始&#xff0c;共赴新约忙碌的敲代码也不要忘了浪漫呀 故事的开头总是极尽温柔&#xff0c;故事会一直温柔…… ✨【自我介绍】&#xff1a;你好&#xff0c…

【数据库】间隙锁Gap Lock

什么是间隙锁 间隙锁&#xff08;Gap Lock&#xff09;&#xff1a;间隙锁是&#xff08;RR级别下&#xff09;一个在索引记录之间的间隙上的锁&#xff0c;可以是两个索引记录之间&#xff0c;也可能是第一个索引记录之前或最后一个索引之后的空间。间隙锁&#xff08;Gap Lo…