Vue 事件修饰符最佳实践

 更新时间:2025年06月20日 10:55:28   作者:步行cgn  
事件修饰符是 Vue 中处理 DOM 事件细节的强大工具,下面我将通过一个交互式示例全面解析各种事件修饰符的用法和原理,感兴趣的朋友一起看看吧

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">
                        <div @click.stop="handleClick">...</div>
                    </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">
                        <form @submit.prevent="onSubmit">...</form>
                    </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">
                        <div @click.capture="handleCapture">...</div>
                    </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">
                        <div @click.self="handleSelf">...</div>
                    </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">
                        <button @click.once="handleOnce">...</button>
                    </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">
                        <div @scroll.passive="onScroll">...</div>
                    </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" rel="external nofollow"  rel="external nofollow"  @click="logEvent('普通链接')">普通链接</a>
                                <a href="https://vuejs.org" rel="external nofollow"  rel="external nofollow"  @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">
                    // 修饰符串联示例
                    <a @click.stop.prevent="handleLink">链接</a>
                    // 精确控制系统修饰符
                    <button @click.ctrl.exact="ctrlClick">Ctrl+点击</button>
                    // 自定义按键别名
                    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 事件修饰符详解

核心事件修饰符

  • .stop - 阻止事件冒泡

    • 等效于 event.stopPropagation()停止事件冒泡
    • 使用场景:阻止内部事件触发外部事件
  • .prevent - 阻止默认行为

    • 等效于 event.preventDefault()阻止事件的默认行为。
    • 使用场景:阻止表单提交、链接跳转等
  • .capture - 使用事件捕获模式

    • 事件从外到内处理(默认是冒泡模式,从内到外)
      • 添加事件监听器包括两种不同的方式:
        • 一种是从内到外添加(是事件冒泡模式)
        • 一种是从外到内添加(是事件捕获模式)
    • 使用场景:需要先处理父级再处理子级的事件
  • .self - 仅当事件源是元素自身时触发

    • 忽略子元素冒泡上来的事件
    • 使用场景:只在点击元素自身时触发,忽略内部元素事件
  • .once - 事件只触发一次

    • 触发后自动移除事件监听
    • 使用场景:一次性操作(如首次点击)
  • .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 - 中键点击

修饰符使用技巧

修饰符串联

<!-- 先停止冒泡,再阻止默认行为 -->
<a @click.stop.prevent="doThat"></a>

精确修饰符

<!-- 有且只有 Ctrl 被按下时才触发 -->
<button @click.ctrl.exact="onCtrlClick">Ctrl+Click</button>
<!-- 没有任何系统修饰符被按下时才触发 -->
<button @click.exact="onClick">Click</button>

自定义按键别名

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

最佳实践

  • 使用修饰符替代在方法中操作 DOM 事件
  • 注意修饰符的顺序(从左到右处理)
  • 移动端优先使用 .passive 提升滚动性能
  • 使用 .exact 精确控制系统修饰键组合
  • 避免过度使用 .once,确保用户理解操作是一次性的

到此这篇关于Vue 事件修饰符最佳实践的文章就介绍到这了,更多相关Vue 事件修饰符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue监听键盘事件的相关总结

    vue监听键盘事件的相关总结

    这篇文章主要介绍了vue监听键盘事件的相关总结,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2021-01-01
  • Vue3使用Vuex之mapState与mapGetters详解

    Vue3使用Vuex之mapState与mapGetters详解

    这篇文章主要为大家介绍了Vue3使用Vuex之mapState与mapGetters详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • vue3父组件和子组件如何传值实例详解

    vue3父组件和子组件如何传值实例详解

    近期学习vue3的父子组件之间的传值,发现跟vue2.x的父子组件之间的传值并没有太大的区别,下面这篇文章主要给大家介绍了关于vue3父组件和子组件如何传值的相关资料,需要的朋友可以参考下
    2022-08-08
  • Vue常用指令V-model用法

    Vue常用指令V-model用法

    本篇文章主要介绍了Vue常用指令_V-model用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法

    Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法

    下面小编就为大家分享一篇Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • vue中各种deep的区别解析

    vue中各种deep的区别解析

    在Vue3中,推荐使用::deep作为深度选择器,它比Vue2中的::v-deep语法更简洁,::v-deep、::deep、:deep()、&gt;&gt;&gt;和/deep/都是用于穿透组件作用域的选择器,但Vue3更倾向于使用::deep或:deep(),感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • vue中的$emit 与$on父子组件与兄弟组件的之间通信方式

    vue中的$emit 与$on父子组件与兄弟组件的之间通信方式

    本文主要对vue 用$emit 与 $on 来进行组件之间的数据传输。重点给大家介绍vue中的$emit 与$on父子组件与兄弟组件的之间通信方式,感兴趣的朋友一起看看
    2018-05-05
  • vue的路由守卫和keep-alive后生命周期详解

    vue的路由守卫和keep-alive后生命周期详解

    这篇文章主要为大家详细介绍了vue路由守卫和keep-alive,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Vue3+Vue-cli4项目中使用腾讯滑块验证码的方法

    Vue3+Vue-cli4项目中使用腾讯滑块验证码的方法

    这篇文章主要介绍了Vue3+Vue-cli4项目中使用腾讯滑块验证码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • 去除Element-Plus下拉菜单边框的实现步骤

    去除Element-Plus下拉菜单边框的实现步骤

    Element-Plus 是 Element UI 的 Vue 3 版本,它提供了一套完整的组件库,在使用 Element-Plus 进行开发时,我们可能会遇到需要自定义组件样式的情况,本文将介绍如何使用 CSS 来去除 Element-Plus 下拉框的边框,需要的朋友可以参考下
    2024-03-03

最新评论