从0开始了解16个Vue内置指令

160 阅读7分钟

在前端基础面试中,Vue的指令算是一个高频面试题

面试官问:Vue有哪些指令
你就告诉他:截止到Vue3.2,Vue一共有16个自带指令
v-text、v-html、v-show、v-if、v-else、v-else-if、v-for、v-on、v-bind、v-model、v-slot、v-pre、v-cloak、v-once、v-memo、v-is,其中v-memo是3.2新增的,v-is在3.1.0中废弃

首先来说什么是Vue指令

在表现形式上,就是带有v-前缀的属性。v-属性名=‘具体表达式’。当表达式对应的值发生变化后,将响应式的作用于Dom,从而影响视图层。更为具体的说,指令结合属性作为暗号,框架会根据按照对应的不同的值来进行Dom操作的绑定。

1、v-text

更新元素的文本内容。

<h1 v-text="msg"></h1>

msg被定义在数据属性中,指明了具体的值。将具体的值展示在视图层,对应javascript中的innerText属性。同时,其作用又与模板语法 {{具体的数据属性名}} 类似。因此一般较为少用

2、v-html

与v-text很像 指明了具体的html内容。对应javascript中的innerHtml属性

<div v-html="msg"></div> 
<div v-html="'<h3>hello Vue</h3>'"></div>

第二个需要注意的是,里头内容必须是按普通 HTML 插入

3、v-show

v-showv-if的能够一样都是条件渲染, 取值为true就显示, 取值为false就不显示

v-if和v-show区别
v-if: 只要取值为false就不会创建元素
v-show: 哪怕取值为false也会创建元素, 只是如果取值是false会设置元素的displaynone

4、v-if

基于表达式值的真假性,来条件性地渲染元素或者模板片段
当 v-if 元素被触发,元素及其所包含的指令/组件都会销毁和重构。如果初始条件是假,那么其内部的内容根本都不会被渲染

    <template>
       <div class="about">
         <div v-if="ok">111</div>
       </div>
    </template>

    <script>
    export default {
        data() {
         return {
           ok: true,
         };
        }
       };
    </script>

v-if注意点

v-if可以从模型中获取数据
v-if也可以直接赋值一个表达式

当同时使用v-if、v-for时,v-if 比 v-for 优先级更高,并不推荐在一元素上同时使用这两个指令

5、v-else

前提是上一个兄弟元素必须有 v-if 或 v-else-if
v-else指令可以和v-if指令配合使用, 当v-if不满足条件时就执行v-else就显示v-else中的内容

    <template>
        <div class="about">
          <div v-if="ok">111</div>
          <div v-else>222</div>
        </div>
    </template>

    <script>

    export default {
      data() {
        return {
         ok: false,
        };
      }
     };
    </script>
6、v--else-if

v-else-if可以和 v-if指令配合使用, 当v-if不满足条件时就依次执行后续v-else-if, 哪个满足就显示哪个
v-else-if注意点
和 v-else一样,v-else-if不能单独出现
v-ifv-else-if中间不能出现其它内容

7、v-for

相当于JS中的for in循环, 可以根据数据多次渲染元素

    <template>
      <div class="about">
       <div v-for="(val,index) in items" :key="index">{{ val.title }}</div>
      </div>
    </template>

    <script>
    export default {

     data() {
      return {
        items:[
            {id:1,title:'小学'},
            {id:2,title:'中学'},
            {id:3,title:'高中'},
            {id:4,title:'大学'},
        ]
      };
     }
    };
    </script>

v-for特点
可以遍历 数组, 字符, 数字, 对象

8、v-on

v-on指令专门用于给元素绑定监听事件,可以缩写为:@

    <!-- 方法处理函数 -->
    <button v-on:click="doThis"></button>
    <!-- 缩写的方法处理函数 -->
    <button @click="doThis"></button>

v-on注意点:
v-on绑定的事件被触发之后, 会去Vue实例对象的methods中查找对应的回调函数

修饰符:

  • .stop - 调用 event.stopPropagation()
  • .prevent - 调用 event.preventDefault()
  • .capture - 在捕获模式添加事件监听器。
  • .self - 只有事件从元素本身发出才触发处理函数。
  • .{keyAlias} - 只在某些按键下触发处理函数。
  • .once - 最多触发一次处理函数。
  • .left - 只在鼠标左键事件触发处理函数。
  • .right - 只在鼠标右键事件触发处理函数。
  • .middle - 只在鼠标中键事件触发处理函数。
  • .passive - 通过 { passive: true } 附加一个 DOM 事件
9、v-bind

v-bind用于绑定数据和元素属性,可以缩写为: 或.(当使用 .prop 修饰符时)
动态的绑定一个或多个 attribute,也可以是组件的 prop
修饰符:

  • .camel - 将短横线命名的 attribute 转变为驼峰式命名。
  • .prop - 强制绑定为 DOM property。
  • .attr - 强制绑定为 DOM attribute

修饰符:

当用于绑定 `class` 或 `style` attribute,`v-bind` 支持额外的值类型如数组或对象。详见下方的指南链接。

