vue3 ts 自定義指令 app.directive

在 Vue 3 中,app.directive 是一個全局 API,用于注冊或獲取全局自定義指令。以下是關于 app.directive 的詳細說明和使用方法

app.directive 用于定義全局指令,這些指令可以用于直接操作 DOM 元素。自定義指令在 Vue 3 中非常強大,可以用來封裝復雜的 DOM 操作、復用常見的交互行為

1.定義全局指令
app.directive('highlight', {created(el, binding, vnode) {// 在元素的屬性或事件監聽器應用前調用},beforeMount(el, binding, vnode) {// 在元素插入到 DOM 前調用el.style.backgroundColor = binding.value || 'yellow';},mounted(el, binding, vnode) {// 在元素插入到 DOM 后調用},beforeUpdate(el, binding, vnode, prevVnode) {// 在元素更新前調用},updated(el, binding, vnode, prevVnode) {// 在元素更新后調用},beforeUnmount(el, binding, vnode) {// 在元素卸載前調用},unmounted(el, binding, vnode) {// 在元素卸載后調用}
});

鉤子參數?

指令的鉤子會傳遞以下幾種參數:

el:指令綁定到的元素。這可以用于直接操作 DOM。binding:一個對象,包含以下屬性。value:傳遞給指令的值。例如在 v-my-directive="1 + 1" 中,值是 2。
oldValue:之前的值,僅在 beforeUpdate 和 updated 中可用。無論值是否更改,它都可用。
arg:傳遞給指令的參數 (如果有的話)。例如在 v-my-directive:foo 中,參數是 "foo"。
modifiers:一個包含修飾符的對象 (如果有的話)。例如在 v-my-directive.foo.bar 中,修飾符對象是 { foo: true, bar: true }。
instance:使用該指令的組件實例。
dir:指令的定義對象。
vnode:代表綁定元素的底層 VNode。prevVnode:代表之前的渲染中指令所綁定元素的 VNode。僅在 beforeUpdate 和 updated 鉤子中可用。

舉例來說,像下面這樣使用指令:

<div v-example:foo.bar="baz">
2.使用指令在組件中使用自定義指令時,只需在模板中綁定指令即可:
<template><p v-highlight="'aqua'">This paragraph will be aqua-colored.</p>
</template>
3.Vue3的自定義指令提供了以下生命周期鉤子:
  • created:在元素的屬性或事件監聽器應用前調用。
  • beforeMount:在元素插入到 DOM 前調用。
  • mounted:在元素插入到 DOM 后調用。
  • beforeUpdate:在元素更新前調用。
  • updated:在元素更新后調用。
  • beforeUnmount:在元素卸載前調用。
  • unmounted:在元素卸載后調用。

自定義指令

  • v-copy
directive/copy/index.tsimport type { Directive, DirectiveBinding, App } from 'vue'
import { ElMessage } from 'element-plus'
import {EventType} from '../types'function addEventListener(el: Element, binding: DirectiveBinding) {const { value, arg,modifiers } = bindingconsole.log(value,modifiers,arg,'ssss');// 確定事件類型和提示消息const eventType: EventType = modifiers.dblclick ? 'dblclick' : 'click'const message = arg || '復制成功' as stringel.setAttribute('copyValue', String(value))const copyHandler = async ():Promise<void> => {try {if (navigator.clipboard) {await navigator.clipboard.writeText(el.getAttribute('copyValue') || '')} else {legacyCopy(el.getAttribute('copyValue') || '')}// 非靜默模式顯示提示if (!modifiers.quiet) {ElMessage({message: message,type: 'success',})} } catch (err) {ElMessage.error('復制失敗!')}}   el.addEventListener(eventType, copyHandler)
}function legacyCopy(textToCopy: string) {const textarea = document.createElement('textarea')textarea.value = textToCopytextarea.style.position = 'fixed'document.body.appendChild(textarea)textarea.select()if (!document.execCommand('copy')) {throw new Error('execCommand 執行失敗')} document.body.removeChild(textarea)
}
const vCopy: Directive = {mounted(el: HTMLElement, binding:DirectiveBinding) {addEventListener(el, binding)},updated(el: HTMLElement, binding:DirectiveBinding) {const { value } = bindingel.setAttribute('copyValue', String(value))},
}
export const setupCopyDirective = (app: App<Element>) => {app.directive('copy', vCopy)
}
export default vCopy

2.v-focus

import type { Directive ,App} from 'vue'const vFocus: Directive = {mounted(el: HTMLElement) {console.log(el,'el');el.focus && el.focus()},updated(el: HTMLElement) {el.focus && el.focus()},
}
export const setupFocusDirective = (app: App<Element>) => {app.directive('focus', vFocus)
}
export default vFocus

組件中使用

<script setup lang="ts">import {ref} from "vue";import { BaseButton } from '@/components/Button'import { ElInput } from 'element-plus'const value = ref<string>('我是要復制的值')const change = ref<string>('我是要改變的值')
</script><template><button v-copy.dblclick="value">點擊我復制</button><BaseButton type="primary" class="w-[20%]" v-copy:復制成功了.dblclick="value">點擊我復制</BaseButton><el-input v-model="change" placeholder="Please input" /><BaseButton type="primary" class="w-[20%]" @click="() => value = change">改變將要復制的值</BaseButton><input v-model="value" placeholder="111" v-focus />
</template><style scoped></style>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75671.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75671.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75671.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于python的機器學習(五)—— 聚類(二)

一、k-medoids聚類算法 k-medoids是一種聚類算法&#xff0c;它是基于k-means聚類算法的一種改進。k-medoids算法也是一種迭代算法&#xff0c;但是它將中心點限定為數據集中的實際樣本點&#xff0c;而不是任意的點。 具體來說&#xff0c;k-medoids算法從數據集中選擇k個初…

解釋:指數加權移動平均(EWMA)

指數加權移動平均&#xff08;EWMA, Exponential Weighted Moving Average&#xff09; 是一種常用于時間序列平滑、異常檢測、過程控制等領域的統計方法。相比普通移動平均&#xff0c;它對最近的數據賦予更高權重&#xff0c;對舊數據逐漸“淡化”。 ? 一、通俗理解 想象你…

Spring Boot 項目基于責任鏈模式實現復雜接口的解耦和動態編排!

全文目錄&#xff1a; 開篇語前言一、責任鏈模式概述責任鏈模式的組成部分&#xff1a; 二、責任鏈模式的核心優勢三、使用責任鏈模式解耦復雜接口1. 定義 Handler 接口2. 實現具體的 Handler3. 創建訂單對象4. 在 Spring Boot 中使用責任鏈模式5. 配置責任鏈6. 客戶端調用 四、…

COMSOL仿真遇到的兩個小問題

最近跑熱仿真的時候跑出了兩個問題&#xff0c;上網查發現也沒什么解決方式&#xff0c;最后自己誤打誤撞的摸索著解決了&#xff0c;在這里分享一下。 問題一 我當時一準備跑仿真就彈出了這個東西&#xff0c;但在此之前從未遇到 然后我試著在它說的路徑中建立recoveries文件…

如何在英文學術寫作中正確使用標點符號?

標點符號看似微不足道&#xff0c;但它們是書面語言的無名英雄。就像熟練的指揮家指揮管弦樂隊一樣&#xff0c;標點符號可以確保您的寫作流暢、傳達正確的含義并引起讀者的共鳴。正如放錯位置的音符會在音樂中造成不和諧一樣&#xff0c;放錯位置的逗號或缺少分號也會使您的寫…

【深度學習與大模型基礎】第10章-期望、方差和協方差

一、期望 ——————————————————————————————————————————— 1. 期望是什么&#xff1f; 期望&#xff08;Expectation&#xff09;可以理解為“長期的平均值”。比如&#xff1a; 擲骰子&#xff1a;一個6面骰子的點數是1~6&#x…

JAVA虛擬機(JVM)學習

入門 什么是JVM JVM&#xff1a;Java Virtual Machine&#xff0c;Java虛擬機。 JVM是JRE(Java Runtime Environment)的一部分&#xff0c;安裝了JRE就相當于安裝了JVM&#xff0c;就可以運行Java程序了。JVM的作用&#xff1a;加載并執行Java字節碼&#xff08;.class&#…

【數據結構與算法】——堆(補充)

前言 上一篇文章講解了堆的概念和堆排序&#xff0c;本文是對堆的內容補充 主要包括&#xff1a;堆排序的時間復雜度、TOP 這里寫目錄標題 前言正文堆排序的時間復雜度TOP-K 正文 堆排序的時間復雜度 前文提到&#xff0c;利用堆的思想完成的堆排序的代碼如下&#xff08;包…

什么是柜臺債

柜臺債&#xff08;柜臺債券業務&#xff09;是指通過銀行等金融機構的營業網點或電子渠道&#xff0c;為投資者提供債券買賣、托管、結算等服務的業務模式。它允許個人、企業及機構投資者直接參與銀行間債券市場的交易&#xff0c;打破了以往僅限機構參與的壁壘。以下是綜合多…

【Android讀書筆記】讀書筆記記錄

文章目錄 一. Android開發藝術探索1. Activity的生命周期和啟動模式1.1 生命周期全面分析 一. Android開發藝術探索 1. Activity的生命周期和啟動模式 1.1 生命周期全面分析 onPause和onStop onPause后會快速調用onStop&#xff0c;極端條件下直接調用onResume 當用戶打開新…

Java對象內存結構詳解

Java對象內存結構詳解 Java對象在JVM內存中的存儲結構可以分為三個部分&#xff1a;對象頭&#xff08;Header&#xff09;、實例數據&#xff08;Instance Data&#xff09;和對齊填充&#xff08;Padding&#xff09;。以下是64位JVM&#xff08;開啟壓縮指針&#xff09;下…

【TI MSPM0】Printf重定向學習

一、新建工程 通過XDS110與電腦進行通信。 選擇這兩個引腳 需要添加這兩個頭文件 在程序中添加這三個函數即可對printf進行重定向 二、封裝函數 另一種方法 封裝一個函數&#xff0c;定義一個數組

深度強化學習基礎 0:通用學習方法

過去自己學習深度強化學習的痛點&#xff1a; 只能看到各種術語、數學公式勉強看懂&#xff0c;沒有建立清晰且準確關聯 多變量交互關系浮于表面&#xff0c;有時候連環境、代理控制的變量都混淆 模型種類繁多&#xff0c;概念繁雜難整合、對比或復用&#xff0c;無框架分析所…

asm匯編源代碼之-字庫轉換程序

將標準的16x16點陣漢字庫(下載16x16漢字庫)轉換成適合VGA文本模式下顯示的點陣漢字庫 本程序需要調用file.asm中的子程序,所以連接時需要把file連接進來,如下 C:\> tlink chghzk file 調用參數描述如下 C:\> chghzk ; 無調用參數,轉換標準庫文件(SRC16.FNT)為適合VGA…

uniapp轉換markdown

效果 AI智能體 微信小程序 流式 1.安裝Node.js 參考:2024最新版Node.js下載安裝及環境配置教程&#xff08;非常詳細&#xff09;_node.js 安裝-CSDN博客 2.需要克隆項目到本地或直接到項目地址下載壓縮包。 參考&#xff1a;uniapp中解析markdown支持網頁和小程序_uniapp ma…

用java代碼如何存取數據庫的blob字段

一.業務 在業務中我們被要求將文件或圖片等轉成 byte[] 或 InputStream存到數據庫的Blob類型的字段中. 二.Blob類型介紹 在 MySQL 中&#xff0c;Blob 數據類型用于存儲二進制數據。MySQL 提供了四種不同的 Blob 類型&#xff1a; TINYBLOB: 最大存儲長度為 255 個字節。BL…

qemu(2) -- 定制開發板

1. 前言 qemu支持自定義開發板&#xff0c;本文就記錄一下折騰的過程。基于qemu-10.0.0-rc3添加x210vb3s開發板。 2. 添加板卡文件 網上參考了一些文章&#xff0c;有些文章使用的版本和我的不一樣&#xff0c;折騰起來費了點時間&#xff0c;最后發現還是直接參考qemu中已有…

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數(決策樹、邏輯回歸、KNN、SVM)

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數&#xff08;決策樹、邏輯回歸、KNN、SVM&#xff09; 問題模板解題思路1. 導入必要的庫2. 加載數據3. 劃分訓練集和測試集4. 數據預處理5. 定義算法及其參數6. 存儲算法和對應指標7. 訓練模型并計算指標8. 找…

CPU(中央處理器)

一、CPU的定義與核心作用 CPU 是計算機的核心部件&#xff0c;負責 解釋并執行指令、協調各硬件資源 以及 完成數據處理&#xff0c;其性能直接影響計算機的整體效率。 核心功能&#xff1a; 從內存中讀取指令并譯碼。執行算術邏輯運算。控制數據在寄存器、內存和I/O設備間的…

上層 Makefile 控制下層 Makefile 的方法

在復雜的項目中&#xff0c;通常會將項目劃分為多個模塊或子項目&#xff0c;每個模塊都有自己的 Makefile。上層 Makefile 的作用是協調和控制這些下層 Makefile 的構建過程。下面是幾種常見的示例&#xff0c;實現上層 Makefile 對下層 Makefile 的控制。 直接調用&#xff1…