Vue 路由router

路由

路由是基于hash 和 history 封裝的
  • hash
// 例子
location.hash = 'demo'
  • history
//例子
history.pushState(null,'title','test')

history.back()

history.forward()

history.go(3)
路由在vue中使用流程

ps. 如果在vue create my-project的時(shí)候沒有選擇路由,就手動(dòng)安裝一下串结。 詳細(xì)見 router 網(wǎng)站

npm install vue-router

router 基礎(chǔ)使用分為以下步驟

1. 在和main.js同級(jí)創(chuàng)建router文件夾苗踪,一般都是src下同級(jí) 下圖

image.png

2. 在router文件下新建index.js文件

  • 這個(gè)是router自動(dòng)指定的目錄灵嫌,最好不要更改
  • 在main.js引入的時(shí)候直接 '@/router' 即可
路由基礎(chǔ)使用步驟
    1. 在router/index.js文件中導(dǎo)入router相關(guān)包筐赔。并且用Vue.use注冊(cè)一下
import Vue from 'vue';
import VueRouter from 'vue-router';
//使用router插件
Vue.use(VueRouter);
    1. 聲明使用VueRouter堪置,添加一些相關(guān)配置沐绒,并且注冊(cè)相關(guān)的組件犁柜。
const routes = [
    {
        path : '',
        redirect : "/home"
    },
    {
        path: '/home',
        component: () => import('../views/Home')
    },
    {
        path: '/about',
        component: () => import('../views/About')
    }
];


const router = new VueRouter({
    mode : 'history', //使用history模式
    base: process.env.BASE_URL,
    routes
});
  • 3.將聲明的VueRouter導(dǎo)出
export default router
    1. 在入口main.js文件中導(dǎo)入router/index.js文件剖毯。 并且在Vue里注冊(cè)
      ps: 因?yàn)関ue-router底層默認(rèn)引用的就是router/index.js文件圾笨,所以可以簡(jiǎn)寫直接導(dǎo)入到router/目錄即可。
import router from "@/router";

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')
  • 上面的就是基礎(chǔ)配置逊谋,配置好了就可以使用了擂达。to是對(duì)應(yīng)執(zhí)行的路徑。
    <div class="centerText">
      <router-link to="/home">首頁</router-link>
      <router-link to="/about">關(guān)于</router-link>
      <router-link to="/user">用戶</router-link>
    </div>
    <router-view  />

router 一些常用字段

  • to 對(duì)應(yīng)路徑胶滋。
  • tag 設(shè)置類型板鬓。例如: tag="button",就是button樣式

router路徑定義傳參字段

// 可以通過:userId 即可
   {
        path: '/user/:userId/:age',
        name: 'User',
        component: () => import("../views/User.vue")
    }

v-bind:to使用,語法糖 :to

//通過name 進(jìn)行傳參
 <router-link :to="{name: 'User',params: {userId: 'xiaofang',age: 20}}">用戶</router-link>

this.$router常用字段

  • this.$router.push
    描述:跳轉(zhuǎn)到不同的url究恤,但這個(gè)方法回向history棧添加一個(gè)記錄俭令,點(diǎn)擊后退會(huì)返回到上一個(gè)頁面。
//跳轉(zhuǎn)路徑, 等同于 history.pushState() 
this.$router.push('home'); 

 //跳轉(zhuǎn)路徑
this.$router.push({path: '/about'}); 

// 跳轉(zhuǎn)路徑部宿,傳參數(shù)
this.$router.push({name: 'User',params: {userId: "123",age: 20}});

  • this.$router.replace()
    描述:同樣是跳轉(zhuǎn)到指定的url抄腔,但是這個(gè)方法不會(huì)向history里面添加新的記錄,點(diǎn)擊返回理张,會(huì)跳轉(zhuǎn)到上上一個(gè)頁面赫蛇。上一個(gè)記錄是不存在的。
//替換路徑, 等同于history.replaceState
this.$router.replace('home');
  • this.$router.go(n)
    相對(duì)于當(dāng)前頁面向前或向后跳轉(zhuǎn)多少個(gè)頁面,類似 window.history.go(n)雾叭。n可為正數(shù)可為負(fù)數(shù)悟耘。正數(shù)返回上一個(gè)頁面
//返回上一頁, 相當(dāng)于history.back()
this.$router.go(-1);

// 前進(jìn)一步,等同于history.forward
this.$router.go(1);

// 前進(jìn)3步
this.$router.go(3);

 // 如果history不夠用织狐,就默認(rèn)失敗吧
this.$router.go(-100);
this.$router.go(100);

router接收路由參數(shù)的方法作煌,分 ? 和 : 兩種接收方式
this.$route是路由信息對(duì)象

  • ? 形式的參數(shù)使用this.$route.query接收參數(shù),結(jié)果是一個(gè)對(duì)象赚瘦。
    接收格式為?userId=123&age=20
//1.定義方式粟誓。只定義路徑即可。
{
        path: '/about',
        name: 'About',
        component: () => import('../views/About')
}

//2. 傳參方式
 <router-link :to="{name: 'User',query: {userId: userId,age}}">關(guān)于</router-link>

