路由的概念

路由的概念

路由是根据不同的 url 地址展示不同的内容或页面

早期的路由都是后端直接根据 url 来 reload 页面实现的,即后端控制路由。

后来页面越来越复杂,服务器压力越来越大,随着 ajax(异步刷新技术) 的出现,页面实现非 reload 就能刷新数据,让前端也可以控制 url 自行管理,前端路由由此而生。

单页面应用的实现,就是因为前端路由

  1. 安装
    cnpm i -S vue-router

  2. 新建src/router/index.js

// 导入vue
import Vue from 'vue';
// 导入路由
import VueRouter from 'vue-router';
// 导入路由路径对应的组件
import Szc from '@/components/Szc';
// vue使用路由
Vue.use(VueRouter);

// 抛出路由的实例
export default new VueRouter({
    routes: [
        {
            path: '/', // 链接
            component: Szc // 组件模板,
            
        }
    ]
});
  1. src/main.js
import Vue from 'vue';
import App from './App';

// 导入路由
import router from './router'

new Vue({
    el: "#root",
    router, // 挂载路由, 从而使得整个应用都有路由功能
    render: h => h(App)
});
  1. router-view 用于渲染匹配到的组件

  2. router-link

是一个组件,它默认会被渲染成一个带有链接的a标签,通过to属性指定链接地址
注意:被选中的router-link将自动添加一个class属性值.router-link-active
to:导航路径,要填写的是你在router/index.js文件里配置的path值,如果要导航到默认首页,只需要写成 to="/"

tag: 转为指定标签名

[首页] :就是我们要显示给用户的导航名称

<router-link to="/">首页</router-link>
  1. 动态路由匹配

一个『路径参数』使用冒号 : 标记。当匹配到一个路由时,参数值会被设置到this.route.params,可以在每个组件内使用 模式 | 匹配路径 |route.params
/user/:username | /user/evan | { username: 'evan' }
/user/:username/post/:post_id | /user/evan/post/123 | { username: 'evan', post_id: '123' }
.,/


```html
<div>User {{ $route.params.id }}</div>
  1. 通过<router-link> 标签中的to传参
<router-link :to="{name:'路由名称',params:{key:value}}">路由</router-link>
  1. name:就是我们在路由配置文件中起的name值。
    另:命名路由就是用一个名称来标识一个路由,在定义路由的时候设置一个name属性即可。在router-link中也可以用路由的名字来链接到一个路由。

params:就是我们要传的参数,它也是对象形式,在对象里可以传递多个值。
最后用$route.params.username进行接收

  1. 路由的重定向
  2. redirect基本重定向
const routes = [
  { path: '/', redirect: '/goods'}
]
// 重定向的目标也可以是一个命名的路由
const routes = [
  { path: '/', redirect: { name: 'goods' }}
]
// 重定向时也可以传递参数
{
  path:'/',
  redirect:'/goods/:newsId/:userName'
}
  1. 通过别名进行重定向
// 定义路由的时候可以同时定义路由的别名
{    path: '/home',
    component: Home,
    alias:'/h'
 }

可以直接使用router-link中的to属性,进行重定向

<router-link to="/h">home</router-link>

区别:

redirect:仔细观察URL,redirect是直接改变了url的值,把url变成了真实的path路径。

alias:URL路径没有别改变,这种情况更友好,让用户知道自己访问的路径,只是改变了<router-view>中的内容
注意: 别名alias在path为'/'中,是不起作用的

编程式导航

router.push(location)

注意:在 Vue 实例内部,你可以通过 router 访问路由实例。因此你可以调用 this.router.push

想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL

// 字符串
router.push('home')

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

// 命名的路由
router.push({ name: 'user', params: { userId: '123' }})

// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})

注意:如果提供了 path,params 会被忽略,上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path:

const userId = '123'
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user

router.replace(location)

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

声明式

<router-link :to="..." replace> 

编程式

router.replace(...)

router.go(n)

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

// 在浏览器记录中前进一步,等同于 history.forward()
router.go(1)

// 后退一步记录,等同于 history.back()
router.go(-1)

// 前进 3 步记录
router.go(3)

// 如果 history 记录不够用,那就默默地失败呗
router.go(-100)
router.go(100)
  1. 嵌套路由

const router = new VueRouter({
  routes: [
    { path: '/user/:id', component: User,
      children: [
        {
          // 当 /user/:id/profile 匹配成功,
          // UserProfile 会被渲染在 User 的 <router-view> 中
          path: 'profile',
          component: UserProfile
        },
        {
          // 当 /user/:id/posts 匹配成功
          // UserPosts 会被渲染在 User 的 <router-view> 中
          path: 'posts',
          component: UserPosts
        }
      ]
    }
  ]
})

注意: 要注意,以 / 开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径

  1. 命名路由

给某个路由设置名称, 通过一个名称来标识一个路由

const router = new VueRouter({
  routes: [
    {
      path: '/user/:userId',
      name: 'user', // 
      component: User
    }
  ]
})
<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>
router.push({ name: 'user', params: { userId: 123 }})
  1. 命名视图
<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
<router-view class="view three" name="b"></router-view>
const router = new VueRouter({
  routes: [
    {
      path: '/',
      components: { // 多个组件
        default: Foo,
        a: Bar,
        b: Baz
      }
    }
  ]
})
  1. 路由对象属性
    $route.path
    类型:string
    字符串,对象当前路由的路径, 总是解析为绝对路径

$route.params
类型 : object
一个key/value 对象,包含了动态片段和全匹配片段,如果没有路由参数,就是一个空对象

route.query 类型 :Object 一个key/value对象,表示URL查询参数,例如,对于路由/foo?user=1,则有route.query.user==1 ,如果没有查询参数,则是空对象

route.hash 类型:string 当前路由的hash只,带# 如果没有hash值则为空字符串route.fullPath
类型 :string
完成解析后的URL,包含查询参数和hash的完整路径

$route.matched
类型:Array<RouteRecord>
一个数组,包含当前路由所有嵌套路径片段的路有记录,路由记录就是routes配置数组中的对象副本(还包括children数组)

$route.name
当前路由的名称,如果有的话

$route.redirectedFrom
如果存在重定向,即为重定向来源的路由的名字

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

推荐阅读更多精彩内容