Vue中的常用指令

概念

概念:指令(Directives)是 Vue 提供的带有 v- 前缀 的 特殊 标签属性

为啥要学:提高程序员操作 DOM 的效率。

vue 中的指令按照不同的用途可以分为如下 6 大类:

  • 内容渲染指令(v-html、v-text)
  • 条件渲染指令(v-show、v-if、v-else、v-else-if)
  • 事件绑定指令(v-on)
  • 属性绑定指令 (v-bind)
  • 双向绑定指令(v-model)
  • 列表渲染指令(v-for)

v-html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>

  <div id="app">
    <div v-html="msg"></div>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>

    const app = new Vue({
      el: '#app',
      data: {
        msg: `
          <h3>学前端~来黑马!</h3>
        `
      }
    })

  </script>

</body>
</html>

v-show、v-if

  1. v-show

    1. 作用: 控制元素显示隐藏
    2. 语法: v-show = “表达式” 表达式值为 true 显示, false 隐藏
    3. 原理: 切换 display:none 控制显示隐藏
    4. 场景:频繁切换显示隐藏的场景
  2. v-if

    1. 作用: 控制元素显示隐藏(条件渲染)
    2. 语法: v-if= “表达式” 表达式值 true显示, false 隐藏
    3. 原理: 基于条件判断,是否创建 或 移除元素节点
    4. 场景: 要么显示,要么隐藏,不频繁切换的场景
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 200px;
      height: 100px;
      line-height: 100px;
      margin: 10px;
      border: 3px solid #000;
      text-align: center;
      border-radius: 5px;
      box-shadow: 2px 2px 2px #ccc;
    }
  </style>
</head>
<body>

  <!-- 
    v-show底层原理:切换 css 的 display: none 来控制显示隐藏
    v-if  底层原理:根据 判断条件 控制元素的 创建 和 移除(条件渲染)
  -->

  <div id="app">
    <div v-show="flag" class="box">我是v-show控制的盒子</div>
    <div v-if="flag" class="box">我是v-if控制的盒子</div>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        flag: false
      }
    })
  </script>

</body>
</html>

v-else 和 v-else-if

  1. 作用:辅助v-if进行判断渲染
  2. 语法:v-else v-else-if=“表达式”
  3. 需要紧接着v-if使用
    在这里插入图片描述
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <div id="app">
    <p v-if="gender === 1">性别:♂ 男</p>
    <p v-else>性别:♀ 女</p>
    <hr>
    <p v-if="score >= 90">成绩评定A:奖励电脑一台</p>
    <p v-else-if="score >= 70">成绩评定B:奖励周末郊游</p>
    <p v-else-if="score >= 60">成绩评定C:奖励零食礼包</p>
    <p v-else>成绩评定D:惩罚一周不能玩手机</p>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>

    const app = new Vue({
      el: '#app',
      data: {
        gender: 2,
        score: 95
      }
    })
  </script>

</body>
</html>

v-on事件绑定指令

1.内联语句,使用Vue时,如需为DOM注册事件,及其的简单,语法如下:

  • <button v-on:事件名=“内联语句”>按钮
  • <button v-on:事件名=“处理函数”>按钮
  • <button v-on:事件名=“处理函数(实参)”>按钮
  • v-on: 简写为 @
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <button @click="count--">-</button>
    <span>{{ count }}</span>
    <button v-on:click="count++">+</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        count: 100
      }
    })
  </script>
</body>
</html>
  1. 事件处理函数

    注意:

    • 事件处理函数应该写到一个跟data同级的配置项(methods)中
    • methods中的函数内部的this都指向Vue实例
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <button @click="fn">切换显示隐藏</button>
    <h1 v-show="isShow">黑马程序员</h1>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app4 = new Vue({
      el: '#app',
      data: {
        isShow: true
      },
      methods: {
        fn () {
          // 让提供的所有methods中的函数,this都指向当前实例
          // console.log('执行了fn', app.isShow)
          // console.log(app3 === this)
          this.isShow = !this.isShow
        }
      }
    })
  </script>
</body>
</html>

