Vue全套笔记(二)动态组件 插槽 路由

文章目录

    • 动态指令
    • 插槽
    • 自定义指令
    • 路由
      • 路由基本概念
      • vue-router的基本使用
      • vue-router 的常见用法
        • 路由重定向
        • 嵌套路由
        • 动态路由匹配
        • 声明式导航&编程式导航
        • 导航守卫

动态指令

  1. 什么是动态组件
    动态组件指的是动态切换组件的显示与隐藏。

  2. 如何实现动态组件渲染
    vue 提供了一个内置的 组件,专门用来实现动态组件的渲染。示例代码如下:
    is组件指定哪个组件就显示哪个, 绑定了两个事件在两个按钮上,以切换组件
    Vue全套笔记(二)动态组件 插槽 路由_第1张图片

  3. 使用 keep-alive 保持状态
    默认情况下,切换动态组件时无法保持组件的状态。此时可以使用 vue 内置的 组件保持动态组件的状态。示例代码如下:
    用keep alive包裹后,就可以缓存切换后之前组件的数据,下次切换回来就可以直接使用,而不是重新置初始值,原来是切换就直接删除和创建组件对象,现在是缓存之前的组件
    Vue全套笔记(二)动态组件 插槽 路由_第2张图片
    效果:inactive是缓存了
    Vue全套笔记(二)动态组件 插槽 路由_第3张图片

  4. keep-alive 对应的生命周期函数
    当组件被缓存时,会自动触发组件的 deactivated 生命周期函数。
    当组件被激活时,会自动触发组件的 activated 生命周期函数
    Vue全套笔记(二)动态组件 插槽 路由_第4张图片

  5. keep-alive 的 include 属性
    include 属性用来指定:只有名称匹配的组件会被缓存。多个组件名之间使用英文的逗号分隔:
    Vue全套笔记(二)动态组件 插槽 路由_第5张图片
    还有exclude属性用来排除匹配的组件,include和exclude只能用一个。

插槽

  1. 什么是插槽
    插槽(Slot)是 vue 为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的、希望由用户指定的部分定义为插槽。
    Vue全套笔记(二)动态组件 插槽 路由_第6张图片
    可以把插槽认为是组件封装期间,为用户预留的内容的占位符。小霸王游戏机就比如我们的组件,里面预留的插卡的位置即为插槽,你不预留插槽就无法插卡。

如这个left里面写的P标签就无法渲染到页面上,因为没有预留插槽
如果在封装组件时没有预留任何 插槽,则用户提供的任何自定义内容都会被丢弃
Vue全套笔记(二)动态组件 插槽 路由_第7张图片
2. 体验插槽的基础用法:

如果预留了一个插槽,就会自动填充到插槽的位置,就可以渲染p标签了
Vue全套笔记(二)动态组件 插槽 路由_第8张图片

插槽默认的值是default,如果想要把指定内容的值填充到指定插槽,要用v-slot指令,但是要用template标签来加上v-slot指令。用template标签来包裹指定的内容。另外 v-slot也有简写形式: #
Vue全套笔记(二)动态组件 插槽 路由_第9张图片

后备内容
可以在插槽中写上后备内容,或者叫默认内容,当没有插入东西时会默认展示:直接写在slot标签内
Vue全套笔记(二)动态组件 插槽 路由_第10张图片

具名插槽:
带有名字的插槽,插槽多了,每个都要指定名字。
Vue全套笔记(二)动态组件 插槽 路由_第11张图片
作用域插槽:
带数据的插槽就是作用域插槽
在预留插槽的时候声明数据项 scope(形参任意起名)在使用插槽的时候就可以用 = 号接受这个数据项

Vue全套笔记(二)动态组件 插槽 路由_第12张图片
也可以使用解构赋值接受:而不是直接接受一个对象
Vue全套笔记(二)动态组件 插槽 路由_第13张图片

