Vue 事件修飾符詳解

Vue 事件修飾符詳解

事件修飾符是 Vue 中處理 DOM 事件細節的強大工具。下面我將通過一個交互式示例全面解析各種事件修飾符的用法和原理。

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue 事件修飾符詳解</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><style>* {box-sizing: border-box;margin: 0;padding: 0;}body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;line-height: 1.6;color: #2c3e50;background: linear-gradient(135deg, #f5f7fa 0%, #e4edf5 100%);min-height: 100vh;padding: 20px;}.container {max-width: 1200px;margin: 0 auto;}header {text-align: center;padding: 30px 0;margin-bottom: 30px;}h1 {font-size: 2.8rem;margin-bottom: 15px;color: #34495e;}.subtitle {color: #7f8c8d;font-size: 1.3rem;max-width: 800px;margin: 0 auto;}.card {background: white;border-radius: 12px;box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);padding: 30px;margin-bottom: 30px;}.card-header {margin-bottom: 20px;padding-bottom: 15px;border-bottom: 2px solid #f0f4f8;display: flex;align-items: center;gap: 15px;}.card-header h2 {font-size: 1.8rem;color: #2c3e50;}.modifier-grid {display: grid;grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));gap: 25px;margin: 30px 0;}.modifier-card {background: #f8fafc;border-radius: 10px;padding: 25px;box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);transition: transform 0.3s, box-shadow 0.3s;}.modifier-card:hover {transform: translateY(-5px);box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);}.modifier-card h3 {color: #2c3e50;margin-bottom: 15px;display: flex;align-items: center;gap: 10px;}.modifier-card h3 .icon {background: #42b983;color: white;width: 30px;height: 30px;border-radius: 50%;display: flex;align-items: center;justify-content: center;font-size: 18px;}.code-block {background: #2d2d2d;color: #f8f8f2;padding: 15px;border-radius: 8px;font-family: 'Fira Code', monospace;font-size: 14px;margin: 15px 0;overflow-x: auto;}.demo-area {background: white;padding: 25px;border-radius: 10px;margin-top: 20px;border: 1px solid #e2e8f0;}.demo-container {display: flex;flex-wrap: wrap;gap: 20px;}.demo-box {flex: 1;min-width: 300px;padding: 20px;border-radius: 8px;background: #f8fafc;}.event-target {padding: 30px;background: #e3f2fd;border-radius: 8px;margin: 15px 0;position: relative;cursor: pointer;}.event-target .inner {padding: 20px;background: #bbdefb;border-radius: 6px;}.event-target .inner .core {padding: 15px;background: #90caf9;border-radius: 4px;}.form-demo {background: #e8f5e9;padding: 20px;border-radius: 8px;margin-top: 20px;}button {background: #42b983;color: white;border: none;padding: 12px 20px;border-radius: 6px;cursor: pointer;font-size: 16px;font-weight: 500;transition: background 0.3s;display: inline-block;margin: 5px;}button:hover {background: #3aa776;}.log-area {background: #1e1e1e;color: #d4d4d4;padding: 20px;border-radius: 8px;margin-top: 20px;font-family: 'Fira Code', monospace;max-height: 300px;overflow-y: auto;font-size: 14px;}.log-entry {margin-bottom: 8px;padding-bottom: 8px;border-bottom: 1px solid #333;}.log-time {color: #6a9955;}.keyboard-demo {display: flex;gap: 15px;flex-wrap: wrap;margin: 20px 0;}.key {background: #3498db;color: white;padding: 12px 18px;border-radius: 6px;cursor: pointer;text-align: center;min-width: 80px;}.mouse-buttons {display: flex;gap: 15px;margin: 20px 0;}.mouse-btn {background: #9b59b6;color: white;padding: 15px;border-radius: 8px;cursor: pointer;text-align: center;flex: 1;}.summary-table {width: 100%;border-collapse: collapse;margin: 25px 0;background: white;border-radius: 8px;overflow: hidden;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);}.summary-table th, .summary-table td {border: 1px solid #e2e8f0;padding: 16px;text-align: left;}.summary-table th {background-color: #f8fafc;font-weight: 600;color: #2c3e50;}.summary-table tr:nth-child(even) {background-color: #f8fafc;}.highlight {background-color: #fff9c4;padding: 2px 4px;border-radius: 3px;color: #333;}@media (max-width: 768px) {.demo-container {flex-direction: column;}h1 {font-size: 2.2rem;}}</style>
</head>
<body><div class="container"><header><h1>Vue 事件修飾符詳解</h1><p class="subtitle">全面解析 Vue 事件修飾符的原理、用法及最佳實踐</p></header><div class="card"><div class="card-header"><h2>事件修飾符基礎</h2></div><p>事件修飾符是 Vue 為 v-on 指令提供的特殊后綴,用于處理 DOM 事件細節:</p><div class="modifier-grid"><!-- .stop 修飾符 --><div class="modifier-card"><h3><span class="icon">?</span> .stop</h3><p>阻止事件冒泡(相當于 event.stopPropagation())</p><div class="code-block">&lt;div @click.stop="handleClick"&gt;...&lt;/div&gt;</div><p class="demo-hint">點擊內部元素不會觸發外部元素的事件</p></div><!-- .prevent 修飾符 --><div class="modifier-card"><h3><span class="icon">🚫</span> .prevent</h3><p>阻止默認行為(相當于 event.preventDefault())</p><div class="code-block">&lt;form @submit.prevent="onSubmit"&gt;...&lt;/form&gt;</div><p class="demo-hint">阻止表單提交、鏈接跳轉等默認行為</p></div><!-- .capture 修飾符 --><div class="modifier-card"><h3><span class="icon">🔍</span> .capture</h3><p>使用事件捕獲模式(從外到內處理事件)</p><div class="code-block">&lt;div @click.capture="handleCapture"&gt;...&lt;/div&gt;</div><p class="demo-hint">先處理外部元素,再處理內部元素</p></div><!-- .self 修飾符 --><div class="modifier-card"><h3><span class="icon">👤</span> .self</h3><p>只當事件是從元素自身觸發時觸發</p><div class="code-block">&lt;div @click.self="handleSelf"&gt;...&lt;/div&gt;</div><p class="demo-hint">忽略內部元素冒泡上來的事件</p></div><!-- .once 修飾符 --><div class="modifier-card"><h3><span class="icon">1??</span> .once</h3><p>事件只觸發一次</p><div class="code-block">&lt;button @click.once="handleOnce"&gt;...&lt;/button&gt;</div><p class="demo-hint">第一次點擊后自動移除事件監聽</p></div><!-- .passive 修飾符 --><div class="modifier-card"><h3><span class="icon">?</span> .passive</h3><p>提升滾動性能(不阻止默認行為)</p><div class="code-block">&lt;div @scroll.passive="onScroll"&gt;...&lt;/div&gt;</div><p class="demo-hint">特別針對移動端滾動優化</p></div></div><div class="demo-area"><h3>事件修飾符演示</h3><div class="demo-container"><div class="demo-box"><h4>事件冒泡測試</h4><div class="event-target" @click="logEvent('outer')">外層區域<div class="inner" @click="logEvent('inner')">中間區域<div class="core" @click="logEvent('core')">核心區域</div></div></div><div class="keyboard-demo"><button @click="clearLogs">清除日志</button><button @click="addStopModifier('core')">核心添加.stop</button><button @click="addSelfModifier('inner')">中間添加.self</button></div></div><div class="demo-box"><h4>默認行為測試</h4><div class="form-demo"><form @submit="logEvent('表單提交')"><p><input type="text" placeholder="輸入內容" style="width:100%; padding:10px; margin:10px 0;"></p><button type="submit">普通提交</button><button type="submit" @click.prevent="logEvent('阻止提交')">阻止提交</button><button type="submit" @click.prevent.once="logEvent('只提交一次')">只提交一次</button></form><div style="margin-top: 20px;"><a href="https://vuejs.org" @click="logEvent('普通鏈接')">普通鏈接</a><a href="https://vuejs.org" @click.prevent="logEvent('阻止跳轉')">阻止跳轉鏈接</a></div></div></div></div><div class="log-area"><div v-for="(log, index) in eventLog" :key="index" class="log-entry"><span class="log-time">{{ log.time }}</span> - {{ log.message }}</div></div></div></div><div class="card"><div class="card-header"><h2>按鍵修飾符</h2></div><p>Vue 提供按鍵修飾符來處理鍵盤事件:</p><div class="demo-area"><div class="keyboard-demo"><div class="key" @keydown.enter="handleKey('Enter')">Enter</div><div class="key" @keydown.esc="handleKey('Esc')">Esc</div><div class="key" @keydown.space="handleKey('Space')">Space</div><div class="key" @keydown.up="handleKey('↑')"></div><div class="key" @keydown.down="handleKey('↓')"></div><div class="key" @keydown.left="handleKey('←')"></div><div class="key" @keydown.right="handleKey('→')"></div><div class="key" @keydown.delete="handleKey('Delete')">Delete</div><div class="key" @keydown.tab="handleKey('Tab')">Tab</div></div><div class="keyboard-demo"><div class="key" @keydown.ctrl.exact="handleKey('Ctrl')">Ctrl</div><div class="key" @keydown.alt.exact="handleKey('Alt')">Alt</div><div class="key" @keydown.shift.exact="handleKey('Shift')">Shift</div><div class="key" @keydown.meta.exact="handleKey('Meta')">Meta</div></div><div class="keyboard-demo"><div class="key" @keydown.ctrl.enter="handleKey('Ctrl+Enter')">Ctrl+Enter</div><div class="key" @keydown.alt.space="handleKey('Alt+Space')">Alt+Space</div><div class="key" @keydown.shift.up="handleKey('Shift+↑')">Shift+↑</div></div><input type="text" placeholder="在此輸入內容測試按鍵事件" @keydown="logKeyEvent"style="width:100%; padding:12px; border-radius:6px; border:1px solid #ddd; margin:15px 0;"><div class="log-area"><div v-for="(log, index) in keyLog" :key="index" class="log-entry"><span class="log-time">{{ log.time }}</span> - {{ log.message }}</div></div></div></div><div class="card"><div class="card-header"><h2>鼠標修飾符</h2></div><div class="demo-area"><div class="mouse-buttons"><div class="mouse-btn" @click="handleMouse('左鍵')">左鍵點擊</div><div class="mouse-btn" @click.right="handleMouse('右鍵')">右鍵點擊</div><div class="mouse-btn" @click.middle="handleMouse('中鍵')">中鍵點擊</div><div class="mouse-btn" @click.left="handleMouse('左鍵')">左鍵點擊</div></div><div class="mouse-buttons"><div class="mouse-btn" @click.ctrl="handleMouse('Ctrl+點擊')">Ctrl+點擊</div><div class="mouse-btn" @click.shift="handleMouse('Shift+點擊')">Shift+點擊</div><div class="mouse-btn" @click.alt="handleMouse('Alt+點擊')">Alt+點擊</div><div class="mouse-btn" @click.exact="handleMouse('精確點擊')">精確點擊</div></div><div class="log-area"><div v-for="(log, index) in mouseLog" :key="index" class="log-entry"><span class="log-time">{{ log.time }}</span> - {{ log.message }}</div></div></div></div><div class="card"><div class="card-header"><h2>事件修飾符總結</h2></div><div class="summary-table"><table><thead><tr><th>修飾符</th><th>作用</th><th>原生 JS 等效操作</th><th>使用場景</th></tr></thead><tbody><tr><td><code>.stop</code></td><td>阻止事件冒泡</td><td><code>event.stopPropagation()</code></td><td>阻止內部事件觸發外部事件</td></tr><tr><td><code>.prevent</code></td><td>阻止默認行為</td><td><code>event.preventDefault()</code></td><td>阻止表單提交、鏈接跳轉</td></tr><tr><td><code>.capture</code></td><td>使用捕獲模式</td><td>在事件捕獲階段處理</td><td>需要先處理父級再處理子級</td></tr><tr><td><code>.self</code></td><td>僅自身觸發時處理</td><td>檢查 <code>event.target</code></td><td>忽略子元素冒泡事件</td></tr><tr><td><code>.once</code></td><td>只觸發一次</td><td>觸發后移除事件監聽</td><td>一次性操作(如首次點擊)</td></tr><tr><td><code>.passive</code></td><td>提升滾動性能</td><td><code>{ passive: true }</code></td><td>移動端滾動優化</td></tr><tr><td><code>.{keyCode}</code></td><td>按鍵事件</td><td><code>event.keyCode</code></td><td>處理特定按鍵事件</td></tr><tr><td><code>.native</code></td><td>監聽組件根元素</td><td>原生事件綁定</td><td>在組件上監聽原生事件</td></tr></tbody></table></div><div class="demo-area"><h3>最佳實踐</h3><ul><li>使用修飾符代替直接在方法中操作 DOM 事件</li><li>注意修飾符的順序:<code>@click.prevent.self</code><code>@click.self.prevent</code> 不同</li><li>移動端優先使用 <code>.passive</code> 提升滾動性能</li><li>使用 <code>.exact</code> 修飾符精確控制系統修飾符組合</li><li>自定義按鍵別名:<code>Vue.config.keyCodes.f1 = 112</code></li></ul><div class="code-block">// 修飾符串聯示例&lt;a @click.stop.prevent="handleLink"&gt;鏈接&lt;/a&gt;// 精確控制系統修飾符&lt;button @click.ctrl.exact="ctrlClick"&gt;Ctrl+點擊&lt;/button&gt;// 自定義按鍵別名Vue.config.keyCodes = {f1: 112,mediaPlayPause: 179}</div></div></div></div><script>new Vue({el: '.container',data: {eventLog: [],keyLog: [],mouseLog: [],stopModifier: '',selfModifier: ''},methods: {logEvent(source) {const time = new Date().toLocaleTimeString();this.eventLog.unshift({time,message: `事件來源: ${source}`});if (this.eventLog.length > 20) {this.eventLog.pop();}},logKeyEvent(event) {const time = new Date().toLocaleTimeString();this.keyLog.unshift({time,message: `按鍵: ${event.key} (代碼: ${event.code})`});if (this.keyLog.length > 15) {this.keyLog.pop();}},handleKey(key) {const time = new Date().toLocaleTimeString();this.keyLog.unshift({time,message: `檢測到按鍵: ${key}`});},handleMouse(button) {const time = new Date().toLocaleTimeString();this.mouseLog.unshift({time,message: `鼠標操作: ${button}`});},clearLogs() {this.eventLog = [];this.keyLog = [];this.mouseLog = [];},addStopModifier(element) {this.stopModifier = element;this.logEvent(`${element}元素添加了.stop修飾符`);},addSelfModifier(element) {this.selfModifier = element;this.logEvent(`${element}元素添加了.self修飾符`);},// 模擬修飾符效果handleCoreClick(event) {if (this.stopModifier === 'core') {event.stopPropagation();}this.logEvent('核心區域');},handleInnerClick(event) {if (this.selfModifier === 'inner') {if (event.target !== event.currentTarget) return;}this.logEvent('中間區域');}}});</script>
</body>
</html>