3.给事件处理函数传参

  • 如果不传递任何参数,则方法无需加小括号;methods方法中可以直接使用 e 当做事件对象

  • 如果传递了参数,则实参 $event 表示事件对象,固定用法。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      border: 3px solid #000000;
      border-radius: 10px;
      padding: 20px;
      margin: 20px;
      width: 200px;
    }
    h3 {
      margin: 10px 0 20px 0;
    }
    p {
      margin: 20px;
    }
  </style>
</head>
<body>

  <div id="app">
    <div class="box">
      <h3>小黑自动售货机</h3>
      <button @click="buy(5)">可乐5元</button>
      <button @click="buy(10)">咖啡10元</button>
      <button @click="buy(8)">牛奶8元</button>
    </div>
    <p>银行卡余额:{{ money }}元</p>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        money: 100
      },
      methods: {
        buy (price) {
          this.money -= price
        }
      }
    })
  </script>
</body>
</html>

v-bind属性绑定指令

  1. **作用:**动态设置html的标签属性 比如:src、url、title
  2. 语法:**v-bind:**属性名=“表达式”
  3. **v-bind:**可以简写成 => :
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <!-- v-bind:src   =>   :src -->
    <img v-bind:src="imgUrl" v-bind:title="msg" alt="">
    <img :src="imgUrl" :title="msg" alt="">
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        imgUrl: './imgs/10-02.png',
        msg: 'hello 波仔'
      }
    })

  </script>
</body>
</html>

图片切换案例

小案例-波仔的学习之旅

需求:默认展示数组中的第一张图片,点击上一页下一页来回切换数组中的图片

实现思路:

1.数组存储图片路径 [‘url1’,‘url2’,‘url3’,…]

2.可以准备个下标index 去数组中取图片地址。

3.通过v-bind给src绑定当前的图片地址

4.点击上一页下一页只需要修改下标的值即可

5.当展示第一张的时候,上一页按钮应该隐藏。展示最后一张的时候,下一页按钮应该隐藏

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <button v-show="index > 0" @click="index--">上一页</button>
    <div>
      <img :src="list[index]" alt="">
    </div>
    <button v-show="index < list.length - 1" @click="index++">下一页</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        index: 0,
        list: [
          './imgs/11-00.gif',
          './imgs/11-01.gif',
          './imgs/11-02.gif',
          './imgs/11-03.gif',
          './imgs/11-04.png',
          './imgs/11-05.png',
        ]
      }
    })
  </script>
</body>
</html>

v-for

列表渲染指令

Vue 提供了 v-for 列表渲染指令,用来辅助开发者基于一个数组来循环渲染一个列表结构。

v-for 指令需要使用 (item, index) in arr 形式的特殊语法,其中:

  • item 是数组中的每一项
  • index 是每一项的索引,不需要可以省略
  • arr 是被遍历的数组

此语法也可以遍历对象和数字

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>

  <div id="app">
    <h3>小黑水果店</h3>
    <ul>
      <li v-for="(item, index) in list">
        {{ item }} - {{ index }}
      </li>
    </ul>

    <ul>
      <li v-for="item in list">
        {{ item }}
      </li>
    </ul>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        list: ['西瓜', '苹果', '鸭梨', '榴莲']
      }
    })
  </script>
</body>
</html>

小案例-小黑的书架

需求:

1.根据左侧数据渲染出右侧列表(v-for)

2.点击删除按钮时,应该把当前行从列表中删除(获取当前行的id,利用filter进行过滤)
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>

  <div id="app">
    <h3>小黑的书架</h3>
    <ul>
      <li v-for="(item, index) in booksList" :key="item.id">
        <span>{{ item.name }}</span>
        <span>{{ item.author }}</span>
        <!-- 注册点击事件 →  通过 id 进行删除数组中的 对应项 -->
        <button @click="del(item.id)">删除</button>
      </li>
    </ul>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        booksList: [
          { id: 1, name: '《红楼梦》', author: '曹雪芹' },
          { id: 2, name: '《西游记》', author: '吴承恩' },
          { id: 3, name: '《水浒传》', author: '施耐庵' },
          { id: 4, name: '《三国演义》', author: '罗贯中' }
        ]
      },
      methods: {
        del (id) {
          // console.log('删除', id)
          // 通过 id 进行删除数组中的 对应项 → filter(不会改变原数组)
          // filter: 根据条件,保留满足条件的对应项,得到一个新数组。
          // console.log(this.booksList.filter(item => item.id !== id))
          this.booksList = this.booksList.filter(item => item.id !== id)
        }
      }
    })
  </script>
