路由进阶

 1>路由组件传参

在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性。

解决方法:

1.1若是动态匹配页面,只需要在路由参数中加入props:true即可。

import Home from "@/views/Home.vue";export default [{path: "/argu/:name",name:"argu",component: () => import("@/views/argu.vue"),props:true//可以进行路由组件传参
  }
];

 

<template><div><!-- 拿到动态路由的参数 --><!-- {{$route.params.name}} --><!-- 尽量使用这种方法,不要使用this.$route.paramas,让组件和路由解耦尽量不要在组件中使用$routes,$router方法 -->{{name}}</div>
</template><script>
export default {//
  props:{name:{type:String,default:"caoqi"}}
};
</script>

2.如果是普通的页面,则也可使用props对象格式传递:

import Home from "@/views/Home.vue";export default [{path: "/about",name: "about",// route level code-splitting// this generates a separate chunk (about.[hash].js) for this route// which is lazy-loaded when the route is visited.component: () => import(/* webpackChunkName: "about" */ "@/views/About.vue"),//如果是空对象则显示apple//props:{},
    props: {food:'banaa'}},{path: "/argu/:name",name:"argu",component: () => import("@/views/argu.vue"),props:true//可以进行路由组件传参
  }
];

 

<template><div class="about"><h1>This is an about page</h1><b>{{ food }}</b></div>
</template>
<script>
export default {props:{food:{type:String,default:"apple"}}
}
</script>

 

 3.如果是普通的页面,还可以使用props函数模式传递,这种情况适合于根据地址参数做一些逻辑:

 

import Home from "@/views/Home.vue";export default [{path: "/",alias:'/home_page',name: "home", //加上name属性  命名路由
    component: Home,props: route => ({ food:route.query.food})}
];
<template><div class="home"><b>{{ food }}</b><button @click="handleClick('back')">返回上一页</button><button @click="handleClick('push')">跳转到parent</button><button @click="handleClick('replace')">替换到parent</button></div>
</template><script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'export default {name: 'home',components: {HelloWorld},props:{food:{type:String,default:"apple"}},methods:{handleClick(type){if (type==="back") {//this.$router.back();this.$router.go(-1);}else if (type==="push") {const name="caoqi";//使用push会在浏览器中加入一个记录//使用路径跳转//this.$router.push("/parent");//还可以使用命名路由的方式:this.$router.push({// name: "parent",// //加入name参数,http://localhost:8080/#/parent?name=caoqi// query: {//   name: 'caoqi'// }// name: "argu",// //加入name参数,http://localhost:8080/#/argu/caoqi// params: {//   name: 'caoqi'// }//ES6写法:
          path:`/argu/${name}`,})}else if (type==="replace") {//使用replace不会在浏览历史中加入记录this.$router.replace({name: 'parent'})}}}
}
</script>

2>HTML histoty模式

 

import Vue from "vue";
import Router from "vue-router";
import routes from "./router";Vue.use(Router);export default new Router({//mode:'hash',//默认模式mode:'history',routes: routes
});

 

3>导航守卫(路由守卫)

路由跳转前做一些验证,比如登录验证,是网站中的普遍需求。

官方api地址:https://router.vuejs.org/zh-cn/advanced/navigation-guards.html

3.1 全局守卫

3.1.1 全局前置守卫

import Vue from "vue";
import Router from "vue-router";
import routes from "./router";Vue.use(Router);const router = new Router({routes
});const HAS_LOGINED = false;
//全局前置守卫
/*
to: Route: 即将要进入的目标 路由对象
from: Route: 当前导航正要离开的路由
next: Function: 一定要调用该方法来 resolve 这个钩子*/
//模拟登陆验证逻辑:当跳转页面为登陆页面且已经登陆时,直接跳转到home页面,如果跳转页面不为登录页且已经登陆,则继续执行,否则直接跳转到登录页
router.beforeEach((to, from, next) => {if (to.name !== "login") {if (HAS_LOGINED) next();else next({ name: "login" });} else {if (HAS_LOGINED) next({ name: "home" });else next();}
});export default router;

3.1.2 全局后置钩子

3.2 路由独享的守卫

import Home from "@/views/Home.vue";export default [{path: "/",alias: "/home_page",name: "home", //加上name属性  命名路由
    component: Home,props: route => ({food: route.query.food}),beforeEnter: (to, from, next) => {// if (from.name === "about") alert("这是从about来的");// else alert("这不是从about来的");
      next();}}
];

3.3 组件内的守卫

