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>


相关文章
|
7月前
vue3——如何安装vuex
vue3——如何安装vuex
102 0
|
3月前
|
JavaScript
Vue3基础(四)___Vue-Router
本文介绍了在Vue 3中如何使用`vue-router@4`进行路由管理,包括安装路由库、定义路由配置、在组件中使用`useRouter`和`useRoute`钩子函数,以及如何在组件中进行路由跳转和获取路由参数。
67 1
Vue3基础(四)___Vue-Router
|
4月前
|
存储 监控 JavaScript
我应该使用 Pinia 还是 Vuex?
我应该使用 Pinia 还是 Vuex?
|
7月前
|
JavaScript
【vue】 vue2 实现飘窗效果
【vue】 vue2 实现飘窗效果
157 1
|
7月前
|
缓存 JavaScript 前端开发
vue-router
vue-router
|
7月前
|
JavaScript
Vue中v-mdoel
Vue中v-mdoel
|
JavaScript
vue-router的报错,我是这样解决的
vue-router的报错,我是这样解决的
|
移动开发 资源调度 JavaScript
vue-router详解
vue-router详解
98 0