vue路由

http://router.vuejs.org/zh-cn/

動(dòng)態(tài)路由匹配(路由傳參)

我們經(jīng)常需要把某種模式匹配到的所有路由瀑志,全都映射到同個(gè)組件沸柔。例如坞笙,我們有一個(gè) User 組件闷供,對(duì)于所有 ID 各不相同的用戶(hù)仍稀,都要使用這個(gè)組件來(lái)渲染拳芙。那么假勿,我們可以在 vue-router 的路由路徑中使用『動(dòng)態(tài)路徑參數(shù)』(dynamic segment)來(lái)達(dá)到這個(gè)效果:

const router = new VueRouter({
    routes: [
        { path: '/user/:id', component: User }
    ]
})

現(xiàn)在呢,像 /user/foo/user/bar 都將映射到相同的路由态鳖。

傳參

在需要進(jìn)行頁(yè)面跳轉(zhuǎn)傳值的地方转培,傳遞參數(shù),在子路由頁(yè)面中可以接收到

使用router-link標(biāo)簽的to屬性進(jìn)行參數(shù)的傳遞

聲明式傳參數(shù) <router-link to="..."></router-link>

<li v-for="(item, index) in data">
    <router-link :to="'/user/' + item.activity.name">
        <img :src="item.activity.img" :style="{ width: '200px' }" alt="">
        <p>{{ item.activity.name }}</p>
    </router-link>
</li>

編程式傳參 $router.push()

<li v-for="(item, index) in data" @click="push(item.activity)">
    <img :src="item.activity.img" :style="{ width: '200px' }" alt="">
    <p>{{ item.activity.name }}</p>
</li>
push(item) {
    // 在方法中進(jìn)行路由跳轉(zhuǎn)浆竭,并傳遞參數(shù)
    // this.$router.push('/listdetail/' + item.name)
    
    // 帶查詢(xún)參數(shù)浸须,變成 /listdetail/abc?plan=private
    this.$router.push({
        path: '/listdetail/' + item.name, // 路徑
        query: { // 查詢(xún)參數(shù)
            plan: 'private'
        }
    })
}

接參

使用$route.params屬性接收參數(shù)

<template lang="html">
    <div id="list-detail">
        <!-- 在模板中直接接收 -->
        <h2>{{ $route.params.id }}</h2>
        <h2>{{ id }}</h2>
    </div>
</template>

<script>
export default { 
    data() {
        return { // 在數(shù)據(jù)中接收
            id: this.$route.params.id
        }
    }
}
</script>

返回按鈕

使用history.back()可以返回上一頁(yè)

注意:不可以直接寫(xiě)在@click中惨寿,需要寫(xiě)在methods內(nèi)部

<button @click="back">返回</button>
methods: {
    back() {
        history.back()
    }
}

響應(yīng)路由參數(shù)的變化

提醒一下,當(dāng)使用路由參數(shù)時(shí)删窒,例如從 /user/foo 導(dǎo)航到 user/bar裂垦,原來(lái)的組件實(shí)例會(huì)被復(fù)用。因?yàn)閮蓚€(gè)路由都渲染同個(gè)組件肌索,比起銷(xiāo)毀再創(chuàng)建蕉拢,復(fù)用則顯得更加高效。不過(guò)诚亚,這也意味著組件的生命周期鉤子不會(huì)再被調(diào)用晕换。

復(fù)用組件時(shí),想對(duì)路由參數(shù)的變化作出響應(yīng)的話(huà)站宗,你可以簡(jiǎn)單地 watch(監(jiān)測(cè)變化) $route 對(duì)象:

watch: {
    '$route' (to, from) {
        // 對(duì)路由變化作出響應(yīng)...
    }
}

命名路由的使用

在定義路由的時(shí)候闸准,可以定義一個(gè)name屬性,后續(xù)使用會(huì)很方便

const routes = [
    { name: 'home', path: '/home', component: Home }
]

路由跳轉(zhuǎn)時(shí)梢灭,可以直接使用name屬性

<!-- 聲明式 -->
<router-link :to="{ name: 'home' }">Home</router-link>
// 編程式
this.$router.push({
    name: 'home'
})

命名視圖