自定义指令

  1. 什么是自定义指令
    vue 官方提供了 v-text、v-for、v-model、v-if 等常用的指令。除此之外 vue 还允许开发者自定义指令。

  2. 自定义指令的分类
    vue 中的自定义指令分为两类,分别是:
    ⚫ 私有自定义指令
    ⚫ 全局自定义指令

  3. 私有自定义指令
    在每个 vue 组件中,可以在 directives 节点下声明私有自定义指令。示例代码如下:
    Vue全套笔记(二)动态组件 插槽 路由_第14张图片

  4. 使用自定义指令
    在使用自定义指令时,需要加上 v- 前缀。示例代码如下:
    Vue全套笔记(二)动态组件 插槽 路由_第15张图片

  5. 为自定义指令动态绑定参数值
    在 template 结构中使用自定义指令时,可以通过等号(=)的方式,为当前指令动态绑定参数值:
    Vue全套笔记(二)动态组件 插槽 路由_第16张图片

  6. 通过 binding 获取指令的参数值
    在声明自定义指令时,可以通过形参中的第二个参数,来接收指令的参数值:
    Vue全套笔记(二)动态组件 插槽 路由_第17张图片

  7. update 函数
    bind 函数只调用 1 次:当指令第一次绑定到元素时调用,当 DOM 更新时 bind 函数不会被触发。 update 函数会在每次 DOM 更新时被调用。示例代码如下
    Vue全套笔记(二)动态组件 插槽 路由_第18张图片

  8. 函数简写
    如果 insert 和update 函数中的逻辑完全相同,则对象格式的自定义指令可以简写成函数格式,相当于同时写了bind和update函数
    Vue全套笔记(二)动态组件 插槽 路由_第19张图片

  9. 全局自定义指令
    全局共享的自定义指令需要通过“Vue.directive()”进行声明,示例代码如下
    Vue全套笔记(二)动态组件 插槽 路由_第20张图片
    eslint:代码规范工具,安装了之后如果不符合规范就会报错,这个不重点介绍了。

路由

路由基本概念

  1. 什么是路由
    路由(英文:router)就是对应关系。前后路由和计算机网络的路由器不是一个概念,这个是链接对应相应的组件,以完成组件的切换的效果。

  2. SPA 与前端路由
    SPA 指的是一个 web 网站只有唯一的一个 HTML 页面,所有组件的展示与切换都在这唯一的一个页面内完成。
    此时,不同组件之间的切换需要通过前端路由来实现。
    结论:在 SPA 项目中,不同功能之间的切换,要依赖于前端路由来完成!

  3. 什么是前端路由
    通俗易懂的概念:Hash 地址与组件之间的对应关系。
    #号后面写地址表示锚点: 就是当前页面的指定位置

  //a标签中的代码:
    <a href="#demo1">跳转1a>
    <a href="#node2">跳转2a>
    <a href="#node3">跳转3a>

比如 localhost:8080/#/home,此时ur的哈希值就是#/home,location对象有获得哈希值的方法,可以通过监听动态组件,然后让不同的哈希值时展示对应的页面,也能模拟简单的路由效果。

  1. 前端路由的工作方式
    ① 用户点击了页面上的路由链接
    ② 导致了 URL 地址栏中的 Hash 值发生了变化
    ③ 前端路由监听了到 Hash 地址的变化
    ④ 前端路由把当前 Hash 地址对应的组件渲染都浏览器中
    Vue全套笔记(二)动态组件 插槽 路由_第21张图片
    结论:前端路由,指的是 Hash 地址与组件之间的对应关系!

  2. 实现简易的前端路由

Vue全套笔记(二)动态组件 插槽 路由_第22张图片
Vue全套笔记(二)动态组件 插槽 路由_第23张图片
Vue全套笔记(二)动态组件 插槽 路由_第24张图片

vue-router的基本使用

  1. 什么是 vue-router
    vue-router 是 vue.js 官方给出的路由解决方案。它只能结合 vue 项目进行使用,能够轻松的管理 SPA 项目中组件的切换。
    vue-router 的官方文档地址:https://router.vuejs.org/zh/

  2. vue-router 安装和配置的步骤
    ① 安装 vue-router 包
    ② 创建路由模块
    ③ 导入并挂载路由模块
    ④ 声明路由链接和占位符

