vue-路由

路由是什么

路由,其实就是指向,当我点击home导航按钮,页面显示home的内容,如果点击的是about,就切换成about的内容。

安装

1、直接引入包
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
2、npm下载

如果在一个模块化工程中使用它,必须要通过 Vue.use()明确的安装路由功能:在你的项目的src文件夹下的main.js文件内写入:

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

具体用法

1、基本路由
<div id="app">
    <div>
        <router-link to="/home">主页</router-link>   // 默认会被渲染成一个a标签,to属性为我们定义的路由
        <router-link to="/user" tag='li'>用户页</router-link>   // 如果不想渲染成a,可以在tag选项写其他标签
    </div>
    <div>
        <router-view></router-view>
    </div>
</div>
<script>
    var Home = {   // 定义组件
        template: '<p>我是主页的内容~</p>'
    }
    var User = {
        template: '<p>我是用户的内容~</p>'
    }
    const router = new VueRouter({   // 定义路由并配置路由
        routes: [
            {
              path: '*',   // 没有点击按钮或者填写路径错误默认跳转到 /home
              redirect: '/home'   // 这里就是路由的重定向
             },
            {
                path: '/home',   // 路径
                component: Home   // 组件
            },
            {
                path: '/user',
                component: User
            }
        ]
    })
    var vm = new Vue({
        el: '#app',
        router   // 注入路由
    })
</script>

效果:



点击主页按钮会显示主页的内容,点击用户按钮会显示用户的内容。

2、动态路由

上面我们定义的路由,都是严格匹配的,只有router-link 中的to属性和 js 中一条路由route中 path 一模一样,才能显示相应的组件. 但有时现实却不是这样的,当我们去访问网站并登录成功后,它会显示 欢迎你,+ 你的名字。不同的用户登录, 只是显示“你的名字” 部分不同,其它部分是一样的。这就表示,它是一个组件,假设是user组件。不同的用户(就是用户的id不同),它都会导航到同一个user 组件中。这样我们在配置路由的时候,就不能写死, 就是路由中的path属性,不能写死,那要怎么设置? 导航到 user 组件,路径中肯定有user, id 不同,那就给路径一个动态部分来匹配不同的id. 在vue-router中,动态部分 以 : 开头,那么路径就变成了 /user/:id, 这条路由就可以这么写: { path:"/user/:id", component: user }

<div id="app">
    <div>
        <router-link to="/home">主页</router-link>
        <router-link to="/user/123">用户123</router-link>
        <router-link to="/user/456">用户456</router-link>
    </div>
    <div>
        <router-view></router-view>
    </div>
</div>
<script>
    var Home = {
        template: '<p>我是主页的内容~</p>'
    }
    var User = {
        template: '<p>我是用户的内容~</p>'
    }
    const router = new VueRouter({
        routes: [
            {
                path: '/home',
                component: Home
            },
            {
                path: '/user/:id',
                component: User
            }
        ]
    })
    var vm = new Vue({
        el: '#app',
        router
    })
</script>

这时在页面中点击user123 和user456, 可以看到它们都导航到user组件,配置正确。

3、嵌套路由

嵌套路由,主要是由我们的页面结构所决定的。当我们进入到user页面的时候,它下面还有分类,登陆页面,注册页面,这时,用法如下:

<div id="app">
    <div>
        <router-link to="/home">主页</router-link>
        <router-link to="/user">用户</router-link>
    </div>
    <div>
        <router-view></router-view>
    </div>
</div>
<script type="text/x-template" id="user">
    <div>
        <div>
            <router-link to="/user/login">登陆</router-link>
            <router-link to="/user/reg">注册</router-link>
        </div>
        <div>
            <router-view></router-view>
        </div>
    </div>