Vue 事件修飾符詳解

核心事件修飾符

  1. .stop - 阻止事件冒泡

    • 等效于 event.stopPropagation()停止事件冒泡
    • 使用場景:阻止內部事件觸發外部事件
  2. .prevent - 阻止默認行為

    • 等效于 event.preventDefault()阻止事件的默認行為。
    • 使用場景:阻止表單提交、鏈接跳轉等
  3. .capture - 使用事件捕獲模式

    • 事件從外到內處理(默認是冒泡模式,從內到外)
      • 添加事件監聽器包括兩種不同的方式:
        • 一種是從內到外添加(是事件冒泡模式)
        • 一種是從外到內添加(是事件捕獲模式)
    • 使用場景:需要先處理父級再處理子級的事件
  4. .self - 僅當事件源是元素自身時觸發

    • 忽略子元素冒泡上來的事件
    • 使用場景:只在點擊元素自身時觸發,忽略內部元素事件
  5. .once - 事件只觸發一次

    • 觸發后自動移除事件監聽
    • 使用場景:一次性操作(如首次點擊)
  6. .passive - 提升滾動性能(passive意為順從、不抵抗。直接繼續(立即)執行事件的默認行為)

    • 告訴瀏覽器不阻止默認行為
    • 使用場景:移動端滾動優化
    • 注意:.passive和.prevent修飾符是對立的。兩者不可以共存(如果一起用,就會報錯)。
      • .prevent :阻止事件的默認行為
      • .passive:解除阻止事件的默認行為