有時(shí)候想同時(shí)(同級(jí))展示多個(gè)視圖夷家,而不是嵌套展示,例如創(chuàng)建一個(gè)布局敏释,有 sidebar(側(cè)導(dǎo)航) 和 main(主內(nèi)容) 兩個(gè)視圖库快,這個(gè)時(shí)候命名視圖就派上用場(chǎng)了。你可以在界面中擁有多個(gè)單獨(dú)命名的視圖钥顽,而不是只有一個(gè)單獨(dú)的出口义屏。如果 router-view 沒(méi)有設(shè)置名字,那么默認(rèn)為 default耳鸯。

<router-view class="a" name="a"></router-view>
<router-view class="b" name="b"></router-view>

一個(gè)視圖使用一個(gè)組件渲染,因此對(duì)于同個(gè)路由膀曾,多個(gè)視圖就需要多個(gè)組件县爬。確保正確使用 components 配置(帶上 s):

const routes = [
    { path: '/mine', component: Mine, children: [
        { path: '', component: One },
        { path: 'one', components: {
            a: One,
            b: Two
        }},
        { path: 'two', components: {
            a: Two,
            b: One
        } },
    ]}
]

HTML5 History模式

vue-router 默認(rèn) hash 模式 —— 使用 URL 的 hash 來(lái)模擬一個(gè)完整的 URL,于是當(dāng) URL 改變時(shí)添谊,頁(yè)面不會(huì)重新加載财喳。

如果不想要很丑的 hash,我們可以用路由的 history 模式斩狱,這種模式充分利用 history.pushState API 來(lái)完成 URL 跳轉(zhuǎn)而無(wú)須重新加載頁(yè)面耳高。

const router = new VueRouter({
    mode: 'history',
    routes: [...]
})

匹配其它錯(cuò)誤路由

const routes = [
    { path: '*', component: NotFound }
]

導(dǎo)航鉤子

讓我們清楚的知道路由的跳轉(zhuǎn)順序

// 導(dǎo)航鉤子
router.beforeEach((to, from, next) => {
    console.log(to); // 要進(jìn)入的路由
    console.log(from); // 要離開(kāi)的路由
    next()
})

// 路由跳轉(zhuǎn)之后
router.afterEach(router => {
    console.log(router)
})

某個(gè)路由獨(dú)享的鉤子

export default {
    name: 'mine',
    beforeRouteEnter(fo, from, next) {
        next(vm => {
            // 當(dāng)前組件的實(shí)例
            console.log(vm);
        })
        // 在渲染該組件的對(duì)應(yīng)路由被 confirm 前調(diào)用
        // 不!能所踊!獲取組件實(shí)例 `this`
        // 因?yàn)楫?dāng)鉤子執(zhí)行前泌枪,組件實(shí)例還沒(méi)被創(chuàng)建
        console.log('beforeRouteEnter');
    },
    beforeRouteUpdate(to, from, next) {
        next()
        // 在當(dāng)前路由改變,但是該組件被復(fù)用時(shí)調(diào)用
        // 舉例來(lái)說(shuō)秕岛,對(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)用愈捅。
        // 可以訪(fǎng)問(wèn)組件實(shí)例 `this`
        console.log('beforeRouteUpdate');
    },
    beforeRouteLeave(to, from, next) {
        next()
        // 導(dǎo)航離開(kāi)該組件的對(duì)應(yīng)路由時(shí)調(diào)用
        // 可以訪(fǎng)問(wèn)組件實(shí)例 `this`
        console.log('beforeRouteLeave');
    }
}

數(shù)據(jù)獲取

導(dǎo)航完成后獲取數(shù)據(jù)

當(dāng)你使用這種方式時(shí),我們會(huì)馬上導(dǎo)航和渲染組件慈鸠,然后在組件的 created 鉤子中獲取數(shù)據(jù)蓝谨。這讓我們有機(jī)會(huì)在數(shù)據(jù)獲取期間展示一個(gè) loading 狀態(tài),還可以在不同視圖間展示不同的 loading 狀態(tài)青团。

<template>
    <div id="market">
        <div class="loading" v-if="loading">
            <h1>Loading</h1>
        </div>

        <div class="error" v-if="error">
            <h1>Error</h1>
        </div>

        <div class="content" v-if="market">
            <h1>market</h1>
            <hr>
            <list :url="url" category="menu"></list>
        </div>
    </div>
</template>

