Vue@2.X --- 指令

151 阅读6分钟

写在前面

这里只记录常用指令,其它指令可移步vue2指令官方文档

Vue.js 讲究数据驱动,也就是说单向( data => view )数据绑定 (数据源发生变化,页面自动更新)

开发Vue.js的程序,我们必须摒弃以往的DOM操作的思想(DOM操作 => 数据驱动)

其中我们在Vue中,也可以通过 数据操作 + 指令语法 或 插槽语法 实现类似DOM操作

什么是Vue指令

指令是可以写在DOM元素的小命令,他们以v-为前缀,vue就能识别这是一个指令并保持语法的一致性。如果你需要对HTML进行底层操作的话,这种方式是非常有用的。

如果你已经用过vue或者angular的话,对于v-if,v-else,v-show等指令就会比较熟悉了,但是我还是要介绍一些基础的知识

  • 解释:指令 (Directives) 是带有 v- 前缀的特殊属性
  • 作用:当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM

常用指令

下面我将指令分为四类:

  • v-指令名
    • v-once 控制对应标签只初始化渲染一次 后面数据变化,标签不更新以节约性能
    • 条件渲染:
      • v-else 中间不允许中间有其它标签断开
      • v-for 列表循环渲染
  • 指令名 = 表达式
    • v-show 以css中的display:none/block 为原理实现元素的显示与隐藏
    • v-if 以生成/移除该元素节点达到控制节点显示与隐藏的效果
    • v-else-if 条件语句或者因为...
    • v-for 循环渲染节点 v-for="(元素,索引) in 数据源" 数据源:可迭代数据 (array,string,set,map)数字
  • 指令名:参数 = 表达式
    • v-bind:参数 = 表达式 给标签属性(标准的 + 自定义)绑定一个值 由于使用频率高 可以简写为:
  • 指令名:参数.修饰符 = 表达式
    • v-on:事件名.修饰符?='表达式/函数' 绑定函数时不使用() 那么回调函数的第一个参数就是event 如果使用了() 那么你需要显示的传入的$event为对应的事件对象

表现形式:

v-text

  • 解释:更新元素的 textContent
<h1 v-text="msg"></h1>复制代码

v-html

  • 解释:更新元素的 innerHTML
<h1 v-html="msg"></h1>复制代码

v-bind

  • 作用:当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM
  • 语法:v-bind:title="msg"
  • 简写::title="msg"
<!-- 完整语法 -->
<a v-bind:href="url"></a>
<!-- 缩写 -->
<a :href="url"></a>
<script>
    // 2 创建 Vue 的实例对象
    var vm = new Vue({
      // el 用来指定vue挂载到页面中的元素,值是:选择器
      // 理解:用来指定vue管理的HTML区域
      el: '#app',
      // 数据对象,用来给视图中提供数据的
      data: {
        url: 'http://www.baidu.com'
      }
    })
  </script>复制代码

v-on

  • 作用:绑定事件
  • 语法:v-on:click="say" or v-on:click="say('参数', $event)"
  • 简写:@click="say"
  • 说明:绑定的事件从methods中获取
<!-- 完整语法 -->
<a v-on:click="doSomething"></a>
<!-- 缩写 -->
<a @click="doSomething"></a>
<!-- 方法传参 -->
<a @click="doSomething(“123”)"></a>

 <script>
    // 2 创建 Vue 的实例对象
    var vm = new Vue({
      el: '#app',
      // methods属性用来给vue实例提供方法(事件)
      methods: {
        doSomething: function(str) {
          //接受参数,并输出
          console.log(str);
        }
      }
    })
  </script>复制代码

事件修饰符

  • .stop 阻止冒泡,调用 event.stopPropagation()
  • .prevent 阻止默认事件,调用 event.preventDefault()
  • .capture 添加事件侦听器时使用事件捕获模式
  • .self 只当事件在该元素本身(比如不是子元素)触发时触发回调
  • .once 事件只触发一次

v-model

  • 作用:在表单元素上创建双向数据绑定
  • 说明:监听用户的输入事件以更新数据
<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>复制代码

v-for

  • 作用:基于源数据多次渲染元素或模板块
