路由進階

?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.pswp.cn/news/449105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449105.shtml
英文地址,請注明出處:http://en.pswp.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…