2.1 在项目中安装 vue-router
在 vue2 的项目中,安装 vue-router 的命令如下:
在这里插入图片描述
2.2 创建路由模块
在 src 源代码目录下,新建 router/index.js 路由模块,并初始化如下的代码:
index.js这个文件很常用,在router文件夹下建立,是我们使用路由的实际方式。
Vue全套笔记(二)动态组件 插槽 路由_第25张图片
2.3 导入并挂载路由模块
在 src/main.js 入口文件中,导入并挂载路由模块。示例代码如下:
Vue全套笔记(二)动态组件 插槽 路由_第26张图片
2.4 声明路由链接和占位符
在 src/App.vue 组件中,使用 vue-router 提供的 声明路由链接和占位符
标签其实就是我们使用路由时候的a标签,在使用路由时推荐使用 而不是a标签,仅仅就是个占位符,写了它组件就可以在它那里展示了。
Vue全套笔记(二)动态组件 插槽 路由_第27张图片

  1. 声明路由的匹配规则
    在 src/router/index.js 路由模块中,通过 routes 数组声明路由的匹配规则。示例代码如下:
    要写在路由实例化时的构造函数里,固定写法:
    大括号里写routes数组,然后再写 哈希地址和组件的对应规则,此时的哈希地址要省略#号
    Vue全套笔记(二)动态组件 插槽 路由_第28张图片

vue-router 的常见用法

路由重定向

路由重定向指的是:用户在访问地址 A 的时候,强制用户跳转到地址 C ,从而展示特定的组件页面。
通过路由规则的 redirect 属性,指定一个新的路由地址,可以很方便地设置路由的重定向:
如下,就能让网站默认访问home了,原本是默认访问#/,重定向跳转了。
Vue全套笔记(二)动态组件 插槽 路由_第29张图片

嵌套路由

通过路由实现组件的嵌套展示,叫做嵌套路由。
就是我用路由已经展示了某个组件了,但是这个组件里面我又会放置路由来在此组件中再展示组件,形成了嵌套关系,开始套娃了。
Vue全套笔记(二)动态组件 插槽 路由_第30张图片
实现嵌套路由:
3.1 声明子路由链接和子路由占位符
在 About.vue 组件中,声明 tab1 和 tab2 的子路由链接以及子路由占位符。示例代码如下
Vue全套笔记(二)动态组件 插槽 路由_第31张图片
声明了路由链接和占位符以后,最重要的是指明路由的对应规则:

3.2 通过 children 属性声明子路由规则

在 src/router/index.js 路由模块中,导入需要的组件,并使用 children 属性声明子路由规则:
要在父路由规则中使用children数组,书写子路由规则,注意path中是不加/的,和父不一样
再导入相应的子子组件即可。

Vue全套笔记(二)动态组件 插槽 路由_第32张图片
如果我么们在展示about组件的时候,想要一点击默认就展示其中的子组件tab1,那么可以使用重定向来实现:
Vue全套笔记(二)动态组件 插槽 路由_第33张图片
还有一种实现方式叫做默认子路由:如果path值为空字符串,此路由规则就会默认展示,跟跳转不一样的是此时的url地址栏后面是空而不是/tab1
Vue全套笔记(二)动态组件 插槽 路由_第34张图片

动态路由匹配

现在传过来的链接,movie后面是id的值,根据不同的id放不同的电影,但是用的组件都是movie组件:
Vue全套笔记(二)动态组件 插槽 路由_第35张图片
4.1 动态路由的概念
动态路由指的是:把 Hash 地址中可变的部分定义为参数项,从而提高路由规则的复用性。 在 vue-router 中使用英文的冒号(:)来定义路由的参数项。示例代码如下:
Vue全套笔记(二)动态组件 插槽 路由_第36张图片
这个使用 :冒号来动态的进行匹配了,:可以对应 1、2、3等等数值,没必要非要起名为id,这个值将可以在movie组件中可以得到