在处理绑定时,Vue 默认会利用 `in` 操作符来检查该元素上是否定义了和绑定的 key 同名的 DOM  
property。如果存在同名的 property,则 Vue 会把作为 DOM property 赋值,而不是作为  attribute 设置。这个行为在大多数情况都符合期望的绑定值类型,但是你也可以显式
用 `.prop` 和 `.attr` 修饰符来强制绑定方式。有时这是必要的,特别是在和[自定义元素]  
(https://cn.vuejs.org/guide/extras/web-components.html#passing-dom-properties)打交道时。

当用于组件 props 绑定时,所绑定的 props 必须在子组件中已被正确声明。

当不带参数使用时,可以用于绑定一个包含了多个 attribute 名称-绑定值对的对象。
10、v-model

在表单输入元素或组件上创建双向绑定

  • 仅限:

    • <input>
    • <select>
    • <textarea>
    • components
  • 修饰符:

    • .lazy - 监听 change 事件而不是 input
    • .number - 将输入的合法字符串转为数字
    • .trim - 移除输入内容两端空格

在前端处理表单时,我们常常需要将表单输入框的内容同步给 JavaScript 中相应的变量。手动连接值绑定和更改事件监听器可能会很麻烦

    <input :value="text" @input="(event) => (text = event.target.value)" />

v-model 指令帮我们简化了这一步骤

    <input v-model="text">
11、v-slot

用于声明具名插槽或是期望接收 props 的作用域插槽 ,可以缩写为: #

  • 参数:插槽名 (可选,默认是 default)

举例来说,这里有一个 <FancyButton> 组件,可以像这样使用:

    <FancyButton> Click me! <!-- 插槽内容 --> </FancyButton>

而 <FancyButton> 的模板是这样的:

    <button class="fancy-btn"> <slot></slot> <!-- 插槽出口 --> </button>

<slot> 元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。

QQ截图20230519100803.png 最终渲染出的 DOM 是这样:

    <button class="fancy-btn">Click me!</button>
12、v-pre

跳过该元素及其所有子元素的编译
元素内具有 v-pre,所有 Vue 模板语法都会被保留并按原样渲染。最常见的用例就是显示原始双大括号标签及内容

    <span v-pre>{{ this will not be compiled }}</span>

结果如图,可以看出span标签里面的内容并没有被编译

QQ截图20230519101540.png

13、v-cloak

v-cloak原理是先通过样式隐藏内容,然后在内存中进行值的替换,将替换的内容再反馈给界面,数据渲染完场之后,v-cloak 属性会被自动去除。

v-cloak的使用

  • 首先,在差值语法所在的标签处加上v-cloak指令
    <h3 v-cloak>{{ name }}</h3>
  • 然后,在css中设置v-cloak的属性为display为none
    <style type="text/css">
        [v-cloak]{ 
            display: none; 
        } 
    </style>
14、v-once

仅渲染元素和组件一次,并跳过之后的更新
在随后的重新渲染,元素/组件及其所有子项将被当作静态内容并跳过渲染。这可以用来优化更新时的性能。

  • 该指令后面不需要跟任何表达式(比如之前的v-for后面是由跟表达式的)
  • 该指令表示元素和组件(组件后面才会学习)只渲染一次,不会随着数据的改变而改变
    <!-- single element -->
    <span v-once>This will never change: {{ msg }}</span>
    <!-- the element have children -->
    <div v-once>
      <h1>comment</h1>
      <p>{{ msg }}</p>
    </div>
    <!-- component -->
    <my-component v-once :comment="msg"></my-component>
    <!-- `v-for` directive -->
    <ul>
      <li v-for="i in list" v-once>{{ i }}</li>
    </ul>
15、v-memo

官网对 v-memo 定义是这样的:

缓存一个模板的子树。在元素和组件上都可以使用。为了实现缓存,该指令需要传入一个固定长度的依赖值数组进行比较。如果数组里的每个值都与最后一次的渲染相同,那么整个子树的更新将被跳过

看起来有点绕,但实际上,很好理解。v-memo 所做的与我们现有的计算属性一样,只不过 v-memo 的对象是 DOM。

这个新指令将缓存它所控制的DOM部分,如果一个特定的值发生变化,只需运行更新并重新渲染。这些值是由我们自己手动设置。

16、v-is

已在 3.1.0 中废弃,改用:is

Vue3中,使用v-is指定组件。注意!!!v-is后是JavaScript字符串,双重引号!

注意:以下属于vue2中的语法!

vue中is的使用

在某些元素内部,有特定的包裹元素规范,不能包裹其他元素。比如ul内只能包含li,而不能使用自定义组件。也就是说,这样是不允许的:

    <!-- 允许 -->
    <ul>
      <li></li>
    </ul>
    <!-- 不允许 -->
    <ul>
      <my-component></my-component>
    </ul>

为了能够复用自定义的组件,需要使用is来指定组件

    <ul> 
        <li is="my-component"></li>
    </ul>