Vue3全家桶 - Vue3 - 【4】侦听器

侦听器

一、 组合式API:

1.1 watch()函数

  • 创建侦听器:
    • 语法:
      // 先导入 watch 函数
      import { watch } from 'vue'
      watch(source, callback, options)
      
      • source
        • 需要侦听的数据源,可以是 ref(包括计算属性)、一个响应式对象、一个getter函数(获取对象属性的函数)、或多个数据源组成的数组
          • 🔺 注意
            • 第一个参数如果是 ref 声明的,不需要添加 .valuewatch会自动读取;
          • 和选项式API的区别:
            • 选项式API此处是个字符串;
            • 组合式API此处是个变量 / 数组 / 函数(要侦听的数据源);
      • callback
        • 回调函数;
        • 侦听单个数据源
          • 第一个参数 为 新值;
          • 第二个参数 为 旧值;
        • 侦听多个数据源组成的数组
          • 第一个参数数组新值
          • 第二个参数数组旧值
      • optinos
        • 配置项;
        • deep: true
          • 深度侦听,一般用在侦听的是getter函数返回的对象;
        • immediate: true
          • 创建好侦听器立即执行一遍;
        • flush: 'post'
          • 更改回调的执行机制(DOM更新后再执行);
  • 停止侦听器
    • 调用watch()返回的函数 即可 停止对该数据源的侦听
  • 总结
    • 侦听原始数据类型
      • 原始数据类型可以直接侦听;
      • 侦听的如果是对象的某个属性watch()的第一个参数必须是getter函数(一个箭头函数,返回值是要侦听的对象属性);
    • 侦听对象类型
      • 不开启深度侦听:
        • watch()第一个参数就是要侦听的数据,如果想改变某个属性值,可以触发回调,但是新旧值一样;
        • watch()第一个参数是个getter(),如果改变某个属性,默认情况下不会触发回调;
      • 开启深度侦听 + getter()
        • 对象的某个属性值改变,会触发回调,但是新旧值一样;
      • 🔺 watch()不管第一个参数是啥,对整个对象重新赋值,都是侦听不到的;
    • 侦听由多个响应式数据组成的数组
      • 数组里面有基本数据类型 / 对象的某个属性,可以触发回调,新旧值不一样;
      • 有对象,某个属性发生改变,新旧值一样;
  • 示例展示:
    • 侦听原始数据类型
      <script setup>
          import { ref, reactive, watch } from 'vue';
      
          let str = ref('禁止摆烂-才浅')
          let stopStrWatch = null
      
          const info = reactive({
              name: '才浅',
              age: 22
          })
          let stopInfoWatch = null
      
          // TODO 侦听原始数据类型的数据
          // NOTE stopStrWatch - watch 函数的返回值,调用该函数可以停止侦听器
          stopStrWatch = watch(
              str, 
              (newVal, oldVal) => {
                  console.log('str')
                  console.log(newVal, oldVal)
              }
          )
      
          // TODO 侦听对象的某个属性 - 需要提供 getter 函数(返回对象属性的函数)
          // NOTE stopInfoWatch - watch 函数的返回值,调用该函数可以停止侦听器
          stopInfoWatch = watch(
              () => info.age,
              (newVal, oldVal) => {
                  console.log('info.age')
                  console.log(newVal, oldVal)
              }
          );
      </script>
      
      <template>
          <h4>str</h4>
          <input type="text" v-model.trim="str">
          <hr><br>
      
          <h4>info.age</h4>
          <input type="text" v-model.number.trim="info.age">
      </template>
      
      • 效果展示:
        image.png
    • 侦听对象类型的数据:
      <script setup>
          import { ref, reactive, watch } from 'vue';
      
          let info = reactive({
              name: '才浅',
              age: 22
          })
      
          let likes = reactive({
              music: '听音乐',
              anime: '看动漫'
          })
      
          let anime = reactive({
              one: '完美世界',
              two: '不良人'
          })
      
          // TODO 侦听对象
          // NOTE 改变数据源的某个属性,可以触发回调,但是 newVal === oldVal => true
          watch(
              info,
              (newVal, oldVal) => {
                  console.log(newVal === oldVal)
              }
          )
      
          // TODO 侦听对象 - getter函数(获取对象 / 对象的某个属性的函数)
          // NOTE 如果改变某个属性值,默认情况下回调不会触发
          watch(
              () => likes,
              (newVal, oldVal) => {
                  console.log(newVal, oldVal)
              }
          )
      
          // TODO 侦听对象 - getter函数 + 配置项
          // NOTE 如果嵌套属性值发生变化,并且配置了深度侦听,会触发回调,但 newVal === oldVal
          watch(
              () => anime,
              (newVal, oldVal) => {
                  console.log(newVal, oldVal)
              },
              {
                  // NOTE 开启深度侦听
                  deep: true
              }
          )
      </script>
      
      <template>
          <h4>info.age</h4>
          <input type="text" v-model.number.trim="info.age">
          <hr><br>
      
          <h4>likes.anime</h4>
          <input type="text" v-model.trim="likes.anime">
          <hr><br>
      
          <h4>anime.one</h4>
          <input type="text" v-model.trim="anime.one">
          <hr><br>
      </template>
      
      • 效果展示:
        image.png
    • 侦听多个数据源组成的数组
      <script setup>
          import { ref, reactive, onMounted, watch } from 'vue';
          let str = ref('禁止摆烂-才浅')
      
          let likes = reactive({
              music: '听音乐',
              anime: '看动漫'
          })
      
          let anime = reactive({
              one: '完美世界',
              two: '不良人'
          })
      
          // TODO 侦听多个数据源组成的数组
          // NOTE 都能触发回调
          // NOTE 侦听:基本数据类型 - 发生改变,新旧值不一样
          // NOTE 侦听:对象的某个属性 - 发生改变,新旧值不一样
          // NOTE 侦听:对象数据类型 - 某个属性发生改变,新旧值一样
          watch(
              [str, () => likes.anime, anime],
              ([newStr, newLikesAnime, newAnime], [oldStr, oldLikesAnime, oldAnime]) => {
                  console.log([newStr, newLikesAnime, newAnime], [oldStr, oldLikesAnime, oldAnime])
              }
              // (newVal, oldVal) => {
              //   console.log(newVal, oldVal)
              // }
              // 两种写法打印的数据都一样
              )
      </script>
      
      <template>
          <h4>侦听 - str</h4>
          <input type="text" v-model="str">
          <hr><br>
      
          <h4>侦听 - likes.anime</h4>
          <input type="text" v-model="likes.anime">
          <hr><br>
      
          <h4>侦听 - anime</h4>
          <input type="text" v-model="anime.one">
      </template>
      
      • 效果展示:
        image.png

