Vue-Router 3

简介: Vue-Router

3.3全局导航守卫的补充

3.3.1全局后置钩子函数(router.afterEach)

在前面小节中使用的是全局前置钩子函数(router.beforeEach)来实现标签跟随URL的改变,但是还有一种就是后置钩子函数()

/*全局后置钩子函数*/

router.afterEach((to, from) => {

 document.title = to.matched[0].meta.title;

})

使用后置全局钩子函数不需要再调用next();方法。

3.3.2其他守卫

(1)路由独享守卫

学习链接:导航守卫 | Vue Router

(2)组件内守卫

学习链接:导航守卫 | Vue Router

4、keep-alive遇见vue-router

keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。

router-view也是一个组件,如果直接被包在keep-alive里面,所有路径匹配到的视图组件都会被缓存︰

这样的话在调用组件的之后就不用每次都创建了,也就是说组件在创建完成之后不会自动销毁,可以提升性能。

4.1keep-alive的两个属性

include -字符串或正则表达,只有匹配的组件会被缓存

exclude -字符串或正则表达式,任何匹配的组件都不会被缓存

这样User组件和profile组件在使用时会被创建,当切换到其他的组件的时候会被销毁,如此循环往复。

5、小案例TabBar

(1)在终端使用脚手架创建项目tabbar

PS D:\Vue\vue06-router> vue init webpack tabbar

(2)因为App.vue组件是浏览器DOM的实例,因此首先会想到直接在App.vue组件中定义。

效果:

上面的代码都是写在App.vue文件中的,但是存在代码复用性差的问题,而且缺少图片的问题,因此要将TabBar组件抽取出来。

也就是需要将App.vue中的关于TabBar的组件抽取出来,又因为组件想要在浏览器上显示需要将组件挂载到vue实例,也就是App.vue上因此需要将TabBar.vue导入到App.vue中注册,并在App.vue中使用。

效果还是一样的。

除了有文字还需要加上图标,图标去找阿里的就行:iconfont-阿里巴巴矢量图标库

效果:

但是,根据组件化的思想,TabBar组件只是负责底部的导航栏,而底部的四个图标实际上也是一个的组件,因此我们将放在导航条中的图标封装到1个组件中,在导航条中使用就行了。

根据上图,TabBarItem组件中的内容(也就是图标不是写死的,可以根据我们的需要方便进行相关的修改和添加)是个插槽,TabBar组件中也是插槽,因为图标的数量和内容是可修改的。

TabBar组件内容

<template>
  <div id="tab-bar">
    <slot></slot>
  </div>
</template>
<script>
export default {
  name: "TabBar"
}
</script>
<style scoped>
/*设置文字排列在一行上,设置TabBar背景颜色为浅灰色,并将TabBar放到下面,设置TabBar顶部的阴影*/
#tab-bar{
  display: flex;
  background-color: #f6f6f6;
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  box-shadow: 0 -1px 1px ,rgba(100,100,100,.2);
}
</style>

TabBarItem组件内容:

<template>
    <div class="tab-bar-item">
<!--  具名插槽    -->
     <slot name="item-icon"></slot>
      <slot name="item-txt"></slot>
    </div>
</template>
<script>
export default {
  name: "TabBarItem"
}
</script>
<style scoped>
.tab-bar-item{
  flex: 1;
  text-align: center;
  height: 49px;
}
.tab-bar-item img{
  width: 24px;
  height: 24px;
}
</style>

App组件内容:

<template>
  <div id="app">
    <!-- 3、使用组件TabBar和TabBarItem组件-->
    <tab-bar>
        <tab-bar-item>
          <img slot="item-icon" src="./assets/img/tabbar/首页.svg" alt="">
          <div slot="item-txt">首页</div>
        </tab-bar-item>
        <tab-bar-item>
          <img slot="item-icon" src="./assets/img/tabbar/分类.svg" alt="">
          <div slot="item-txt">分类</div>
        </tab-bar-item>
        <tab-bar-item>
          <img slot="item-icon" src="./assets/img/tabbar/购物车.svg" alt="">
          <div slot="item-txt">购物车</div>
        </tab-bar-item>
        <tab-bar-item>
          <img slot="item-icon" src="./assets/img/tabbar/我的.svg" alt="">
          <div slot="item-txt">我的</div>
        </tab-bar-item>
    </tab-bar>
  </div>
</template>
<script>
/*1、导入TabBar组件和TabBarItem组件注册到App.vue实例中并使用*/
import TabBar from "./components/tabbar/TabBar";
/*导入图标组件*/
import TabBarItem from "./components/tabbar/TabBarItem";
export default {
  name: 'App',
  components: {
    /*2、注册*/
    TabBar,
    TabBarItem
  }
}
</script>
<style>
/*引入css样式*/
@import "./assets/css/base.css";
</style>


相关文章
|
4天前
|
移动开发 缓存 JavaScript
一文带你了解和使用vue-router(2024年11月)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端已两年半。熟悉JavaScript和Vue,正向全栈发展。博客分享前端知识,包括路由、前后端分离、Vue组件及路由守卫等内容。关注我,获取更多优质文章,您的支持是我前进的动力!🎉🎉🎉
一文带你了解和使用vue-router(2024年11月)
|
6月前
|
网络架构
Vue3 系列:vue-router
Vue3 系列:vue-router
40 2
|
6月前
|
缓存 JavaScript 前端开发
vue-router
vue-router
|
JavaScript
vue-router的报错,我是这样解决的
vue-router的报错,我是这样解决的
|
移动开发 资源调度 JavaScript
vue-router详解
vue-router详解
90 0
|
移动开发 JavaScript 前端开发
vue-router 详细讲解(一)
vue-router 详细讲解(一)
|
JavaScript 网络架构
vue-router 详细讲解(二)
vue-router 详细讲解(二)
|
JavaScript
vue3中vue-router使用(3)
Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举
464 58