目录

1. 指令的概念

1.1 内容渲染指令

1.1.1v-text

1.1.2{{ }} 语法

1.1.3 v-html

1.2 属性绑定指令

属性绑定指令的简写形式

使用 Javascript 表达式

1.3 事件绑定指令

事件绑定的简写形式

事件参数对象

绑定事件并传参

$event

事件修饰符

按键修饰符

1.4 双向绑定指令

v-model 指令的修饰符

1.5 条件渲染指令

v-if 和 v-show 的区别

v-else

v-else-if

1.6 列表渲染指令

v-for 中的索引

使用 key 维护列表的状态

key 的注意事项

2. 过滤器(Vue3中已删除这个语法,只能在Vue2项目中使用)

过滤器的基本使用:

2.1 定义过滤器 

2.2 私有过滤器和全局过滤器

2.3 连续调用多个过滤器

2.4 过滤器传参

2.5 过滤器的兼容性

3.  品牌列表案例

3.1. 案例效果​编辑

3.2. 整体实现步骤

3.3. 整体代码:

HTML部分:

引用部分lib: 

 CSS部分:

总结:


 

1. 指令的概念

指令(Directives) vue 为开发者提供的模板语开发页面基本

vue 中的指令按照不同的用分为 6 大类:

①  内容渲指令

②  属性绑定指令

③  事件绑定指令

④  双向绑定指令

⑤  条件渲染指令

⑥  列表渲指令

注意:指令vue 开发中最基础、最常、最单的

1.1 内容渲染指令

内容渲染指令用来辅开发渲染 DOM 元素的文本内容用的容渲有如下 3 个:

1、v-text 2、{{ }} 3、v-html

1.1.1v-text

用法示例:

 注意:v-text 指令会覆盖元素内认的

1.1.2{{ }} 语法

vue 提供的 {{ }} 语法,专门用来解v-text 会覆盖本内的问 {{ }} 语法的专业名称是达 式(英文名为Mustache)。

注意:相对v-text 指令来说插值表达发中常用因为不会素中认的容。

1.1.3 v-html

v-text 指令和插值表达式纯文 HTML 标签的字符串渲染为HTML 元素,  则需要用v-html 这个指令:

最终渲染的结果为:

1.2 属性绑定指令

如果需要为元素的属动态则需v-bind 属性绑定指令。用法例如下:

属性绑定指令的简写形式

v-bind 指令在开发中使用频高,,vue 官方为其提供了简写 : )。

使用 Javascript 表达式

vue 提供的模板渲染语法,除绑定单的之外支持 Javascript 表达式的运算,例如:

1.3 事件绑定指令

vue 提供v-on 事件绑定指令,用辅助序员为 DOM 元素绑定事件监听语法式如下:

注意:原生 DOM 对象onclickoninputonkeyup 等原生替换vue 的事件绑定形式后,

分别为v-on:clickv-on:inputv-on:keyup

v-on 绑定的事件处理函数methods 节点中进行声明:

事件绑定的简写形式

v-on 指令在开发中使用频高,,vue 官方为其提供了简写 @ )。

事件参数对象

在原生的 DOM 事件绑定中,可以在理函的形接收件参对象 event理,v-on 指令

(简写@ )所绑定的事件处理数中同样收到件参event例代码如下:

绑定事件并传参

在使v-on 指令绑定事件时,使 ( ) 进行传参,示例代码如下:

$event

$event vue 提供的特殊变,用来生的件参event$event 可以解决事件参数对event

被覆盖的问题。示例法如下:

事件修饰符

在事件处理函数中调event.preventDefault() event.stopPropagation() 是非常常见的需求。因

vue 提供了事件修饰符的概辅助序员便件的行控。常 5 个事件修饰符如下:

事件修饰符

说明

.prevent

阻止默认行(例如:阻 a 连接的跳转、阻止表单的提交等)

.stop

阻止事件冒泡

.capture

以捕获模式触发当前的事件处理函数

.once

绑定的事件只触发1

.self

只有 event.target 是当前元素自身时触发事件处理函数

 语法格式如下:

按键修饰符

在监听键盘事件时,们经判断细的此时可以相关键修,例如:

1.4 双向绑定指令

vue 提供v-model 双向数据绑操作 DOM 的前提下,快速获取单的

v-model 指令的修饰符

为了方便对用户输入内容,vue v-model 指令提供了 3 个修饰符,分别是:

修饰符

作用

示例

.number