4.2 $route.params 参数对象

怎么得到呢,在movie组件中,this对象(组件本身)有$route属性,其中的params对象就有对应的参数值,其名字和自己起的参数名对应:
Vue全套笔记(二)动态组件 插槽 路由_第37张图片
使用 $route.param.mid即可取出参数值Vue全套笔记(二)动态组件 插槽 路由_第38张图片

但是有更简单的方式接收该参数:开启props传参,在规则中指定props为true,然后再movie组件中增加props数组,写入mid,就可以直接用了
Vue全套笔记(二)动态组件 插槽 路由_第39张图片
?后面的参数叫查询参数,需要使用this.$route.query来访问
在this.route中,path只是路径部分,fullpath是完整的地址
Vue全套笔记(二)动态组件 插槽 路由_第40张图片

声明式导航&编程式导航

在浏览器中,点击链接实现导航的方式,叫做声明式导航。例如:
⚫ 普通网页中点击 链接、vue 项目中点击 都属于声明式导航
在浏览器中,调用 API 方法实现导航的方式,叫做编程式导航。例如:
⚫ 普通网页中调用 location.href 跳转到新页面的方式,属于编程式导航

5.1 vue-router 中的编程式导航 API
vue-router 提供了许多编程式导航的 API,其中最常用的导航 API 分别是:
① this.$router.push(‘hash 地址’)
⚫ 跳转到指定 hash 地址,并增加一条历史记录
② this.$router.replace(‘hash 地址’)
⚫ 跳转到指定的 hash 地址,并替换掉当前的历史记录

③ this.$router.go(数值 n)
⚫ 实现导航历史前进、后退

注意这跟前面的route不一样,这里是$router属性

5.2 $router.push
调用 this.$router.push() 方法,可以跳转到指定的 hash 地址,从而展示对应的组件页面。示例代码如下:
Vue全套笔记(二)动态组件 插槽 路由_第41张图片

5.3 $router.replace
调用 this.$router.replace() 方法,可以跳转到指定的 hash 地址,从而展示对应的组件页面。
push 和 replace 的区别:
⚫ push 会增加一条历史记录
⚫ replace 不会增加历史记录,而是替换掉当前的历史记录

Vue全套笔记(二)动态组件 插槽 路由_第42张图片

5.4 $router.go
调用 this.$router.go() 方法,可以在浏览历史中前进和后退。示例代码如下:
Vue全套笔记(二)动态组件 插槽 路由_第43张图片
5.5 $router.go 的简化用法
在实际开发中,一般只会前进和后退一层页面。因此 vue-router 提供了如下两个便捷方法:
① $router.back()
⚫ 在历史记录中,后退到上一个页面
② $router.forward()
⚫ 在历史记录中,前进到下一个页面

Vue全套笔记(二)动态组件 插槽 路由_第44张图片

导航守卫

导航守卫可以控制路由的访问权限。示意图如下:
Vue全套笔记(二)动态组件 插槽 路由_第45张图片
6.1 全局前置守卫
每次发生路由的导航跳转时,都会触发全局前置守卫。因此,在全局前置守卫中,程序员可以对每个路由进行访问权限的控制:
Vue全套笔记(二)动态组件 插槽 路由_第46张图片
这里调用beforeEach方法,里面的形参有三个回调函数,回调函数中有三个形参,格式为:
to是将访问的路由信息对象,from是将要离开的路由信息对象,next是放行的函数,一定要有
Vue全套笔记(二)动态组件 插槽 路由_第47张图片
6.3 next 函数的 3 种调用方式
参考示意图,分析 next 函数的 3 种调用方式最终导致的结果
Vue全套笔记(二)动态组件 插槽 路由_第48张图片

控制后台主页访问权限,访问main时要验证token,其他的可以直接访问:
Vue全套笔记(二)动态组件 插槽 路由_第49张图片
Vue全套笔记(二)动态组件 插槽 路由_第50张图片

你可能感兴趣的:(vue.js,javascript,前端)