//3. 接收方式
  • : 形式的參數(shù)使用this.$route.params接收參數(shù)起意,結(jié)果也是一個(gè)對(duì)象鹰服。
    例如傳參: :to({name: 'User',params: {userId: "123",age: 20}});
    接收格式為 /user/123/20
//1.定義方式
{
        path: '/user/:userId/:age',
        name: 'User',
        component: () => import("../views/User.vue")
}

//2.傳參方式
 <router-link :to="{name: 'User',params: {userId: userId,age}}">用戶</router-link>

//3.接收方式
 <p>接收參數(shù) userId:{{this.$route.params.userId}}  age:{{$route.params.age}}</p>
路由嵌套

開發(fā)中肯定會(huì)遇到路由嵌套的問題,路由嵌套進(jìn)一層精簡(jiǎn)了代碼,提高了組件的復(fù)用性悲酷,降低了代碼的耦合度套菜。

  • 在路由中定義子路由使用children[]來包含多個(gè)路由,這里要注意的是path不需要添加 /
{
        path: '/home',
        name: 'Home',
        children : [
            {
                path: '',
                // name: 'News',
                component : () => import('../components/News')
            },
            {
                path: 'news',
                name: 'News',
                component : () => import('../components/News')
            },
            {
                path: 'message',
                name: 'Message',
                component : () => import('../components/Message')
            }
        ],
        component: () => import('../views/Home')
    }
  • 使用路由嵌套同路由的正常使用一樣设易。要在對(duì)應(yīng)的路由.vue下使用逗柴,例如我上面定義的是在Home下的路由,那么路由應(yīng)該寫在Home.vue中
 <p>當(dāng)前為Home.vue頁面</p>
    <div>
      <router-link :to="{name: 'News'}" tag="button">新聞</router-link>
      <router-link :to="{name: 'Message'}" tag="button">消息</router-link>
    </div>
<router-view />
Vue 導(dǎo)航守衛(wèi)

提供的導(dǎo)航守衛(wèi)主要用來通過跳轉(zhuǎn)或取消的方式守衛(wèi)導(dǎo)航顿肺。有多種機(jī)會(huì)植入路由導(dǎo)航過程中:全局的, 單個(gè)路由獨(dú)享的, 或者組件級(jí)的戏溺。
通俗講,導(dǎo)航守衛(wèi)就是控制路由跳轉(zhuǎn)前屠尊,或離開路由后的監(jiān)聽操作

更多路由導(dǎo)航守衛(wèi)使用介紹訪問 官網(wǎng)

  • 組件內(nèi)守衛(wèi),也就是在組件內(nèi)才會(huì)執(zhí)行旷祸。
    beforeRouteEnter 守衛(wèi)進(jìn)入組件前調(diào)用
    beforeRouteUpdate 路由改變時(shí)調(diào)用
    beforeRouteLeave 離開該組件時(shí)候調(diào)用
<script>
// @ is an alias to /src
// import HelloWorld from '@/components/HelloWorld.vue'
import News from "@/components/News";
import Message from "@/components/Message";

export default {
  name: 'Home',
  data(){
    return {
      togglePath : null
    }
  }
  beforeRouteEnter(to, from, next) {
    // 在渲染該組件的對(duì)應(yīng)路由被 confirm 前調(diào)用
    // 不!能讼昆!獲取組件實(shí)例 `this`
    // 因?yàn)楫?dāng)守衛(wèi)執(zhí)行前托享,組件實(shí)例還沒被創(chuàng)建
    console.log("執(zhí)行home的b beforeRouteEnter 因?yàn)楫?dāng)守衛(wèi)執(zhí)行前,組件實(shí)例還沒被創(chuàng)建");
    next()
  },
  beforeRouteUpdate(to, from, next) {
    // 在當(dāng)前路由改變浸赫,但是該組件被復(fù)用時(shí)調(diào)用
    // 舉例來說闰围,對(duì)于一個(gè)帶有動(dòng)態(tài)參數(shù)的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉(zhuǎn)的時(shí)候既峡,
    // 由于會(huì)渲染同樣的 Foo 組件辫诅,因此組件實(shí)例會(huì)被復(fù)用。而這個(gè)鉤子就會(huì)在這個(gè)情況下被調(diào)用涧狮。
    // 可以訪問組件實(shí)例 `this`
    console.log("執(zhí)行home的b beforeRouteUpdate 因此組件實(shí)例會(huì)被復(fù)用炕矮。而這個(gè)鉤子就會(huì)在這個(gè)情況下被調(diào)用。");
    next()
  },
  beforeRouteLeave(to, from, next) {
    // 導(dǎo)航離開該組件的對(duì)應(yīng)路由時(shí)調(diào)用
    // 可以訪問組件實(shí)例 `this`
    this.togglePath = this.$route.path
    console.log("執(zhí)行home的b beforeRouteLeave 導(dǎo)航離開該組件的對(duì)應(yīng)路由時(shí)調(diào)用者冤。"+to.path+"\t"+from.path+"\t"+this.$route.path);
    next()
  },

}
</script>
keep-alive