1.2 watchEffect()函数

  • watchEffect()会立即执行一遍回调函数,如果这时函数产生了副作用,Vue会自动追踪副作用的依赖关系,自动分析出响应源;
  • 语法
    import { watchEffect } from 'vue'
    watchEffect(() => {}, {})
    
  • 示例展示:
    <script setup>
        // 引入 watch 函数
        import { reactive, ref, watchEffect } from 'vue'
    
        // 账号
        let account = ref('Abc')
    
        // 员工
        let emp = reactive({
            name: 'Jack',
            salary: 7000
        })
    
        // 创建成功后立即执行一遍
        watchEffect(() => {
            // 此处用到了数据源,如果该数据源的值发生了变化,会重新执行该回调函数
            console.log('账号:' + account.value)
            console.log('员工的薪资:' + emp.salary)
        })
    </script>
    
    <template>
        账号:<input type="text" v-model="account">
        <hr>
        员工薪资:<input type="number" v-model="emp.salary">
    </template>
    
  • 回调的触发时机
    • 默认情况下,用户创建的侦听器回调,都会在Vue组件更新之前 被调用,这意味着你在侦听器回调中访问的DOM将是被Vue更新之前的状态
    • 如果想在侦听器回调中能访问到被Vue更新之后的DOM,就需要指明flush: 'post'选项,或者你也可以使用更方便的别名 watchPostEffect()函数;
    • 示例展示:
      <script setup>
          import { onMounted, reactive, ref, watchEffect, watchPostEffect } from 'vue'
      
          // 账号
          let account = ref('Abc')
      
          // 密码
          let password = ref('123456')
      
          // 员工
          let emp = reactive({
              name: 'Jack',
              salary: 7000
          })
      
          // 当视图渲染成功后
          onMounted(() => {
              // 侦听账号
              watchEffect(() => {
                  console.log('-------------------------------------')
                  console.log('账号:' + account.value)
                  // 默认情况下,回调触发机制:在 Dom 更新之前
                  console.log(document.getElementById('titleAccount').innerHTML)
              })
      
              // 侦听密码
              watchEffect(
                  () => {
                      console.log('=====================================')
                      console.log('密码:' + password.value)
                      // 默认情况下,回调函数触发机制:在 Dom 更新之前
                      console.log(document.getElementById('titlePassword').innerHTML)
                  },
                  // 更改回调函数触发机制:在 Dom 更新之后
                  { flush: 'post' }
              )
      
              // 侦听薪资
              watchPostEffect(() => {
                  console.log('=====================================')
                  console.log('员工薪资:' + emp.salary)
                  // 回调函数的触发机制:在 Dom 更新之后
                  console.log(document.getElementById('titleSalary').innerHTML)
              })
          })
      </script>
      
      <template>
          <h1 id="titleAccount">
              账号:
              <i>{{ account }}</i>
          </h1>
          账号:<input type="text" v-model="account">
          <hr>
      
          <h1 id="titlePassword">
              密码:
              <i>{{ password }}</i>
          </h1>
          密码:<input type="text" v-model="password">
          <hr>
      
          <h1 id="titleSalary">
              员工薪资:
              <i>{{ emp.salary }}</i>
          </h1>
          员工薪资:<input type="number" v-model="emp.salary">
      </template>
      
      • 效果展示:
        image.png
  • 停止侦听器
    • 要手动停止一个侦听器,请调用watchEffect()watchPostEffect()返回的函数;