注意:在Vue當中,使勁按修飾符可以多個聯合使用,例如:
@click.self.stop:先執行.self.再執行.stop

按鍵修飾符

Vue 提供了常見按鍵的別名:

  • .enter
  • .tab
  • .delete (捕獲 “刪除” 和 “退格” 鍵)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

系統修飾鍵:

  • .ctrl
  • .alt
  • .shift
  • .meta (Windows 鍵或 Command 鍵)

鼠標修飾符

  • .left - 左鍵點擊
  • .right - 右鍵點擊
  • .middle - 中鍵點擊

修飾符使用技巧

  1. 修飾符串聯

    <!-- 先停止冒泡,再阻止默認行為 -->
    <a @click.stop.prevent="doThat"></a>
    
  2. 精確修飾符

    <!-- 有且只有 Ctrl 被按下時才觸發 -->
    <button @click.ctrl.exact="onCtrlClick">Ctrl+Click</button><!-- 沒有任何系統修飾符被按下時才觸發 -->
    <button @click.exact="onClick">Click</button>
    
  3. 自定義按鍵別名

    // 全局配置
    Vue.config.keyCodes = {f1: 112,mediaPlayPause: 179
    }// 使用
    <input @keyup.f1="help" @keyup.mediaPlayPause="playPause">
    