<template><div class="home"><b>{{ food }}</b><button @click="handleClick('back')">返回上一页</button><button @click="handleClick('push')">跳转到parent</button><button @click="handleClick('replace')">替换到parent</button></div>
</template><script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'export default {name: 'home',components: {HelloWorld},props:{food:{type:String,default:"apple"}},beforeRouteEnter (to, from, next) {// 在渲染该组件的对应路由被 confirm 前调用// 不!能!获取组件实例 `this`// 因为当守卫执行前,组件实例还没被创建next(vm => {//若想使用实例,可使用这种方法
      console.log(vm)})},//这个离开守卫通常用来禁止用户在还未保存修改前突然离开。该导航可以通过 next(false) 来取消。
  beforeRouteLeave (to, from, next) {// const leave = confirm('您确定要离开吗?')// if (leave) next()// else next(false)
    next()}
}
</script>

4>路由元信息

 

import Home from "@/views/Home.vue";export default [{path: "/",alias: "/home_page",name: "home", //加上name属性  命名路由
    component: Home,props: route => ({food: route.query.food}),beforeEnter: (to, from, next) => {// if (from.name === "about") alert("这是从about来的");// else alert("这不是从about来的");
      next();}},{path: "/about",name: "about",// route level code-splitting// this generates a separate chunk (about.[hash].js) for this route// which is lazy-loaded when the route is visited.component: () =>import(/* webpackChunkName: "about" */ "@/views/About.vue"),props: {food: "banaa"},meta: {title: '关于'}}
];

 

index.js

import Vue from "vue";
import Router from "vue-router";
import routes from "./router";
import { setTitle } from "@/lib/util";Vue.use(Router);const router = new Router({routes
});const HAS_LOGINED = true;
//全局前置守卫
/*
to: Route: 即将要进入的目标 路由对象
from: Route: 当前导航正要离开的路由
next: Function: 一定要调用该方法来 resolve 这个钩子*/
//模拟登陆验证逻辑:当跳转页面为登陆页面且已经登陆时,直接跳转到home页面,如果跳转页面不为登录页且已经登陆,则继续执行,否则直接跳转到登录页
router.beforeEach((to, from, next) => {to.meta && setTitle(to.meta.title);if (to.name !== "login") {if (HAS_LOGINED) next();else next({ name: "login" });} else {if (HAS_LOGINED) next({ name: "home" });else next();}
});export default router;

util.js

export const setTitle = (title) => {window.document.title = title || 'admin'
}

转载于:https://www.cnblogs.com/qicao/p/10781099.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网摄像机通讯_网络调试助手

1&#xff0c;文档目的&#xff1a; 了解对于物联网网关与摄像机协议联动&#xff0c;进行报警抓图&#xff0c;智能检测&#xff0c;OSD叠加&#xff0c;语音播报控制等联动及数据交互。 适用产品&#xff1a;物联网网关 &#xff08;OSD是屏幕显示技术的一种&#xff09; 2…

linux 复制指定目录下的全部文件到另一个目录中,linux cp 文件夹

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的。linux下进行复…

银行不告诉的秘密,看完豁然大悟

随着理财意识的广泛普及&#xff0c;每个人与银行打交道的次数越来越频繁&#xff0c;对于银行知识、业务的了解似乎也有了很大的进步。 但总有一些看似很“肯定”的事&#xff0c;在银行那里却成了“不一定”。 在银行里&#xff0c;还存在着不少让非专业人士“意想不到”…

TOJ 3046: 招商银行网络系统

3046: 招商银行网络系统 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 12 Accepted:3 Description 虽然招商银行的网络安全已经做得非常完善&#xff0c;但是天有不测风云&#xff0c;招商银行内部网络系统的一台服务器意外感…

vue打包成app后,背景图片不显示

问题&#xff1a; 在使用npm run build 打包后&#xff0c; 如果在页面中使用img标签引入&#xff0c;打包后的路径是由index.html开始访问的&#xff0c;真正访问的是Static/img/图片名&#xff0c; 是正确的&#xff0c; 但是写在css 中的background: url("../../assets…

解决: Linux – git: command not found

出错原因&#xff1a;服务器没有安装GIT&#xff0c;所以导致出错。 解决方法&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Centos下使用&#xff1a;yum install git…

19-03-25

关于上拉加载和下拉刷新 minirefresh.github.io/minirefresh… 这是一个插件&#xff0c;应该是默认禁止了e.preventDefault和e.stopPropagation&#xff0c;而且在每次touchend中判断当前滚动条位置&#xff0c;如果到达上部顶部&#xff0c;则再次双禁止&#xff0c;因为插件…

如何设计函数?

函数&#xff1a; 一段具有某项功能的代码&#xff0c;是C语言中管理代码的单位。 把代码封装成一个个函数&#xff0c;可以方便的管理和调用代码。函数分类&#xff1a; 标准库函数&#xff1a;C语言标准为委员会为C语言以函数形式提供的一些基础功能&#xff0c;被封装在lib…

八个被现代科学证实的古老信条

近年来&#xff0c;现代科学证实了很多古代智慧中的教导和信念。几个世纪以来我们都知道这些信念能够帮助我们生活的幸福、健康和平衡。《赫芬顿邮报》将八个被现代科学证实的古老信仰整理如下。 1.帮助他人能让你更健康 近年来&#xff0c;现代科学证实了很多古代智慧中的教…

Hystix熔断解决雪崩问题

1.线程隔离&#xff0c;服务降级&#xff08;服务的消费方做降级处理&#xff09; 当服务繁忙时&#xff0c;如果服务出现异常&#xff0c;不是粗暴的直接报错&#xff0c;而是返回一个友好的提示&#xff0c;虽然拒绝了用户的访问&#xff0c;但是会返回一个结果。 这就好比去…

Docker 环境下如何 安装 Zookeeper

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 第一步&#xff1a;首先下载Zookeeper的镜像文件&#xff1a; 从仓库中pull 这个zookeeper镜像&#xff1a;docker pull jplock/zookeep…

office教程:教你Excel 怎么样使用信息函数

Excel如何使用信息函数信息函数专门用来返回某些指定单元格或区域的信息&#xff0c;例如获取文件路径、单元格格式信息或操作环境信息等。一&#xff0c;使用CELL函数返回引用单元格信息工作表中的每一个单元格都有对应的单元格格式、位置和内容等信息&#xff0c;在Excel中可…

【C基础】指针/指针运算/二级指针/函数指针

指针定义&#xff1a; 指针是一种数据类型&#xff0c;使用它可以用来定义指针变量&#xff0c;指针变量中存储的其实是整数&#xff0c;这种整数代表了内存的编号。指针的使用&#xff1a; 1、函数之间相独立&#xff0c;但有些时候需要共享变量。传参是值传递全局变量容易命…

中医养生 选对方法就成功一半

在医院门诊室&#xff0c;因为肠胃不适前来看病的林先生。问及他平时的养生之道&#xff0c;他笑谈&#xff0c;现在也正困惑着呢。 原来&#xff0c;最近他有两个朋友&#xff0c;在单位体检时分别被查出患有肾结石和胆囊炎&#xff0c;他本人最近也犯胃病。 最令人奇怪的一…

二叉查找树,红黑树

漫画算法&#xff1a;什么是红黑树&#xff1f;&#xff08;适合初学红黑树小白简单易懂&#xff09; 2018年09月14日 09:55:54 苏杭-Java工程师 阅读数&#xff1a;494———————————— 二叉查找树&#xff08;BST&#xff09;具备什么特性呢&#xff1f; 1.左子树上所…

如何在 CentOS 7上安装和使用 Docker Compose

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 介绍 Docker是一个很好的工具&#xff0c;但要真正充分利用它的潜力&#xff0c;最好是应用程序的每个组件都在它自己的容器中运行。对于…

WebSSH2安装过程可实现WEB可视化管理SSH工具

目录 Chrome web Secure Shell Extension gotty GateOne noVNCvncserver XtermjsSSH2nodejs nodejstty.js CheungSSH TriAquae https://github.com/Scirh/Python/tree/master/django https://www.smarthomebeginner.com/install-shellinabox-on-ubuntu/#64-bit https://gist.gi…

原码反码补码位运算,

进制转换&#xff1a; 十进制转二进制&#xff1a; 求余法&#xff1a;用2对数据求余&#xff0c;然后再对商继续求余&#xff0c;直到商为0结束&#xff0c;过程中产生的余数就是该数据的二进制(逆序)。 求权法&#xff1a;数据 - 2^(n-1) 如果可以减 第n位就是1&#xff0c;否…

一个人幸运的前提,是他有能力改变自己

很多时候&#xff0c;我们羡慕那些幸运的人&#xff0c;却看不到他们为此做出的努力和改变。 其实&#xff0c;一个人的幸运并不是偶然的&#xff0c;美国成功哲学家金洛恩说过这么一句话&#xff1a;“成功不是追求得来的&#xff0c;而是被改变后的自己主动吸引来的。” …

剑指Offer-正则表达式匹配(Python)

1 题干内容 请实现一个函数用来匹配包括.和*的正则表达式。模式中的字符.表示任意一个字符&#xff0c;而*表示它前面的字符可以出现任意次&#xff08;包含0次&#xff09;。 在本题中&#xff0c;匹配是指字符串的所有字符匹配整个模式。 例如&#xff0c;字符串aaa与模式a.a…