二、 选项式API

  • 在 选项式API 中,我们可以使用 watch选项 在每次响应式属性发生变化时触发一个函数;

2.1 函数式侦听器

  • watch 选项中声明的函数即为函数式侦听器,其中函数名就是要侦听的数据源,函数中的参数1新值参数2旧值
    export default {
        watch: {
            侦听的数据(newVal, oldVal) {
                // 相关逻辑
            },
            // 侦听对象的某个属性
            '对象.属性'(newVal, oldVal) {
                // 相关逻辑
            }
        }
    }
    
  • 示例展示:
    <script>
      export default {
        data: () => ({
          str: '禁止摆烂-才浅',
          info: {
            name: '才浅',
            age: 22
          }
        }),
        // TODO 函数侦听器 - 侦听引用数据类型 / 对象的某个属性
        watch: {
          /**
           * 
           * @param {*} newVal 新值
           * @param {*} oldVal 旧值
           */
          str(newVal, oldVal) {
            console.log(newVal, oldVal)
          },
          // TODO 侦听对象的某个属性
          'info.age'(newVal, oldVal) {
            console.log(newVal, oldVal)
          }
        }
      }
    </script>
    

2.2 对象式侦听器:

  • watch 选项中声明的对象即为对象式侦听器,对象名就是要侦听的数据源,其中对象里面的 handler 函数即为数据源发生变化后要执行的函数,其 参数1新值参数2旧值

  • 配置项

    • 1️⃣ deep

      • watch默认是浅层的,被侦听的属性,仅在被赋新值时,才会触发回调函数,而嵌套属性的变化不会触发;
        • 也就是只有当整个对象被重新赋值的时候会触发,对象中的某个属性值改变不会触发;
      • 如果想侦听所有嵌套的变更,就需要深层侦听器deep: true选项;
      • 如果改变侦听数据的某个嵌套数据,handler也会触发;
      • 深度侦听需要遍历被侦听对象中的所有嵌套的属性,当用于大型数据结构时,开销很大;
      • 注意
        • 如果改变的是整个侦听数据新值就是当前最新的值旧值就是改变之前的值
        • 如果改变的是侦听数据的某个属性新值旧值一样的;
    • 2️⃣ immediate

      • watch默认是懒执行的,仅当数据变化时才会执行回调,但在某些场景中,我们希望在创建侦听器时,立即执行一遍回调,可采用 immediate: true 选项;
    • 3️⃣ flush

      • 默认情况下,用户创建的侦听器回调,都会在Vue组件更新之前被调用,这意味着你在侦听器回调中访问的DOM将是被Vue更新之前的状态
      • 如果想在侦听器回调中能访问被Vue更新之后的DOM,就需要指明 flush: 'post' 选项;
      • 更改 handler() 的执行机制,DOM更新后执行
  • 总结

    • 侦听整个对象:
      • 不开启深度侦听:
        • 只有当对象被重新赋值的时候触发handler()
      • 开启深度侦听:
        • 改变对象某个属性的时候就可以触发;
  • 使用场景:

    • 主要还是用来侦听 - 引用数据类型;
  • 语法

    export default {
        watch: {
            侦听的数据: {
                // deep、immediate、flush配置项根据需要配置,一般都是会加deep的
                // 开启深度侦听
                deep: true,
                handler(newVal, oldVal) {
                    // 相关逻辑
                }
            }
        }
    }
    
  • 示例展示:

    <script>
        export default {
            data: () => ({
                info: {
                    name: '才浅',
                    age: 22
                }
            }),
            methods: {
                changeInfo() {
                    this.info = {
                        name: '张三',
                        age: 30
                    }
                }
            },
            // TODO 对象式侦听器 - 侦听引用数据类型
            // NOTE 不开启深度侦听,侦听的是整个对象,只有当整个对象改变的时候才会触发handler(也就是给info重新赋值的时候触发handler)
            // NOTE 开启深度侦听,改变对象的某个属性,可以触发handler,但是 newVal === oldVal => true
            watch: {
                info: {
                    // 开启深度侦听
                    deep: true,
                    handler(newVal, oldVal) {
                        console.log(newVal, oldVal)
                    }
                }
            }
        }
    </script>
    
    <template>
        <button @click="changeInfo">对info重新赋值</button>
        <hr><br>
    
        <h4>侦听 - info</h4>
        <input type="number" v-model.trim.number="info.age">
        <hr><br>
    </template>
    

