關于前端指令

在前端開發中,指令(Directives)通常指在框架中使用的一種特殊的語法或機制,用于擴展 HTML 的功能。常見的指令主要存在于前端框架中,如 Vue.js、Angular 等。下面我們將分別介紹 Vue.js 和 Angular 中的常用指令,并通過代碼示例分析它們的作用。最后再討論自定義指令的常見使用場景。


Vue.js 常用指令

Vue.js 提供了多種內置指令,用于與 DOM 元素交互。以下是常用指令及示例:

1.?v-bind

用于動態綁定 HTML 元素的屬性。

<img v-bind:src="imageUrl">

作用:將 imageUrl 數據綁定到 img 標簽的 src 屬性,當 imageUrl 變化時,src 會自動更新。

2.?v-model

用于實現表單元素的雙向數據綁定。

<input v-model="username">

作用:將 input 的值與 username 數據綁定,當用戶輸入時,username 會自動更新,反之亦然。

3.?v-if?/?v-else?/?v-else-if

用于條件渲染。

<p v-if="score >= 90">優秀</p>
<p v-else-if="score >= 60">及格</p>
<p v-else>不及格</p>

作用:根據 score 的值動態渲染不同的內容。

4.?v-for

用于列表渲染。

<ul><li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>

作用:遍歷 items 數組,渲染列表。

5.?v-on

用于綁定事件監聽器。

<button v-on:click="handleClick">點擊我</button>

作用:為按鈕綁定 click 事件,觸發 handleClick 方法。

6.?v-show

用于控制元素的顯示/隱藏。

<div v-show="isVisible">顯示內容</div>

作用:根據 isVisible 的值控制 div 的顯示或隱藏(通過 display: none)。

Angular 常用指令

Angular 也提供了豐富的內置指令,以下是一些常見的:

1.?*ngIf

用于條件渲染。

<p *ngIf="isLoggedIn">歡迎回來!</p>

作用:根據 isLoggedIn 的值決定是否渲染 p 元素。

2.?*ngFor

用于列表渲染。

<ul><li *ngFor="let item of items">{{ item.name }}</li>
</ul>

作用:遍歷 items 數組,渲染列表。

3.?ngModel

用于雙向數據綁定。

<input [(ngModel)]="username">

作用:將 input 的值與 username 雙向綁定。

4.?ngClass

用于動態添加 CSS 類。

<div [ngClass]="{'active': isActive, 'error': hasError}">內容</div>

作用:根據 isActivehasError 的值動態添加 activeerror 類。

5.?ngStyle

用于動態添加樣式。

<div [ngStyle]="{'color': textColor, 'font-size': fontSize}">內容</div>

作用:根據 textColorfontSize 的值動態設置樣式。


常用自定義指令

在 Vue.js 和 Angular 中,可以創建自定義指令來擴展功能。

Vue.js 自定義指令
Vue.directive('focus', {inserted: function (el) {el.focus();}
});

使用:

<input v-focus>

作用:當頁面加載時,自動聚焦到 input 元素。

Vue.js 提供了 Vue.directive 方法來創建自定義指令。以下是一個監聽點擊事件并執行自定義邏輯的示例