自动将用户的输入值转为数值类型

<input v-model.number="age" />

.trim

自动过滤用户输入的首尾空白字符

<input v-model.trim="msg" />

.lazy

“change”时而非“input”时更新

<input v-model.lazy="msg" />

 示例用法如下:

1.5 条件渲染指令

条件渲染指令用来辅开发控制 DOM 的显示与隐藏。条件染指下两,分是:

v-if v-show

示例用法如下:

v-if v-show 的区别

实现原理不同:

v-if 指令会 动态地创建或移除 DOM 元素 ,从而控制元 在页 显示 隐藏; v-show 指令会动态为元素 移除 style="display: none;" 样式 ,从而控制元 的显 与隐

性能消耗不同:

v-if 有更高的切换开销v-show 有更高的初始渲染开销

如果需要 非常频繁地 使 v-show 较好 如果在 使 v-if 较好

v-else

v-if 可以单独使用,或配v-else 指令一起使用:

注意:v-else 指令必须配v-if 指令一起使用,否不会识别!

v-else-if

v-else-if 指令,顾名思义,v-if “else-if 块”,可以连续使用:

注意:v-else-if 指令必须配v-if 指令一起使用,否则会被别! 

1.6 列表渲染指令

vue 提供v-for 列表渲染指令,用辅助基于个数环渲一个v-for 指令需要使 用 item in items 形式的特殊语法,其

items 待循环的数组 item 被循环的每一项

v-for 中的索引

v-for 指令还支持一个可选参数语法(item, index) in items示例代码如下:

注意:v-for 指令中的 item index 索引都是形参,可根据要进(user, i) in userlist

使用 key 维护列表的状态

列表的数据变化默认,vue 尽可能的复用已存在的 DOM 元素,从而提升渲这种 默认的性能优化策略会导态的表无确更

为了vue 一个提示,以便它能跟节点身份有状表被确更提下提升渲 染的性能key 属性

key 的注意事项

①  key 的值只能字符串类型

②  key 的值必须具有唯一性:key 的值不能重复)

③  建议把数据项 id 属性的值key 的值(因为 id 属性的值具有唯一性)

④  使 index 的值 key 的值没有任何意(因为 index 的值不具有唯一性)

⑤  建议使v-for 指令时一定要指key 的值(既提升性能、防止表状

2. 过滤器(Vue3中已删除这个语法,只能在Vue2项目中使用)

过滤器Filters vue 为开发者提供的功能,文本格式滤器以用地方插值达式 v-bind 属性绑定

过滤器应该被添加在 JavaScript 表达式的尾部,由“道符调用示例码如下:

过滤器的基本使用:

<body>
  <div id="app">
    <p>message 的值是:{{ message | capi }}</p>
  </div>

  <script src="./lib/vue-2.6.12.js"></script>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        message: 'hello vue.js'
      },
      // 过滤器函数,必须被定义到 filters 节点之下
      // 过滤器本质上是函数
      filters: {
        // 注意:过滤器函数形参中的 val,永远都是“管道符”前面的那个值
        capi(val) {
          // 字符串有 charAt 方法,这个方法接收索引值,表示从字符串中把索引对应的字符,获取出来
          // val.charAt(0)
          const first = val.charAt(0).toUpperCase()
          // 字符串的 slice 方法,可以截取字符串,从指定索引往后截取
          const other = val.slice(1)
          // 强调:过滤器中,一定要有一个返回值
          return first + other
        }
      }
    })
  </script>
</body>

过滤器的注意点

1. 要定义到 filters 节点下,本质是一个函数
2. 在过滤器函数中,一定要有 return 值
3. 在过滤器的形参(val)中,可以获取到“管道符”前面待处理的那个值
4. 如果全局过滤器和私有过滤器名字一致,此时按照“就近原则”,调用的是”私有过滤器“

2.1 定义过滤器 

在创vue 实例期间,可以filters 节点中定义过滤器,示代码如下:

2.2 私有过滤全局过滤器

filters 节点下定义的过滤,称有过”,vm 实例所控制el 区域内使用。 如果希望在多vue 实例之间共享过滤,则以按的格:(全局过滤器要放在Vue实例化代码前面,不然会报错)

2.3 连续调用多个过滤器

过滤器可以串联地调用例如:

示例代码如下: 

2.4 过滤器传参

过滤器的本质 JavaScript 函数,因此可以接参数格式如下:

示例代码如下: 

2.5 过滤器的兼容性