</script>
<script>
    var Home = {
        template: '<p>我是主页的内容~</p>'
    }
    var User = {
        template: '#user'
    }
    var Login = {
        template: '<p>我是登陆页的内容~</p>'
    }
    var Reg = {
        template: '<p>我是注册页的内容~</p>'
    }
    const router = new VueRouter({
        routes: [
            {
                path: '/home',
                component: Home
            },
            {
                path: '/user',
                component: User,
                children: [   // 书写子路由
                    {
                        path: 'login',
                        component: Login
                    },
                    {
                        path: 'reg',
                        component: Reg
                    }
                ]
            }
        ]
    })
    var vm = new Vue({
        el: '#app',
        router
    })
</script>

效果:


4、命名路由

有时我们通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候。你可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称。

<div id="app">
    <div>
        <router-link :to="{name: 'home'}">主页</router-link>
        <router-link :to="{name: 'user'}">用户页</router-link>
    </div>
    <div>
        <router-view></router-view>
    </div>
</div>
<script>
    var Home = {
        template: '<p>我是主页的内容~</p>'
    }
    var User = {
        template: '<p>我是用户的内容~</p>'
    }
    const router = new VueRouter({
        routes: [
            {
                path: '*',
                redirect: '/home'
            },
            {
                path: '/home',
                name: 'home',
                component: Home
            },
            {
                path: '/user',
                name: 'user',
                component: User
            }
        ]
    })
    var vm = new Vue({
        el: '#app',
        router  
    })
</script>
5、路由传参

5.1、query

<div id="app">
    <div>
        <router-link to="/home?name=tom&age=24">主页</router-link>   // 参数在这里书写
        <router-link to="/user">用户页</router-link>
    </div>
    <div>
        <router-view></router-view>
    </div>
</div>
<script>
    var Home = {
        template: '<p>我是主页的内容~---{{$route.query}}</p>'   // 通过 $route.query 获取
    }
    var User = {
        template: '<p>我是用户的内容~</p>'
    }
    const router = new VueRouter({
        routes: [
            {
                path: '/home',
                component: Home
            },
            {
                path: '/user',
                component: User
            }
        ]
    })
    var vm = new Vue({
        el: '#app',
        router
    })
</script>

5.2、 params

<div id="app">
    <div>
        <router-link to="/home/jack/25/sing">主页</router-link>   // 这里直接写值,不用写参数名
        <router-link to="/user">用户页</router-link>
    </div>
    <div>
        <router-view></router-view>
    </div>
</div>
<script>
    var Home = {
        template: '<p>我是主页的内容~---{{$route.params}}</p>'   // 通过 $route.params 获取
    }
    var User = {
        template: '<p>我是用户的内容~</p>'
    }
    const router = new VueRouter({
        routes: [
            {
                path: '/home/:name/:age/:likes',   // 这里定义参数名
                component: Home
            },
            {
                path: '/user',
                component: User
            }
        ]
    })
    var vm = new Vue({
        el: '#app',
        router
    })
</script>

效果:


ps.以上俩种差异:如果要隐藏参数用params,如果强制刷新不被清除用query

6、编程式导航

除了使用 <router-link> 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现。
6.1、router-push()

router.push(location)
<div id="app">
    <div>
        <button @click="push">push</button>   // 定义方法
        <router-link to="/home">主页</router-link>
        <router-link to="/user">用户页</router-link>
    </div>
    <div>
        <router-view></router-view>
    </div>
</div>
<script>
    var Home = {
        template: '<p>我是主页的内容~</p>'
    }
    var User = {
        template: '<p>我是用户的内容~</p>'
    }
    const router = new VueRouter({
        routes: [
            {
                path: '/home',
                component: Home
            },
            {
                path: '/user',
                component: User
            }
        ]
    })
    var vm = new Vue({
        el: '#app',
        router,
        methods: {
            push: function () {
                router.push( 'home' );   
            }
        }
    })
</script>


// 1、字符串
router.push( 'home' );   // 这里的字符串是路径,而不是name,不用加/

// 2、对象
router.push( {path: '/home'} );

// 3、命名的路由
router.push({name: 'home',params: {color: 'green'}});   // 这里用name,不能用path

// 4、带查询参数
router.push({path: '/home',query: {age: 25}});

6.2、router.go(n)
这个方法的参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n)。

router.go(1);

6.3、router.replace()
跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。

router.replace('home');
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容