keep-alive 是 Vue 內(nèi)置的一個(gè)組件肤视,可以使被包含的組件保留狀態(tài),或避免重新渲染涉枫。 不會(huì)進(jìn)入離開每次都執(zhí)行創(chuàng)建和銷毀邢滑。

更多動(dòng)態(tài)組件 & 異步組件使用見 官網(wǎng)

  • 基礎(chǔ)使用
<keep-alive>
  <component>
    <!-- 該組件將被緩存! -->
  </component>
</keep-alive>
  • 過濾路徑
<keep-alive include="abc">
  <component>
    <!-- name 為 abc 的組件將被緩存愿汰! -->
  </component>
</keep-alive>
<keep-alive exclude="demo">
  <component>
    <!-- 除了 name 為 demo 的組件都將被緩存困后! -->
  </component>
</keep-alive>
  • 如果想某個(gè)路徑網(wǎng)址被緩存,在router 里 增加 meta 屬性衬廷。其中keepAlive為true表示緩存摇予。
const routes = [
    {
        path: '/about',
        name: 'About',
        meta: {
            keepAlive: true //about路徑 需要緩存
        },
        component: () => import('../views/About')
    },
    {
        path: '/user/:userId/:age',
        name: 'User',
        meta: {
            keepAlive: false //user路徑 不需要緩存
        },
        component: () => import("../views/User.vue")
    }
];
  • 需求:
    默認(rèn)顯示 A
    B 跳到 A,A 不刷新
    C 跳到 A吗跋,A 刷新
    實(shí)現(xiàn)方式
//在 A 路由里面設(shè)置 meta 屬性:
{
        path: '/',
        name: 'A',
        component: A,
        meta: {
            keepAlive: true // 需要被緩存
        }
}
//在 B 組件里面設(shè)置 beforeRouteLeave:
export default {
        data() {
            return {};
        },
        methods: {},
        beforeRouteLeave(to, from, next) {
             // 設(shè)置下一個(gè)路由的 meta
            to.meta.keepAlive = true;  // 讓 A 緩存侧戴,即不刷新
            next();
        }
};
//在 C 組件里面設(shè)置 beforeRouteLeave:
export default {
        data() {
            return {};
        },
        methods: {},
        beforeRouteLeave(to, from, next) {
            // 設(shè)置下一個(gè)路由的 meta
            to.meta.keepAlive = false; // 讓 A 不緩存宁昭,即刷新
            next();
        }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酗宋,隨后出現(xiàn)的幾起案子积仗,更是在濱河造成了極大的恐慌,老刑警劉巖蜕猫,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寂曹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡回右,警方通過查閱死者的電腦和手機(jī)隆圆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楣黍,“玉大人匾灶,你說我怎么就攤上這事棱烂∽馄” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵颊糜,是天一觀的道長哩治。 經(jīng)常有香客問我,道長衬鱼,這世上最難降的妖魔是什么业筏? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮鸟赫,結(jié)果婚禮上蒜胖,老公的妹妹穿的比我還像新娘。我一直安慰自己抛蚤,他們只是感情好台谢,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岁经,像睡著了一般朋沮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缀壤,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天樊拓,我揣著相機(jī)與錄音,去河邊找鬼塘慕。 笑死筋夏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的图呢。 我是一名探鬼主播叁丧,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了拥娄?” 一聲冷哼從身側(cè)響起蚊锹,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稚瘾,沒想到半個(gè)月后牡昆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摊欠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年丢烘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片些椒。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡播瞳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出免糕,到底是詐尸還是另有隱情赢乓,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布石窑,位于F島的核電站牌芋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏松逊。R本人自食惡果不足惜躺屁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望经宏。 院中可真熱鬧犀暑,春花似錦、人聲如沸烁兰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缚柏。三九已至苹熏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間币喧,已是汗流浹背轨域。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杀餐,地道東北人干发。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像史翘,于是被迫代替她去往敵國和親枉长。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冀续,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Vue Router 是Vue.js[http://cn.vuejs.org/]官方的路由管理器。它和 Vue.j...
    SY閱讀 593評(píng)論 0 0
  • SEO:搜索引擎優(yōu)化必峰,前端路由:控制頁面訪問路徑洪唐,單頁面應(yīng)用后端路由:控制接口 一,實(shí)現(xiàn)前端路由的兩種方式: 1吼蚁,...
    FD__f392閱讀 1,507評(píng)論 0 1
  • 一. 概述 Vue Router 是 Vue.js 官方的路由管理器凭需。它和 Vue.js 的核心深度集成,讓構(gòu)建單...
    任未然閱讀 255評(píng)論 0 0
  • Vue Router簡(jiǎn)介 它是一個(gè)Vue.js官方提供的路由管理器肝匆。是一個(gè)功能更加強(qiáng)大的前端路由器粒蜈,推薦使用。Vu...
    王玉偉的偉閱讀 319評(píng)論 0 0
  • 本文面向純粹的vue路由小白旗国,采用 head first的文風(fēng)枯怖,重點(diǎn)在于解釋清楚vue路由的基本形象,傳達(dá)路由的設(shè)...
    水永舟亢閱讀 2,278評(píng)論 1 8