</body>
</html>

v-for中的key

语法: key=“唯一值”

作用:给列表项添加的唯一标识。便于Vue进行列表项的正确排序复用

为什么加key: Vue 的默认行为会尝试原地修改元素(就地复用
注意:

  1. key 的值只能是字符串 或 数字类型
  2. key 的值必须具有唯一性
  3. 推荐使用 id 作为 key(唯一),不推荐使用 index 作为 key(会变化,不对应)

v-model 双向绑定指令

所谓双向绑定就是:

  1. 数据改变后,呈现的页面结果会更新
  2. 页面结果更新后,数据也会随之而变

作用:表单元素(input、radio、select)使用,双向绑定数据,可以快速 获取设置 表单元素内容

语法: v-model=“变量”

需求: 使用双向绑定实现以下需求

  1. 点击登录按钮获取表单中的内容
  2. 点击重置按钮清空表单中的内容
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>

  <div id="app">
    <!-- 
      v-model 可以让数据和视图,形成双向数据绑定
      (1) 数据变化,视图自动更新
      (2) 视图变化,数据自动更新
      可以快速[获取]或[设置]表单元素的内容
     -->
    账户:<input type="text" v-model="username"> <br><br>
    密码:<input type="password" v-model="password"> <br><br>
    <button @click="login">登录</button>
    <button @click="reset">重置</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        username: '',
        password: ''
      },
      methods: {
        login () {
          console.log(this.username, this.password)
        },
        reset () {
          this.username = ''
          this.password = ''
        }
      }
    })
  </script>
