路由进阶

 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…

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…

Docker 环境下如何 安装 Zookeeper

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

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

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

二叉查找树,红黑树

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

【算法】快排

快速排序 其利用的思想就是分治思想&#xff0c;最开始先从数组中随机选择一个元素p&#xff08;为什么随机下面解释&#xff09;&#xff0c;然后以这个元素对数组中的元素进行分类&#xff0c;数组左侧都是小于p的元素&#xff0c; 右侧都是大于等于p的元素。这样就让数组分成…

19_05_01校内训练[polygon]

题意 把一个边长为1的正n边形放到一个正m边形中&#xff0c;要求m边形完全覆盖n边形&#xff0c;可以有交点&#xff0c;并且中心重合。求正m边形的最小边长&#xff0c;至少精确到6位。要求logn计算。 思考 先考虑m|n的情况。 我们知道&#xff0c;正m边形的边长与可行区域&am…

[转]numpy中的np.max 与 np.maximum区别

转自&#xff1a;https://blog.csdn.net/lanchunhui/article/details/52700895 转载于:https://www.cnblogs.com/xianhan/p/10609319.html

win10 php7+apache2.4的配置以及遇到的问题及解决

首先进入PHP官网下载php7的版本,我下的是PHP7.1.28,在PHP的下载页面注意划红线和绿线的地方(我画的) 1.画了红线的意思是请使用由apache lounge提供的编译文件,也就是点进蓝色Apache lounge这里下载. 2.画了绿色的线的意思是用Apache的话你必须使用Thread Safe(线程安全)的PHP…

AI一周热闻:华为豪掷3.3亿剑桥买地,自建光芯片工厂;比特大陆IPO失败,组织架构调整...

导读 华为豪掷3.3亿剑桥买地&#xff0c;自建光芯片工厂苹果春季发布会无硬件发布&#xff0c;转型之心迫切比特大陆IPO失败&#xff0c;组织架构调整&#xff0c;王海超任CEO特斯拉起诉小鹏汽车员工窃取商业机密英伟达发布GauGAN&#xff0c;线条色块秒变逼真图像用机器学习防…

虚拟环境vitualenv的使用

Python3开发之虚拟环境virtualenv与virtualenvwrapper 在使用 Python 开发的过程中&#xff0c;工程一多&#xff0c;难免会碰到不同的工程依赖不同版本的库的问题&#xff1b; 亦或者是在开发过程中不想让物理环境里充斥各种各样的库&#xff0c;引发未来的依赖灾难。 此时&am…

银行各类理财收益渐涨 各类宝钱景尚不明朗

这个春天&#xff0c;投资似乎进入了一个好事多磨的阶段。央行一反先前支持的态度&#xff0c;开始对互联网理财念起了“紧箍咒”。一时间&#xff0c;各种“宝”的命运变得扑朔迷离起来。尽管各种“宝”声明&#xff1a;不受央行政策影响。而投资者内心的担忧&#xff0c;恐怕…

PHP全栈学习笔记27

数组概述&#xff0c;类型&#xff0c;声明&#xff0c;遍历&#xff0c;输出&#xff0c;获取数组中最后一个元素&#xff0c;删除重复数组&#xff0c;获取数组中指定元素的键值&#xff0c;排序&#xff0c;将数组中的元素合成字符串。 数组概述&#xff0c;数组是存储&…

mac地址和ip地址的区别(转)

先纠正一下几个比较模糊的概念&#xff1a;“MAC地址表储存IP地址”&#xff0c; MAC地址表是二层设备中存储“MAC地址”和“转发端口”映射关系的表&#xff0c;并不直接存储IP地址。 “路由器根据MAC地址来选择路由进行数据发送”&#xff0c;对于三层设备的三层端口来说&…

Windows下多个JDK版本的切换方法

问题 因我之前在window中无法命令行输入&#xff0c;后来发现是电脑中存在多个JDK&#xff0c;导致设置混乱。于是&#xff0c;我继续深入研究了当电脑存在多个JDK的情况下&#xff0c;如何设置想要的JDK版本。步骤 1.更改环境变量 进入环境变量的配置界面&#xff0c;将JAVA_H…

哈哈哈,只有程序员才懂的黑色幽默 ... ...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 也是机缘巧合&#xff0c;让我一个之前工作从未接触过程序员的人&#xff0c;现在成天和程序员打交道&#xff0c;要知道&#xff0c;不…

ONVIF Device Manager修改设备密码

这个onvif工具可以实时监控画面&#xff0c;使用起来简单方便 左侧一栏是设备信息&#xff0c;中间上半部分是设备配置设置&#xff0c;下半部分是图像预览配置设置。 修改密码可通过该工具&#xff0c;点击User management后选择用户类型并且修改密码。

mysql 数据库函数入门

转载于:https://www.cnblogs.com/hwgok/p/10816922.html

Hadoop localhost: frankxulei@localhost: Permission denied (publickey,password)

Hadoop启动HDFS进程的时候报错&#xff0c;提示权限不够&#xff0c;具体信息如图所示&#xff1a;localhost: frankxuleilocalhost: Permission denied (publickey,password). frankxuleiubuntu:/usr/local/hadoop$ sbin/start-all.shWARNING: Attempting to start all Apache…