过滤器仅vue 2.x 1.x 中受支持,vue 3.x 的版本中剔除了过的功。 在企业级项目开发中:

如果使用的 2.x 版本 vue, 则依然可以使 过滤 相关 功能 如果项目已经升级到了 3.x 版本 vue, 官方建议使 计算 方法 替被 过滤 功能

具体的迁移指南,请vue 3.x 的官方文档给出的明:

https://v3.vuejs/guide/migration/filters.html#migration-strategy

https://v3.vuejs/guide/migration/filters.html#migration-strategyhttps://v3.vuejs/guide/migration/filters.html#migration-strategy

3.  品牌列表案例

3.1. 案例效果

3.2. 整体实现步骤

①  创建基本vue 实例

②  基于 vue 渲染表格数据

③  实现添加品的功能

④  实现删除品的功能

⑤  实现修改品牌状

3.3. 整体代码:

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>品牌列表案例</title>
  <link rel="stylesheet" href="./lib/bootstrap.css">
  <link rel="stylesheet" href="./css/brandlist.css">
</head>

<body>

  <div id="app">
    <!-- 卡片区域 -->
    <div class="card">
      <div class="card-header">
        添加品牌
      </div>
      <div class="card-body">
        <!-- 添加品牌的表单区域 -->
        <!-- form 表单元素有 submit 事件 -->
        <form @submit.prevent="add">
          <div class="form-row align-items-center">
            <div class="col-auto">
              <div class="input-group mb-2">
                <div class="input-group-prepend">
                  <div class="input-group-text">品牌名称</div>
                </div>
                <input type="text" class="form-control" placeholder="请输入品牌名称" v-model.trim="brand">
              </div>
            </div>
            <div class="col-auto">
              <button type="submit" class="btn btn-primary mb-2">添加</button>
            </div>
          </div>
        </form>
      </div>
    </div>

    <!-- 表格区域 -->
    <table class="table table-bordered table-hover table-striped">
      <thead>
        <tr>
          <th scope="col">#</th>
          <th scope="col">品牌名称</th>
          <th scope="col">状态</th>
          <th scope="col">创建时间</th>
          <th scope="col">操作</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in list" :key="item.id">
          <td>{{ item.id }}</td>
          <td>{{ item.name }}</td>
          <td>
            <div class="custom-control custom-switch">
              <!-- 使用 v-model 实现双向数据绑定 -->
              <input type="checkbox" class="custom-control-input" :id="'cb' + item.id" v-model="item.status">
              <!-- 使用 v-if 结合 v-else 实现按需渲染 -->
              <label class="custom-control-label" :for="'cb' + item.id" v-if="item.status">已启用</label>
              <label class="custom-control-label" :for="'cb' + item.id" v-else>已禁用</label>
            </div>
          </td>
          <td>{{ item.time }}</td>
          <td>
            <a href="javascript:;" @click="remove(item.id)">删除</a>
          </td>
        </tr>
      </tbody>
    </table>
  </div>

  <script src="./lib/vue-2.6.12.js"></script>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        // 用户输入的品牌名称
        brand: '',
        // nextId 是下一个,可用的 id
        nextId: 4,
        // 品牌的列表数据
        list: [
          { id: 1, name: '宝马', status: true, time: new Date() },
          { id: 2, name: '奔驰', status: false, time: new Date() },
          { id: 3, name: '奥迪', status: true, time: new Date() },
        ],
      },
      methods: {
        // 点击链接,删除对应的品牌信息
        remove(id) {
          this.list = this.list.filter(item => item.id !== id)
        },
        // 阻止表单的默认提交行为之后,触发 add 方法
        add() {
          // 如果判断到 brand 的值为空字符串,则 return 出去
          if (this.brand === '') return alert('必须填写品牌名称!')

          // 如果没有被 return 出去,应该执行添加的逻辑
          // 1. 先把要添加的品牌对象,整理出来
          const obj = {
            id: this.nextId,
            name: this.brand,
            status: true,
            time: new Date()
          }
          // 2. 往 this.list 数组中 push 步骤 1 中得到的对象
          this.list.push(obj)
          // 3. 清空 this.brand;让 this.nextId 自增 +1
          this.brand = ''
          this.nextId++
        }
      },
    })
  </script>
</body>

</html>

引用部分lib: 

 CSS部分:

body {
  padding: 15px;
  user-select: none;
}

总结:

更多推荐

vue 的指令与过滤器