<!-- 1 基础用法 -->
<div v-for="item in items">
  {{ item.text }}
</div>

<!-- item 为当前项,index 为索引 -->
<p v-for="(item, index) in list">{{item}} -- {{index}}</p>
<!-- item 为值,key 为键,index 为索引 -->
<p v-for="(item, key, index) in obj">{{item}} -- {{key}}</p>
<p v-for="item in 10">{{item}}</p>复制代码

key属性

  • 推荐:使用 v-for 的时候提供 key 属性,以获得性能提升。
  • 说明:使用 key,VUE会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。
<div v-for="item in items" :key="item.id">
  <!-- 内容 -->
</div>复制代码

样式处理 -class和style

  • 说明:这两个都是HTML元素的属性,使用v-bind,只需要通过表达式计算出字符串结果即可
  • 表达式的类型:字符串、数组、对象
  • 语法:
<!-- 1 -->
<div v-bind:class="{ active: true }"></div> ===>
<div class="active"></div>

<!-- 2 -->
<div :class="['active', 'text-danger']"></div> ===>
<div class="active text-danger"></div>

<!-- 3 -->
<div v-bind:class="[{ active: true }, errorClass]"></div> ===>
<div class="active text-danger"></div>


--- style ---
<!-- 1 -->
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
<!-- 2 将多个 样式对象 应用到一个元素上-->
<div v-bind:style="[baseStyles, overridingStyles]"></div>复制代码

v-if 和 v-show

  • 条件渲染
  • v-if:根据表达式的值的真假条件,销毁或重建元素
  • v-show:根据表达式之真假值,切换元素的 display CSS 属性

提升用户体验:v-cloak

  • 这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。
  • 防止刷新页面,网速慢的情况下出现{{ message }}等数据格式
<div v-cloak>
  {{ message }}
</div>复制代码

提升性能:v-pre

  • 说明:跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签。跳过大量没有指令的节点会加快编译。
<span v-pre>{{ this will not be compiled }}</span>复制代码

提升性能:v-once

  • 说明:只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。
<span v-once>This will never change: {{msg}}</span>

链接:juejin.cn/post/684490…

关于指令的面试题 :

v-if和v-show的区别

--初始化渲染开销和切换开销

  1. 控制手段不同。v-show是通过给元素添加 css 属性display: none,但元素仍然存在;而v-if控制元素显示或隐藏是将元素整个添加或删除。
  2. 编译过程不同。v-if切换有一个局部编译/卸载的过程,切换过程中合适的销毁和重建内部的事件监听和子组件;v-show只是简单的基于 css 切换。
  3. 编译条件不同。v-if是真正的条件渲染,它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建,渲染条件为假时,并不做操作,直到为真才渲染。
  4. 触发生命周期不同。v-show由 false 变为 true 的时候不会触发组件的生命周期;v-if由 false 变为 true 的时候,触发组件的beforeCreatecreatedbeforeMountmounted钩子,由 true 变为 false 的时候触发组件的beforeDestorydestoryed钩子。
  5. 性能消耗不同。v-if有更高的切换消耗;v-show有更高的初始渲染消耗。

使用场景:
如果需要非常频繁地切换,则使用v-show较好,如:手风琴菜单,tab 页签等; 如果在运行时条件很少改变,则使用v-if较好,如:用户登录之后,根据权限不同来显示不同的内容。

v-if 和 v-for 为什么不建议放在一起使用?

Vue 2 中,v-for的优先级比v-if高,这意味着v-if将分别重复运行于每一个v-for循环中。如果要遍历的数组很大,而真正要展示的数据很少时,将造成很大的性能浪费。

Vue 3 中,则完全相反,v-if的优先级高于v-for,所以v-if执行时,它调用的变量还不存在,会导致异常。

通常有两种情况导致要这样做:

  • 为了过滤列表中的项目,比如:v-for = "user in users" v-if = "user.active"。这种情况,可以定义一个计算属性,让其返回过滤后的列表即可。
  • 为了避免渲染本该被隐藏的列表,比如v-for = "user in users" v-if = "showUsersFlag"。这种情况,可以将v-if移至容器元素上或在外面包一层template即可。

最后

分享好文 点我看看