最佳實踐

  1. 使用修飾符替代在方法中操作 DOM 事件
  2. 注意修飾符的順序(從左到右處理)
  3. 移動端優先使用 .passive 提升滾動性能
  4. 使用 .exact 精確控制系統修飾鍵組合
  5. 避免過度使用 .once,確保用戶理解操作是一次性的

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

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

相關文章

初探Qt信號與槽機制

3.3 按鍵響應 - 初識信號與槽 3.3.1 信號與槽基本介紹 提出疑問&#xff0c;界面上已經有按鍵了&#xff0c;怎么操作才能讓用戶按下按鍵后有操作上的反應呢&#xff1f; 在 Qt 中&#xff0c; 信號和槽機制 是一種非常強大的事件通信機制。這是一個重要的概念&#xff0…

Android音視頻流媒體基礎總結

流媒體開發中&#xff0c;流媒體系統的實現從數據采集、編碼封裝、傳輸分發、接收解碼播放都有哪些技術和實現&#xff0c;流媒體和本地音視頻又有哪些差異&#xff1f; 影像系統開發&#xff0c;流媒體方向和普通的多媒體影像系統開發有一定差異。 相同點在于圖像多媒體處理…

疫菌QBD案例

本文是《A-VAX: Applying Quality by Design to Vaccines》第七個研究的R語言解決方案。 使用帶兩個中心點的二水平析因設計。運行10次實驗。結果是分辨度為III的設計。 A <- c(25,25,15,15,15,25,25,20,15,20) B <- c(12,8,8,12,8,12,8,10,12,10) C <- c(35,15,15…

Linux部署elasticsearch 單機版

Linux部署elasticsearch 1、下載安裝包 Elasticsearch 7.8.0 | Elastic 2、安裝步驟 2.1、上傳安裝包到服務器opt目錄 2.2、解壓 #目錄創建/opt/module cd /opt mkdir module tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz -C /opt/module mv elasticsearch-7.8.0 …

IDEA高效快捷鍵指南

1. 編輯類快捷鍵 編輯快捷鍵是最常用的一類&#xff0c;可以幫助我們快速操作代碼&#xff1a; 快捷鍵 功能描述 Mac Windows 熱度 psvm Tab 生成 main 方法 psvm Tab psvm Tab ????? sout Tab 生成 System.out.println() 輸出語句 sout Tab sout Tab…

【論文寫作參考文獻地址】

參考文獻地址 論文的各種參考文獻地址國家哲學社會科學文獻中心國家科技圖書文獻中心 論文的各種參考文獻地址 國家哲學社會科學文獻中心 資源免費!!! 整體配色就是紅色&#xff0c;主頁輪播有些實時新聞。 博主個人感受&#xff0c;對于計算機類的收錄不是特別的充足 國家科…

華為OD機考-貨幣單位換算-字符串(JAVA 2025B卷)

純暴力解法 import java.util.*; public class ExchangeMoney {public static void main(String[] args) {Scanner scanner new Scanner(System.in);while(scanner.hasNextLine()){int count Integer.parseInt(scanner.nextLine());List<String> strings new ArrayLi…

系統學習·PHP語言

由于之前沒系統的學習PHP語言&#xff0c;都是在做題時遇到不會的才去查&#xff0c;后來發現這樣的效率非常低&#xff0c;審代碼別人一眼掃出漏洞&#xff0c;而我還需要去查一下這行代碼的意思&#xff0c;那個函數的作用&#xff0c;查當然要查&#xff0c;但連簡單的語法都…

leetcode2-兩數相加

leetcode 2 思路 鏈表特性利用&#xff1a;由于數字按逆序存儲&#xff0c;個位在鏈表頭部&#xff0c;因此可以直接從前往后遍歷鏈表進行逐位相加 比如題目中的 2->4->3 和 5->6->4 其實可以直接按位從第一位開始往后相加&#xff0c;就得到啦708 這樣比把數字…

Java的Arrays.sort():排序算法與優化分析

文章目錄 前言一、基本類型數組&#xff1a;雙軸快速排序關鍵優化策略 二、對象數組&#xff1a;TimSort關鍵優化策略 三、性能對比總結總結 前言 在Java中&#xff0c;Arrays.sort()是開發者最常用的排序方法之一。但你是否思考過它的底層實現&#xff1f;本文將基于OpenJDK …

軟件測試質量的“防”與“治”

引言: 想象一下,你正在建造一座摩天大樓。你是愿意在打地基時就嚴格檢查材料規格和設計圖紙(主動防患),還是等到大樓封頂后才開始拿著錘子敲敲打打找裂縫(被動補救)?軟件世界亦是如此!今天,我們就來聊聊軟件測試這個“質量守護神”的兩大戰略思維和三大實戰招式,讓你…

TDengine 如何從 2.x 遷移到 3.0

本節講述如何通過 Explorer 界面創建數據遷移任務&#xff0c;從舊版 TDengine2 遷移數據到 TDengine 3.0 集群。 功能概述 taosX 通過 SQL 查詢源集群數據&#xff0c;并把查詢結果寫入到目標數據庫。具體實現上&#xff0c;taosX 以一個子表的一個時間段的數據作為查詢的基…

免下載蘋果 IPA 文件重簽名工具:快速更換應用名稱和 BID的教程

在iOS設備的使用和開發過程中&#xff0c;我們有時需要對IPA文件進行重簽名&#xff0c;以便更換應用名稱、Bundle ID&#xff08;軟件包標識符&#xff09;或其他相關信息。這一過程通常需要使用到特定的工具&#xff0c;然而&#xff0c;市面上的一些工具可能需要下載和安裝&…

Python全棧開發:前后端分離項目架構詳解

文章目錄 技術棧選擇后端技術棧前端技術棧 項目整體結構詳細目錄結構說明后端架構&#xff08;backend/&#xff09;1. 應用核心&#xff08;app/&#xff09;2. 數據層&#xff08;models/&#xff09;3. API模式層&#xff08;schemas/&#xff09;4. API路由層&#xff08;a…

微信小程序使用圖片實現紅包雨功能

微信小程序紅包雨功能實現&#xff1a;從組件封裝到頁面調用的完整實踐 先看示例截圖&#xff1a; 一、背景與技術選型 在微信小程序營銷活動中&#xff0c;紅包雨是一種極具吸引力的互動形式。實現紅包雨效果主要有 Canvas 和圖片兩種方案&#xff1a; &#xff08;1&…

Python day31

浙大疏錦行 數據拆分的基本框架&#xff0c;拆分后讓項目結構更加清晰

Chapter10-XXE

文章目錄 1.XXE介紹1.1 XXE產生的原因1.1.1 什么是XML&#xff1f;1.1.2 什么是XML實體1.1.3 什么是文檔類型定義&#xff08;document type definition&#xff09;1.1.4 什么是XML自定義實體1.1.5 什么是XML外部實體 2.XXE攻擊類型2.1 利用XXE檢索文件2.2 利用XXE執行SSRF攻擊…

Ribbon負載均衡實戰指南:7種策略選擇與生產避坑

引言&#xff1a;客戶端負載均衡的不可替代性 當面試官問你&#xff1a;“Ribbon 和 Nginx 有什么區別&#xff1f;”——Ribbon 是進程內 LB 這一句話值 20K 月薪。 作為微服務調用的核心樞紐&#xff0c;Ribbon 通過 ??本地服務清單動態分發請求??&#xff0c;避免中心化…

Webpack:現代前端構建工具的核心解析

Hi&#xff0c;我是布蘭妮甜 &#xff01;在前端工程化日益重要的今天&#xff0c;Webpack作為主流構建工具&#xff0c;已成為現代前端開發的核心基礎設施。它通過模塊化打包機制&#xff0c;優雅地解決了復雜應用中的資源管理問題&#xff0c;使開發者能夠專注于業務邏輯的實…

Elasticsearch索引wildcard查詢

在之前的文章 Elasticsearch索引的字段映射 中介紹過關于索引中字段查詢的多種方式。可以根據需要通過設置索引字段的type以及fields來實現分詞,精確匹配等多種方式的查詢。 elasticSearch中檢索核心類型大概可以分為:精準匹配檢索(Term-level queries)和基于分詞的全文匹…