<script>
import List from '../components/List'
export default {
    name: 'market',
    data() {
        return {
            url: 'http://www.vrserver.applinzi.com/aixianfeng/apihome.php',
            loading: false,
            error: null,
            market: null
        }
    },
    components: { List },
    created() {
        this.fetchData()
    },
    methods: {
        fetchData() {
            this.loading = true
            setTimeout(() => {
                console.log(this);
                this.loading = false
                this.market = true
            }, 1000);
        }
    }
}
</script>

<style>
#market h1 {
    color: purple;
}
</style>

當(dāng)前tabbar的選中效果

<router-link> 組件支持用戶(hù)在具有路由功能的應(yīng)用中(點(diǎn)擊)導(dǎo)航譬巫。 通過(guò) to 屬性指定目標(biāo)地址,默認(rèn)渲染成帶有正確鏈接的 <a> 標(biāo)簽壶冒,可以通過(guò)配置 tag 屬性生成別的標(biāo)簽.缕题。另外,當(dāng)目標(biāo)路由成功激活時(shí)胖腾,鏈接元素自動(dòng)設(shè)置一個(gè)表示激活的 CSS 類(lèi)名烟零。

只需要在app.vue中添加樣式即可

<router-link to="/home" tag="li"></router-link>

/* 當(dāng)前被點(diǎn)擊的router-link會(huì)自動(dòng)添加router-link-active類(lèi)名 */
.router-link-active {
    background-color: hotpink;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咸作,隨后出現(xiàn)的幾起案子锨阿,更是在濱河造成了極大的恐慌,老刑警劉巖记罚,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墅诡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡桐智,警方通過(guò)查閱死者的電腦和手機(jī)末早,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)说庭,“玉大人然磷,你說(shuō)我怎么就攤上這事】浚” “怎么了姿搜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)捆憎。 經(jīng)常有香客問(wèn)我舅柜,道長(zhǎng),這世上最難降的妖魔是什么躲惰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任致份,我火速辦了婚禮,結(jié)果婚禮上础拨,老公的妹妹穿的比我還像新娘知举。我一直安慰自己瞬沦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布雇锡。 她就那樣靜靜地躺著逛钻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锰提。 梳的紋絲不亂的頭發(fā)上曙痘,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音立肘,去河邊找鬼边坤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谅年,可吹牛的內(nèi)容都是我干的茧痒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼融蹂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旺订!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起超燃,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤区拳,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后意乓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體樱调,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年届良,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笆凌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡士葫,死狀恐怖乞而,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情为障,我是刑警寧澤晦闰,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布放祟,位于F島的核電站鳍怨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跪妥。R本人自食惡果不足惜鞋喇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眉撵。 院中可真熱鬧侦香,春花似錦落塑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至散吵,卻和暖如春龙考,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矾睦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工晦款, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枚冗。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓缓溅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赁温。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坛怪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 配置 如果在一個(gè)模塊化工程中使用它,必須要通過(guò)Vue.use()明確地安裝路由功能: 基礎(chǔ) Getting Sta...
    回調(diào)的幸福時(shí)光閱讀 540評(píng)論 0 0
  • vue2有著深度繼承的路由插件束世,即:vue-router酝陈,其中文的API地址。 vue-router與其他的路由(...
    白水螺絲閱讀 17,526評(píng)論 0 17
  • 這是我第5篇簡(jiǎn)書(shū)。 ??由于Vue在開(kāi)發(fā)時(shí)對(duì)路由支持的不足贫堰,于是官方補(bǔ)充了vue-router插件穆壕。vue的單頁(yè)面...
    東西里閱讀 44,739評(píng)論 20 212
  • 前端路由的優(yōu)缺點(diǎn): 優(yōu)點(diǎn):用戶(hù)體驗(yàn)好,不需要每次都從服務(wù)器獲取其屏,快速展現(xiàn)給用戶(hù)缺點(diǎn):1)不利于SEO喇勋;2) 使用瀏...
    飛飛廉閱讀 269評(píng)論 0 0
  • 翻修房孑快3個(gè)月了,至今還留有尾巴沒(méi)有整好偎行。我和妻子一直是耿耿于懷川背。 昨天,包工頭又打電話(huà)催要余款蛤袒,妻子說(shuō)先不給他...
    就愛(ài)西郭先生閱讀 209評(píng)論 0 0