Vue.directive('custom-click', {bind(el, binding) {// 綁定點擊事件el.addEventListener('click', () => {// 執行傳入的回調函數if (typeof binding.value === 'function') {binding.value();}});},unbind(el) {// 解綁點擊事件el.removeEventListener('click', () => {});}
});
使用示例
<div id="app"><button v-custom-click="handleClick">點擊我</button>
</div><script>
new Vue({el: '#app',methods: {handleClick() {alert('按鈕被點擊了!');}}
});
</script>
解析
  1. bind:在指令綁定到元素時調用。這里我們監聽了?click?事件。
  2. unbind:在指令解綁時調用。這里我們移除了?click?事件監聽器。
  3. binding.value:獲取指令綁定的值(即回調函數?handleClick)。
  4. 當按鈕被點擊時,會觸發傳入的回調函數?handleClick
Angular 自定義指令
@Directive({selector: '[appHighlight]'
})
export class HighlightDirective {constructor(private el: ElementRef) {}@HostListener('mouseenter') onMouseEnter() {this.el.nativeElement.style.backgroundColor = 'yellow';}@HostListener('mouseleave') onMouseLeave() {this.el.nativeElement.style.backgroundColor = '';}
}

使用:

<p appHighlight>鼠標懸停我</p>

作用:當鼠標懸停在 p 元素上時,背景色變為黃色。

自定義指令的常見應用

  1. DOM 操作

    • 場景:自動聚焦、滾動到某個元素、動態修改元素屬性等。
    • 示例:v-focus?指令用于輸入框自動聚焦。
  2. 事件處理

    • 場景:監聽特定事件,執行自定義邏輯。?? ? ? ? ? ??
    • 示例:appHighlight?指令用于鼠標懸停時動態改變背景色。
  3. 表單驗證

    • 場景:自定義表單驗證邏輯。
    • 示例:創建?v-validate?指令,實時驗證輸入內容是否符合規則。
  4. 第三方庫集成

    • 場景:將第三方庫(如 jQuery 插件)集成到框架中。
    • 示例:創建?v-datepicker?指令,將日期選擇器插件與 Vue 或 Angular 集成。
  5. 性能優化

    • 場景:懶加載圖片、組件或數據。
    • 示例:創建?v-lazy?指令,實現圖片懶加載。

全局注冊指令

全局注冊的指令可以在應用的任何組件中使用。通常在 main.jsapp.js 中注冊。

代碼實現

import Vue from 'vue';// 定義自定義指令
Vue.directive('focus', {inserted(el) {el.focus();}
});// 或者使用簡寫形式
Vue.directive('focus', (el) => {el.focus();
});// 啟動應用
new Vue({el: '#app'
});

使用示例

<input v-focus>

局部注冊指令

局部注冊的指令僅在特定組件中可用。

代碼實現

export default {directives: {focus: {inserted(el) {el.focus();}}}
};

使用示例

<template><input v-focus>
</template><script>
export default {directives: {focus: {inserted(el) {el.focus();}}}
};
</script>

復雜指令的應用場景

1.?DOM 操作和交互

場景:實現拖拽、縮放、滾動監聽等復雜交互。

  • 示例
    • Vue.js?實現拖拽指令:
      • Vue.directive('drag', {bind(el) {let isDragging = false;el.addEventListener('mousedown', () => {isDragging = true;});document.addEventListener('mousemove', (e) => {if (isDragging) {el.style.left = `${e.clientX}px`;el.style.top = `${e.clientY}px`;}});document.addEventListener('mouseup', () => {isDragging = false;});}
        });
        
    • Angular?實現拖拽指令:?????
      • @Directive({selector: '[appDrag]'
        })
        export class DragDirective {@HostListener('mousedown', ['$event']) onMouseDown(event: MouseEvent) {const element = this.el.nativeElement;const startX = event.clientX - element.offsetLeft;const startY = event.clientY - element.offsetTop;const onMouseMove = (e: MouseEvent) => {element.style.left = `${e.clientX - startX}px`;element.style.top = `${e.clientY - startY}px`;};const onMouseUp = () => {document.removeEventListener('mousemove', onMouseMove);document.removeEventListener('mouseup', onMouseUp);};document.addEventListener('mousemove', onMouseMove);document.addEventListener('mouseup', onMouseUp);}constructor(private el: ElementRef) {}
        }
        
2.?事件綁定和解綁

場景:監聽復雜的用戶交互事件(如長按、雙擊、滾動等)。

  • 示例
    • Vue.js?長按指令:
      • Vue.directive('longpress', {bind(el, binding) {let timeout;const handler = () => binding.value();el.addEventListener('mousedown', () => {timeout = setTimeout(handler, 1000);});el.addEventListener('mouseup', () => {clearTimeout(timeout);});}
        });
        
    • Angular?實現拖拽指令:?
      • @Directive({selector: '[appLongPress]'
        })
        export class LongPressDirective {@HostListener('mousedown') onMouseDown() {this.timeout = setTimeout(() => {this.callback();}, 1000);}@HostListener('mouseup') onMouseUp() {clearTimeout(this.timeout);}private timeout: any;@Input('appLongPress') callback: () => void;
        }
        

3.?動態樣式和類名

場景:根據條件動態添加樣式或類名。

  • 示例
Vue.directive('dynamic-class', {update(el, binding) {el.className = binding.value;}
});
4.?性能優化

場景:懶加載圖片、虛擬滾動等。

  • 示例
    • Vue.js?圖片懶加載指令:
      • Vue.directive('lazy', {inserted(el, binding) {const observer = new IntersectionObserver((entries) => {if (entries[0].isIntersecting) {el.src = binding.value;observer.unobserve(el);}});observer.observe(el);}
        });
        

?

設計復雜指令的注意事項

1.?指令的生命周期
  • Vue.js:需要了解?bindinsertedupdateunbind?等鉤子函數。
  • Angular:需要了解?ngOnInitngAfterViewInitngOnDestroy?等生命周期鉤子。
  • 注意:在指令解綁時(如?unbind?或?ngOnDestroy),一定要清除事件監聽器、定時器或觀察者,避免內存泄漏。
2.?指令的復用性
  • 設計指令時應盡量保持通用性,避免硬編碼。
  • 通過參數化(如?binding.value?或?@Input)來實現靈活配置。
3.?性能優化
  • 避免在指令中進行頻繁的 DOM 操作,減少重繪和回流。
  • 使用事件委托或防抖/節流技術優化高頻事件(如滾動、拖拽)。
4.?指令的測試
  • 編寫單元測試或端到端測試,確保指令在不同場景下的行為正確。
  • 使用工具(如 Jest、Karma)進行測試。
5.?指令的兼容性
  • 確保指令在不同瀏覽器和設備上的兼容性。
  • 對舊版瀏覽器使用?polyfill?或降級方案。

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

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

相關文章

虛擬地址空間(下)進程地址空間(上)

一.關于頁表組成 1.權限&#xff08;rwx) 作用&#xff1a;如1.讓代碼區變成只讀的 2.寫時拷貝的實現&#xff1a;子進程創建時其頁表指向的父進程代碼和數據權限都是只讀的&#xff0c;子進程試圖修改&#xff0c;觸發錯誤&#xff0c;系統開始寫時拷貝。 來源&#xff1a;…

【區塊鏈 + 航運物流】豐溯 - 區塊鏈溯源平臺 | FISCO BCOS 應用案例

豐溯是順豐科技推出的區塊鏈溯源平臺&#xff0c; 采用 FISCO BCOS 底層開源框架&#xff0c; 為農副食品、 冷鏈生鮮等企業客戶及消費 者提供關鍵流通節點的溯源信息服務&#xff0c;形成從源頭到消費者端全鏈路透明的信息鏈。 在商貿消費領域&#xff0c; 溯源一直是保障產品…

iwebsec-SQL數字型注入

1.判斷是否存在漏洞 添加and 11發現正常顯示&#xff0c;添加and 12無回顯條目&#xff0c;則存在sql注入漏洞 2.因為有回顯&#xff0c;嘗試union聯合注入&#xff0c;使用order by判斷出有3個字段 3.使用union聯合注入查看回顯位&#xff0c;發現3三個字段均有回顯&#xff…

藍橋杯每日五題第一日

藍橋杯每日5題 問題一 班級活動 1.班級活動 - 藍橋云課 問題描述 小明的老師準備組織一次班級活動。班上一共有 nn 名 (nn 為偶數) 同學&#xff0c;老師想把所有的同學進行分組&#xff0c;每兩名同學一組。為了公平&#xff0c;老師給每名同學隨機分配了一個 nn 以內的正…

STM32 —— 嵌入式系統、通用計算機系統、物聯網三層架構

目錄 一、嵌入式系統的概念 二、通用計算機系統與嵌入式系統的比較 用途 硬件 軟件 性能與功耗 開發與維護 三、嵌入式系統與物聯網的關系 四、物聯網的三層架構 1. 感知層&#xff08;Perception Layer&#xff09; 2. 網絡層&#xff08;Network Layer&#xff09; …

卡碼網25題——掌握ACM輸入輸出方式(15 至 18)

刷題小記&#xff1a; 本期涉及ACM模式下棧和鏈表的構建與使用&#xff0c;值得學習。 卡瑪網15.神秘字符&#xff08;卡瑪網15.神秘字符&#xff09; 題目分析&#xff1a; 若給定2行字符串&#xff0c;其中第一個串的長度為偶數&#xff0c;現要求把第二個串插入到第一個…

前端字段名和后端不一致?解鎖 JSON 映射的“隱藏規則” !!!

&#x1f680; 前端字段名和后端不一致&#xff1f;解鎖 JSON 映射的“隱藏規則” &#x1f31f; 嘿&#xff0c;技術冒險家們&#xff01;&#x1f44b; 今天我們要聊一個開發中常見的“坑”&#xff1a;前端傳來的 JSON 參數字段名和后端對象字段名不一致&#xff0c;會發生…

python中使用單例模式在整個程序中只創建一個數據庫連接,節省資源

示例代碼&#xff1a; from loguru import logger from pymongo import MongoClient from pymongo.errors import ConnectionFailurefrom llm_engineering.settings import settingsclass MongoDatabaseConnector:_instance: MongoClient | None Nonedef __new__(cls, *args,…

AI小白的第六天:必要的數學知識(一)

在學習的過程中&#xff0c;不管是上代碼還是理論學習&#xff0c;其中都摻雜了一些數學知識。俗話說“磨刀不誤砍柴工”&#xff0c;而我已經“誤了砍柴功”了&#xff0c;現在變成了“亡羊補牢&#xff0c;為時不晚”。 線性代數 線性代數是數學的一個分支&#xff0c;主要…

【Linux】Bash是什么?怎么使用?

李升偉 整理 什么是 Bash&#xff1f; Bash&#xff08;Bourne Again Shell&#xff09;是一種 命令行解釋器&#xff08;Shell&#xff09;&#xff0c;廣泛用于 Unix 和 Linux 操作系統。它是 Bourne Shell&#xff08;sh&#xff09; 的增強版&#xff0c;提供了更多的功能…

Qt Creator入門

1.創建項目 選擇創建項目-Application&#xff08;Qt&#xff09;-Qt Widgets Application-修改名稱即可 默認創建有窗口類&#xff0c;myWidget,基類有三種選擇&#xff1a;QWidget&#xff0c;QMainWindow&#xff0c;QDialog 注意&#xff1a; 名稱和創建路徑不能有中文、…

C語言經典代碼練習題

1.輸入一個4位數&#xff1a;輸出這個輸的個位 十位 百位 千位 #include <stdio.h> int main(int argc, char const *argv[]) {int a;printf("輸入一個&#xff14;位數&#xff1a;");scanf("%d",&a);printf("個位&#xff1a;%d\n"…

cls(**dict(data, id=id))靈活地從一個字典生成實例,同時確保某些關鍵字段(如 id)被正確設置或覆蓋

示例代碼&#xff1a; classmethoddef from_mongo(cls: Type[T], data: dict) -> T:"""Convert "_id" (str object) into "id" (UUID object)."""if not data:raise ValueError("Data is empty.")id data.pop…

MyBatis XMLMapperBuilder 是如何將 SQL 語句解析成可執行的對象? 如何將結果映射規則解析成對應的處理器?

1. XMLMapperBuilder 如何將 SQL 語句解析成可執行對象 (MappedStatement): XMLMapperBuilder 解析 <select>, <insert>, <update>, <delete> 等 SQL 語句元素時&#xff0c;并不僅僅是簡單地讀取 SQL 文本&#xff0c;而是要將 SQL 語句和相關的配置…

咖啡點單小程序畢業設計(JAVA+SpringBoot+微信小程序+完整源碼+論文)

?全網粉絲20W,csdn特邀作者、博客專家、CSDN新星計劃導師、java領域優質創作者,博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取項目下載方式&#x1f345; 一、項目背景介紹&#xff1a; 隨著社會的快速發展和…

003-掌控命令行-CLI11-C++開源庫108杰

首選的現代C風格命令行參數解析器! &#xff08;本課程包含兩段教學視頻。&#xff09; 以文件對象監控程序為實例&#xff0c;五分鐘實現從命令行讀入多個監控目標路徑&#xff1b;區分兩大時機&#xff0c;學習 CLI11 構建與解析參數兩大場景下的異常處理&#xff1b;區分三…

【leetcode hot 100 124】二叉樹中的最大路徑和

解法一&#xff1a;&#xff08;遞歸&#xff09;考慮實現一個簡化的函數 maxGain(node)&#xff0c;該函數計算二叉樹中的一個節點的最大貢獻值&#xff0c;具體而言&#xff0c;就是在以該節點為根節點的子樹中尋找以該節點為起點的一條路徑&#xff0c;使得該路徑上的節點值…

譜分析方法

前言 本文隸屬于專欄《機器學習數學通關指南》&#xff0c;該專欄為筆者原創&#xff0c;引用請注明來源&#xff0c;不足和錯誤之處請在評論區幫忙指出&#xff0c;謝謝&#xff01; 本專欄目錄結構和參考文獻請見《機器學習數學通關指南》 ima 知識庫 知識庫廣場搜索&#…

在圖像/視頻中裁剪出人臉區域

1. 在圖像中裁剪人臉區域 import face_alignment import skimage.io import numpy from argparse import ArgumentParser from skimage import img_as_ubyte from skimage.transform import resize from tqdm import tqdm import os import numpy as np import warnings warni…

【軟考-架構】11.3、設計模式-新

?資料&文章更新? GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目錄 項目中的應用設計模式創建型設計模式結構型設計模式行為型設計模式 &#x1f4af;考試真題題外話 項目中的應用 在實際項目中&#xff0c;我應用過多種設計模式來解決不同…