2.3 this.$watch() 侦听器

  • 使用 组件实例$watch() 方法来命令式地创建一个侦听器,它还允许你 提前停止侦听器
  • 创建侦听器:
    • 语法
      this.$watch(data, method, object)
      
      • data
        • 侦听的数据,类型为String
      • method
        • 回调函数,参数一为新值,参数二为旧值;
      • object
        • 配置项;
        deep: true ➡ 深度侦听
        immediate: true ➡ 创建时立即触发
        flush: 'post' ➡ 更改回调机制(DOM更新之后,执行回调)
        
  • 停止侦听器:
    • this.$watch()返回值是个函数调用该函数就可以停止该数据的侦听器
  • 示例展示:
    <script>
        export default {
            data: () => ({
                str: '禁止摆烂-才浅',
                info: {
                    name: '才浅'
                },
                student: {
                    age: 22
                },
                // 调用该函数,可以停止侦听str数据源
                stopStrWatch: null,
                // 调用该函数,可以停止侦听student数据源
                stopStudentWatch: null
            }),
            methods: {
                changeStudent() {
                    this.student = {
                        name: '才浅',
                        age: 22
                    }
                }
            },
            //  NOTE 生命周期函数
            mounted() {
                // TODO 创建侦听器
                // TODO 侦听 简单数据类型
                this.stopStrWatch = this.$watch('str', (newVal, oldVal) => {
                    console.log(newVal, oldVal)
                })
    
                // TODO 侦听 对象的某个属性
                this.$watch('info.name', (newVal, oldVal) => {
                    console.log(newVal, oldVal)
                })
    
                // TODO 侦听 引用数据类型
    
                // NOTE 不开启深度侦听
                // NOTE 改变对象的某个属性,不会触发回调
                // NOTE 对整个对象进行赋值,可以触发,新旧值不一样
    
                // NOTE 开启深度侦听
                // NOTE 改变 侦听数据的某个属性,新值 === 旧值
                // NOTE 改变 整个侦听数据(对对象重新赋值),新旧值不一样
                this.stopStudentWatch = this.$watch('student', (newVal, oldVal) => {
                    console.log(newVal, oldVal)
                }, {
                    deep: true,
                })
            },
        }
    </script>
    
    <template>
        str:<input type="text" v-model.trim="str">
        <button @click="stopStrWatch">停止侦听str</button>
        <hr>
        <br>
    
        info.name:<input type="text" v-model.trim="info.name">
        <hr>
        <br>
    
        <button @click="changeStudent">改变student的值</button>
        student.age:<input type="text" v-model.umber.trim="student.age">
        <button @click="stopStudentWatch">停止侦听student</button>
    </template>
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451093.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从监控到稳定性可观测:从问题响应到预防的技术变革