</body>
</html>
<think>好的,我现在需要回答用户关于Vue.js框架中常用指令及其用法的问题。首先,我要回忆一下Vue.js的核心指令有哪些,并确保自己对这些指令的理解是正确的。 首先,用户提到了常用指令,所以应该包括v-bind、v-model、v-on、v-for、v-if、v-show、v-html、v-text这些基本的。然后,我需要为每个指令提供一个简洁的解释,并给出示例代码,这样用户能更直观地理解。 接下来,根据系统级指令的要求,所有的行内数学表达式要用$...$,但这里的问题是关于Vue.js指令,可能不太涉及数学公式,不过需要注意是否有需要用到的地方。例如,在解释某些概念时,如果有变量或表达式,可能需要使用,但暂时看起来可能不需要。不过还是需要检查是否有遗漏。 独立公式需要单独成段,但同样,这个问题可能不涉及数学公式,所以可能用不上。接着要确保LaTeX语法正确,但这里可能不需要用到LaTeX,因为主要是代码示例。 用户要求用中文回答,所以要保持语言的中文。生成相关问题部分,需要根据内容提出几个相关问题,比如指令的区别、最佳实践、动态绑定等。 现在开始组织内容。首先介绍Vue.js指令系统,然后列出常用指令,每个指令用标题,比如“1. v-bind: 动态绑定属性”,然后解释用途,给出示例代码,并可能结合引用中的信息,比如引用[5]提到的渐进式设计,可以提到v-bind如何帮助逐步整合。 例如,v-model是双向数据绑定的,用于表单元素,可以结合引用[5]提到的视图层处理。v-for用于列表渲染,可能需要提到性能考虑,比如key的重要性,这里引用[5]提到的与其他库整合的可能。 然后,注意事项部分,比如避免v-if和v-for一起使用,key的重要性,v-html的安全问题。这些点需要准确,避免误导用户。 在生成相关问题的时候,要基于用户可能对指令的深入使用或常见问题,比如区别v-if和v-show,动态参数的使用,指令的最佳实践,如何自定义指令等。 检查引用中的内容,引用[5]提到了Vue的渐进式设计,可能可以联系到指令的使用如何简化开发。其他引用可能不太相关,但如果有合适的点可以引用,比如前端工具开发(引用[1])可能提到指令在构建工具中的应用,但可能不太直接相关,暂时可能不引用。 最后确保回答结构清晰,分点说明,每个指令有示例代码,代码用正确的格式,使用三个反引号包裹,并标明语言是html。同时,在注意事项部分,自然地添加引用标识,比如在提到渐进式设计时引用[5]。 现在需要确认是否有遗漏的指令,或者是否有过时的信息。比如,Vue 3是否有变化?但用户可能问的是常用指令,可能不涉及版本差异,除非特别指出。这里假设是Vue 2的常用指令,因为Vue 3的指令大部分保持一致。 总结,回答的结构应该是: 1. 引言 2. 常用指令分点说明,每个指令名称、用途、示例 3. 注意事项,结合引用 4. 相关问题 现在开始撰写正式回答,确保符合所有要求。</think>### Vue.js 常用指令及其使用方法 Vue.js 通过指令(Directives)扩展了 HTML 的功能,使开发者能够更高效地实现数据绑定、事件处理和动态渲染。以下是常用指令及其用法: --- #### 1. **`v-bind`: 动态绑定属性** - **用途**:将数据绑定到 HTML 元素的属性(如 `href`、`class`、`style`)。 - **示例**: ```html <a v-bind:href="url">链接</a> <!-- 简写 --> <a :href="url">链接</a> ``` - **动态参数**: ```html <div :[attributeName]="value"></div> ``` --- #### 2. **`v-model`: 双向数据绑定** - **用途**:在表单元素(如 `<input>`、`<select>`)上实现双向数据绑定。 - **示例**: ```html <input v-model="message" placeholder="输入内容"> <p>输入的内容是:{{ message }}</p> ``` - **修饰符**: - `.lazy`:监听 `change` 事件而非 `input`。 - `.trim`:自动去除首尾空格。 --- #### 3. **`v-on`: 事件监听** - **用途**:监听 DOM 事件(如点击、键盘输入)。 - **示例**: ```html <button v-on:click="handleClick">点击</button> <!-- 简写 --> <button @click="handleClick">点击</button> ``` - **事件修饰符**: - `.stop`:阻止事件冒泡。 - `.prevent`:阻止默认行为。 --- #### 4. **`v-for`: 列表渲染** - **用途**:基于数组或对象渲染列表。 - **示例**: ```html <ul> <li v-for="(item, index) in items" :key="item.id">{{ index }} - {{ item.name }}</li> </ul> ``` - **关键点**:必须为每项添加唯一 `key` 以优化渲染性能[^5]。 --- #### 5. **`v-if` / `v-else-if` / `v-else`: 条件渲染** - **用途**:根据条件动态渲染或销毁元素。 - **示例**: ```html <div v-if="score >= 90">优秀</div> <div v-else-if="score >= 60">及格</div> <div v-else>不及格</div> ``` --- #### 6. **`v-show`: 显示/隐藏元素** - **用途**:通过 CSS `display` 属性控制元素可见性。 - **示例**: ```html <div v-show="isVisible">显示内容</div> ``` --- #### 7. **`v-html`: 渲染原始 HTML** - **用途**:将字符串解析为 HTML(需注意 XSS 风险)。 - **示例**: ```html <div v-html="rawHtml"></div> ``` --- #### 8. **`v-text`: 绑定文本内容** - **用途**:等价于 `{{ }}`,但会覆盖元素内原有内容。 - **示例**: ```html <span v-text="message"></span> ``` --- ### **注意事项** 1. **避免 `v-if` 与 `v-for` 共用**:Vue 会优先执行 `v-for`,可能导致逻辑错误。 2. **`v-if` vs `v-show`**:`v-if` 是条件渲染(销毁元素),`v-show` 是切换显示(保留 DOM)。 3. **`v-html` 的安全性**:避免直接渲染用户输入的内容,防止 XSS 攻击。 4. **渐进式整合**:Vue指令系统支持逐步增强现有项目,例如通过 `v-bind` 动态绑定样式或类名[^5]。 --- §§ 相关问题 §§ 1. `v-if` 和 `v-show` 在性能上有何区别? 2. 如何在 Vue.js 中实现动态组件切换? 3. Vue 3 对指令语法有哪些改进? 4. 如何自定义 Vue 指令? 5. 为什么使用 `v-for` 时必须绑定 `key`?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值