vue-router定义元信息meta操作


Posted in Vue.js onDecember 07, 2020

router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
import Test from '../views/Test.vue'
import NotFound from '../views/NotFound.vue'
import TestChild from '../views/TestChild.vue'
import AView from '../views/AView.vue'
import BView from '../views/BView.vue'
 
Vue.use(VueRouter)
 
const routes = [
 {
 path: '/',
 alias:'/home',
 components:{
  default: Home,
  aView: AView,
  bView: BView,
 },
 },
 {
 path: '/test/:id',
 name: 'Test',
 component: Test,
 props:true,
 children:[
  {
  path: ':name',
  name: 'TestChild',
  component: TestChild,
  props:true,
  /*
  定义路由的时候可以配置 meta 字段,用于一些校验,比如在导航守卫中进行校验,定义的值可以在$route中访问到
  */
  meta:{
  isRequiresAuth:true,
  isChecked:false,
  }
 }]
 },
 {
 path: '*',
 name: 'NotFound',
 component: NotFound
 },
]
 
const router = new VueRouter({
 mode: 'history',
 base: process.env.BASE_URL,
 routes
})
 
export default router

views/TestChild.vue

<template>
 <div>
  我是TestChild,查看动态路由参数name:{{name}}
 </div>
</template>
 
<script>
 export default {
  props:["name"],
  created () {
   //打印meta中定义的isRequiresAuth
   console.log(this.$route.meta.isRequiresAuth);
  },
 }
</script>
 
<style lang="scss" scoped>
 
</style>

效果截图:

vue-router定义元信息meta操作

补充知识:vue-router路由元信息及keep-alive组件级缓存

路由元信息?(黑人问号脸???)是不是这么官方的解释很多人都会一脸懵?那么我们说meta,是不是很多人恍然大悟,因为在项目中用到或者看到过呢?

是的,路由元信息就是我们定义路由时配置的meta字段;那么这个meta的作用是什么呢?

首先看一个场景:

通常我们在开发网站或者移动应用的时候,我们通常会有网页权限验证的需求(别说你没有,你肯定有),这种需求一般是指需要登录后才可进入,也就是需要用户登录获取用户Token或者用户信息之后才可进入;当这个需求下来的时候,我们作为前端开发人员的第一反应是路由守卫啊,一个路由前置守卫通过判断to.path就可以解决;

用to.path来判断做权限验证会有两个问题:

1:首先,如果需要做权限验证的页面很多呢?难道我们要通过if(to.path==='/' || to.path === '/home')这种方式来一个个的添加路径判断吗?

2:然后,routes管理器中会有很多json对象,这种json对象我们通常把它叫做路由记录,路由记录是可以嵌套的,允许存在父子关系;我们用if来判断的时候,会有匹配不完全的问题,例如你匹配了/home,那么/home/list呢,这个将不会被匹配到;

我们的理想状态下是假如我要限制了/home,那么不管你路径是/home/index也好还是/home/home也好,只要是home下来的子路由记录统统都需要登录后才能访问;

这个时候我们就可以考虑用路由元信息meta来进行处理;

首先简单的看一下页面效果:

vue-router定义元信息meta操作

我们的路由管理器中的路由记录配置如下:

const routes=[
 {
  path:'/page1',
  component:page1,
  meta:{
   login:true
  },
  children: [
   {
    path: "phone",
    component: phone
   },
   {
    path: "computer",
    component: computer
   },
  ]
 },

 {
  path:"/page2",
  component:page2,
  meta:{
   login:false
  }
 },
]

我们上面在meta中自定义login字段是标识当前路由是否需要验证token;

然后我们的路由前置全局守卫可以这么写:

router.beforeEach((to, from, next) => {
 //定义token来模拟
 let token =“123456”
 //判断即将进入的路由是否需要验证
 if(to.meta.login){
  //如果即将进入的路由需要验证
 //并且token不存在的话,那么就跳转page2(登录页)
  if(!token){
   next("/page2");
  //如果需求验证token存在直接放行
  }else{
   next();
  }
 //如果不需要验证也是直接放行
 }else{
 next();
 }
})

最后效果图如下:

vue-router定义元信息meta操作

当然这只是路由元信息的功能其一,路由元信息其实有很多用途,类似于一个当前路由的全局变量,可以通过meta来进行判断操作;

keep-alive组件:

场景:

在一个列表项很长的时候我们通常需要进行分页操作,移动端的分页操作基本上是上拉加载和下拉刷新;假如我们已经进入了这个列表的第四页,那么当我们想进去详情页查看详情的时候,当我们返回的时候这个时候页码会直接变为1,因为数据已经初始化状态;这个问题我们通常需要keep-alive组件来解决;

keep-alive是Vue内置的一个组件,通常是用来保留数据状态或避免重复渲染,也就是我们说的缓存效果;

使用:

<keep-alive>
 <component>
 <!-- 该组件将被缓存! -->
 </component>
</keep-alive>

keep-alive给我们提供了两个属性,分别是include和exclude:

include:接受值为字符串或者正则表达式,只有匹配的才被缓存;

exclude:接受值为字符串或者正则表达式,被匹配的路由将不会被缓存;

// 组件 a
export default {
 name: 'a',
 data () {
 return {}
 }
}
<keep-alive include="a">
 <component>
 <!-- name 为 a 的组件将被缓存! -->
 </component>
</keep-alive>可以保留它的状态或避免重新渲染
<keep-alive exclude="a">
 <component>
 <!-- 除了 name 为 a 的组件都将被缓存! -->
 </component>
</keep-alive>可以保留它的状态或避免重新渲染

当然我们也可以根据组件来动态缓存,我们知道vue-router是Vue官方给我们提供的一个路由组件:

<keep-alive>
 <router-view>
  <!-- 所有路径匹配到的视图组件都会被缓存! -->
 </router-view>
</keep-alive>

如果像上述代码这样,我们的所有路由视图都将被缓存,我们这个时候就可以借助我们的路由元信息meta,那么我们来修改一下代码实现动态缓存:

思路:

meta路由元信息对象里面放着的是类似于局部变量,在路由匹配的组件内部都能够访问得到,我们可以通过meta来定义一个自定义字段来判断标识页面是否需要开启缓存:

// routes 配置
export default [
 {
 path: '/',
 name: 'home',
 component: Home,
 meta: {
  keepAlive: true // 需要被缓存
 }
 }, {
 path: '/:id',
 name: 'edit',
 component: Edit,
 meta: {
  keepAlive: false // 不需要被缓存
 }
 }
]
//通过v-if来动态的判断展示
<keep-alive>
 <router-view v-if="$route.meta.keepAlive">
  <!-- 这里是会被缓存的视图组件,比如 Home! -->
 </router-view>
</keep-alive>

<router-view v-if="!$route.meta.keepAlive">
 <!-- 这里是不被缓存的视图组件,比如 Edit! -->
</router-view>

以上这篇vue-router定义元信息meta操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
vue+iview分页组件的封装
Nov 17 Vue.js
实用的 vue tags 创建缓存导航的过程实现
Dec 03 Vue.js
vue 使用class创建和清除水印的示例代码
Dec 25 Vue.js
vue实现简易的双向数据绑定
Dec 29 Vue.js
如何在VUE中使用vue-awesome-swiper
Jan 04 Vue.js
vue3自定义dialog、modal组件的方法
Jan 04 Vue.js
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 Vue.js
Vue SPA 首屏优化方案
Feb 26 Vue.js
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 Vue.js
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
VUE解决跨域问题Access to XMLHttpRequest at
May 06 Vue.js
el-table-column 内容不自动换行的解决方法
Aug 14 Vue.js
Vue如何实现验证码输入交互
Dec 07 #Vue.js
Vue $attrs &amp; inheritAttr实现button禁用效果案例
Dec 07 #Vue.js
vuex Module将 store 分割成模块的操作
Dec 07 #Vue.js
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 #Vue.js
vue+element_ui上传文件,并传递额外参数操作
Dec 05 #Vue.js
解决vue下载后台传过来的乱码流的问题
Dec 05 #Vue.js
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
Dec 04 #Vue.js
You might like
php实现的漂亮分页方法
2014/04/17 PHP
PHP实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
Destoon实现多表查询示例
2014/08/21 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
jQuery对表单的操作代码集合
2011/04/06 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
JS中的进制转换以及作用
2016/06/26 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
element ui table 增加筛选的方法示例
2018/11/02 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
Django admin美化插件suit使用示例
2017/12/12 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
python模块导入的方法
2019/10/24 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
迎国庆演讲稿
2014/09/05 职场文书
作风建设整改方案
2014/10/27 职场文书
2014年转正工作总结
2014/11/08 职场文书
2014年党建工作总结
2014/11/11 职场文书