从单体架构到集群架构再到微服务架构&#xff0c;业务越来越庞大&#xff0c;也越来越复杂。每一次架构的升级&#xff0c;在提升了业务吞吐量的同时&#xff0c;必然会带来更大的复杂度。云原生时代背景下&#xff0c;微服务、Service Mesh、 Serverless 等新技术的出现&#…

sql面试题21:营销带货销量分析

题目大概意思&#xff1a; 找出网红带来的订单号和销售额&#xff08;销售额是该订单的&#xff0c;比如凑单&#xff09;&#xff0c;满足是优惠码是1的&#xff0c;B类商品 数据表两个&#xff0c;分别是订单和品类 CREATE TABLE 订单 (订单号 VARCHAR(512),商品号 VARCH…

LED线性恒流控制芯片两段/三段开关调光/调色:SM2223E

LED线性恒流控制芯片的开关调光/调色功能可以通过以下两种方式实现&#xff1a; LED线性恒流控制芯片的开关调光/调色功能 1. 两段调光/调色&#xff1a;通过开启或关闭电源开关&#xff0c;可以调节LED灯的亮度或色温&#xff0c;从而改变输出电流的大小。这种方式适用于需要…

Redis及其数据类型和常用命令(一)

Redis 非关系型数据库&#xff0c;不需要使用sql语句对数据库进行操作&#xff0c;而是使用命令进行操作&#xff0c;在数据库存储时使用键值对进行存储&#xff0c;应用场景广泛&#xff0c;一般存储访问频率较高的数据。 一般关系型数据库&#xff08;使用sql语句进行操作的…

ChatGPT引领智能对话:微信小程序的新潮玩法

1.引言 ChatGPT是由OpenAI开发的基于深度学习的自然语言处理模型&#xff0c;它在人工智能领域具有重要的影响力。ChatGPT基于大规模的文本数据进行训练&#xff0c;能够生成高质量的自然语言文本&#xff0c;包括对话、文章等。它的影响力主要体现在以下几个方面&#xff1a;…

系统及其分类

系统定义 系统&#xff1a;指若干相互关联的事物组合而成的具有特定功能的整体。 系统的基本作用&#xff1a;对输入信号进行加工和处理&#xff0c;将其转换为所需要的输出信号。 系统分类 系统的分类错综复杂&#xff0c;主要考虑其数学模型的差异来划分不同类型。主要分为…

【HarmonyOS】鸿蒙开发之工具安装与工程项目简介——第1章

鸿蒙开发工具包下载与使用 鸿蒙开发工具包下载 下载deveco studio开发工具包 系统要求: Windows 操作系统&#xff1a;Windows 10/11 64 位 内存&#xff1a;8GB 及以上 硬盘&#xff1a;100GB 及以上 分辨率&#xff1a;1280*800 像素及以上macOS 操作系统&#xff1a;mac…

leetcode代码记录(有序数组两数之和

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给定一个已按照 升序排列 的整数数组 numbers &#xff0c;请你从数组中找出两个数满足相加之和等于目标数 target 。 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numb…

【办公类-22-13】周计划系列(5-5)“周计划-05 上传周计划png“ (2024年调整版本)

作品展示——将docx 转PDF转png&#xff0c;保留第一张图片 背景需求&#xff1a; 把周计划内容初步替换后&#xff0c;获得了19周的周计划教案的docx 需要把周计划第一页的反思内容删除&#xff0c;&#xff0c;然后把第一页横版截图上传班级主页。 需求&#xff1a;周计划do…

开机一直提示dll文件缺失的修复方法,轻松解决弹窗dll问题

当我们在启动计算机并进入操作系统的过程中&#xff0c;如果遇到了开机即刻弹出窗口提示“dll文件缺失”的情况&#xff0c;这究竟是怎么一回事呢&#xff1f;首先&#xff0c;我们需要理解“dll”是Dynamic Link Library&#xff08;动态链接库&#xff09;的缩写&#xff0c;…

智海Mo 平台与 Datawhale 携手浙江大学,共襄 AI+X 高校行!

2024年3月9日&#xff0c;一场以"AIX 高校行"为主题的活动在浙江大学成功举办。本次活动由 Datawhale 与杭州市人工智能学会主办&#xff0c;浙江大学人工智能研究所、浙江大学控制科学与工程学院联合主办&#xff0c;浙江大学学生人工智能协会承办&#xff0c;趋动云…

49、东北大学、阿尔伯塔大学:MVS-GCN多视角脑区、具有先验脑结构学习的图模型[GCN六元理论识别所有EEG!]

本文由东北大学医学图像智能计算教育部重点实验室&#xff0c;加拿大阿尔伯塔大学于2022年1.19日发表于<Computers in Biology and Medicine> JCR\IF: Q1\7.7 Abstract&#xff1a; 目的:近年来&#xff0c;脑功能网络(FBN)已被用于神经系统疾病的分类&#xff0c;如自…

【nvm】下载安装,管理 node

nvm管理node 一. 阐述二. 需求三. nvm3.1 下载3.2 安装3.3 验证是否安装成功 四. 重启电脑五. 管理成功六. 报错6.1 nvm安装后node无效&#xff08;nvm入手&#xff0c;解决nvm use 不成功问题&#xff09;6.2 安装nvm后node无效&#xff08;node版本入手&#xff0c;直接替换更…

Kubeadm部署K8s

Kubeadm部署K8s 集群规划&#xff1a; Master节点规划: Node节点规划: 安装要求 在开始之前&#xff0c;部署Kubernetes集群机器需要满足以下几个条件&#xff1a; 操作系统 CentOS7.x-86_x64 硬件配置&#xff1a;2GB或更多RAM&#xff0c;2个CPU或更多CPU&#xff0c;硬盘…

Capture One 23:光影魔术师,细节掌控者mac/win版

Capture One 23&#xff0c;不仅仅是一款摄影后期处理软件&#xff0c;它更是摄影师们的得力助手和创意伙伴。这款软件凭借其卓越的性能、丰富的功能和前沿的技术&#xff0c;为摄影师们带来了前所未有的影像处理体验。 Capture One 23 软件获取 Capture One 23以其强大的色彩…

rt-thread组件之audio组件(结合wavplayer包使用)

前言 继上一篇RT-Thread组件之Audio框架i2s驱动的编写&#xff0c;应用层使用rt-thread软件包里面的wavplayer组件使用过程中wavplayer版本和rt-thread 5.0版本出现一个小的版本不兼容问题,这里做个记录 wavplayer软件包 问题出现的地方 源码应该修改为 版本对比

【消息队列开发】 背景知识与需求分析

文章目录 &#x1f343;前言&#x1f332;消息队列背景知识&#x1f333;需求分析&#x1f6a9;核心概念&#x1f6a9;核心API&#x1f6a9;交换机类型(Exchange Type)&#x1f6a9;持久化&#x1f6a9;网络通信&#x1f6a9;消息应答&#x1f6a9;模块划分 ⭕总结 &#x1f34…

2024VLN综述(1)

1 INTRODUCTION 视觉语言导航(VLN)[12-14]作为体现智能领域的一个重要研究方向,融合了人工智能、自然语言处理、计算机视觉和机器人技术。其目的是通过理解自然语言指令和解释视觉信息,使代理能够在虚拟和真实环境中导航[15-17]。这种方法不仅为更自然、更高效的人机交互铺…

初识Jwt(结合SpringBoot)

最近接触JWT&#xff0c;顺便记录下 目录 JWT简介JWT组成JWT使用流程JWT实战引入Maven核心代码 JWT优缺点 JWT简介 JWT是JSON Web Token的简称&#xff0c;是目前流行的跨域的认证解决方案&#xff0c;作为传递信息的凭证&#xff0c;它是由服务器端签发的且是带签名的&#x…

Vue-Router学习笔记

文章目录 一、Vue Router简介二、简单使用三、动态路由匹配3.1 响应路由参数的变化3.2 捕获所有路由或 404 Not found 路由 四、路由的匹配语法4.1 在参数中自定义正则4.2 可重复的参数4.3 Sensitive 与 strict 路由配置4.4 可选参数 五、嵌套路由嵌套的命名路由 六、编程式导航…