vue-router基础

Vue-router学习指南

日记:本文按照vue-router官网的知识结合例子进行分析和讲解,搭建工具(vue-cli,vue-router

基本搭建

  1. 安装vue-cli

    npm install -g vue-cli
    
  2. 通过webpack搭建

    // 初始化项目
    vue init webpack Your-projectName
    // 安装依赖
    npm i 
    // 启动项目
    npm run dev
    
  3. 项目结构

目录结构.png

搭建解析

  1. route下面的index(一个主观的认识,之后会有详细的解释和干货)

    // 引入依赖
    import Vue from 'vue'
    import Router from 'vue-router'
    
    // 引入组件
    import DemoAbout from '@/components/DemoAbout'
    import DemoContact from '@/components/DemoContact'
    import DemoHome from '@/components/DemoHome'
    import DemoContactChild1 from '@/components/DemoContactChild1'
    
    //vue使用vue-router 
    Vue.use(Router)
    // 导出内容给main.js使用
    export default new Router ({
         // routes数组,里面是每一个路由配置  
        routes: [
        {
          path: '/', 
          name: 'Home', 
          component: DemoHome
        },
        {
          path: '/contact/:id?',
          name: 'Contact',
          component: DemoContact,
          children: [
            {
              path: 'hello',
              component: DemoContactChild1
            }
          ]
        },
        {
          path: '/about',
          name: 'About',
          component: DemoAbout
        },
      ]
    })
    
    • 解析

      1. path: 对应的路径。name: 路由的命名。component: 对应的组件

      2. 上面的@是怎么来的呢?通过webpack的别名alias来定义目录

        // 找到build下面的webpack.base.conf.js配置 21行
          resolve: {
            extensions: ['.js', '.vue', '.json'],
            alias: {
              'vue$': 'vue/dist/vue.esm.js',
              '@': resolve('src')
            }
          },
          // 找到resolve 6行
          function resolve (dir) {
            return path.join(__dirname, '..', dir)
          }  
         // 所以得到@是运行文件下的src的简写
        

路由解析

  1. 简单的路由配置

    //组件
    const Foo = {template: '<div>Foo</div>'};
    const Bar = {template: '<div>Bar</div>'};
    // 先来一个简单的路由配置
    const routes = [
      {path: '/foo', component: Foo},
      { path: '/bar', component: Bar }
    ]
    // 我们需要实例化routes
    const route = new Router({
         routers
    })
    // 然后我们需要挂载实例并通过route组件路由,然后就可以全局使用了
    const app = new Vue({
      el: '#app',
      route
    })
    

    通过上面的例子,我们已经对路由有了一个大致的认识,接下来介绍动态路由配置和嵌套路由

  2. 动态路由配置和嵌套路由

    动态设置路由: 以冒号开头。{ path: '/user/:id', component: User }通过{{$route.params.id}}或者this.$route.params.id获取值。

    // 如果学习了express.js的部分就知道,对应路由的配置是可以通过正则和动态路由参数来传递
    {
      path: '/contact/:id?', //正则匹配,可以传递id也可以不传id
      name: 'Contact',
      component: DemoContact,
    }
    <div>{{$route.params.id}}</div>  
    

    高级路由配置

    模式 匹配路径 $route.params
    /user/:username /user/evan { username: 'evan' }
    /user/:username/post/:post_id /user/evan/post/123 { username: 'evan', post_id: 123 }
    /user/:username/post/:id? /user/evan/post { username: 'evan' }

    路由嵌套:页面通过<router-view></router-view>实现页面的显示路由,我们在路由中通过children来配置子路由单元。通过页面的router-view来展示相应的子路由

    <! --我们在DemoContact中配置router-view -->
    <template>
      <div id="contact">
        <h2>this is contact</h2>
        <!--设置子路由配置-->
        <router-view></router-view>
      </div>
    </template>
    
    // 通过children子元素来配置相应的子路由单元
    routes: [
      {
          path: '/contact/:id',
          name: 'Contact',
          component: DemoContact,
          children: [
            {
              path: 'hello',
              component: DemoContactChild1
            }
          ]
      },
    ]
    

    注意: 由于带有/就是目录的根目录,所以我们在配置子路由的时候不要写成/hello,否则就不会配置相应的路径。


  3. 编程式路由

    需求:如果我们需要在组建的js部分跳转页面怎么弄?

    在html模板中,我们可以通过router-link来显示页面路由的跳转,在js模板中,我们则需要通过router.push()来实现

    • router.push(location) 如果不是绝对目录就会替换当前路由的最后一个路径配置

      // 字符串跳转path
      // 当前页面是http://localhost:8080/#/contact
      router.push('home')   //http://localhost:8080/#/about
      // 当前页面是http://localhost:8080/#/contact/600
      router.push('home')      // http://localhost:8080/#/about
      router.push('/home')    //http://localhost:8080/#/about
      
      // 对象
      router.push({ path: 'home' })
      
      //路由的命名
      router.push({ name: 'user', params: { id: 123 }})
      
      // 带查询参数,变成 /register?plan=private
      router.push({ path: 'register', query: { plan: 'private' }})
      
      //js模板中使用
      this.$route.push()
      this.$router.push({name: 'Contact',params: {id: 6000}})  //注意带参数。一定是name
      

      特别注意:当我们需要传递params的时候,一定是通过name来实现页面的跳转,不能通过path。

      声明式 编程式
      <router-link :to="..."> router.push(...)

  4. 命令路由

    有时候,我们需要通过一个简单的名字来实现跳转,这样我们可以在实例化路由的时候,通过name,来实现跳转和传参。

    // 通过name来实例化路由配置
    const router = new VueRouter({
      routes: [
        {
          path: '/user/:userId',
          name: 'user',
          component: User
        }
      ]
    })
    

    跳转通过name来定义的路由配置

    <router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>
    

    代码js调用路由配置

    this.$router.push({name: 'user',params: {userId: 123}}) 
    

    上述2中方式都会把路由导航到name: user相对应的路由配置/user/123


  1. 命名视图

如果你想一个页面同时展示多个视图,而不是嵌套展示。例如:一个布局,有左边栏(sidebar)和 main(主内容)2个视图。这个时候命名视图就起到作用了,你可以在页面中拥有多个单独命名的视图,而不是只有一个单独的视图出口。如果router-view没有设置名称,则默认的是default

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

一个视图使用一个组件渲染,如果对于同一个路由,多个视图就需要多个组件。确保正确使用 components 配置(带上 s):

const router = new VueRouter({
  routes: [
    {
      path: '/',
      components: {
        default: Foo,
        a: Bar,
        b: Baz
      }
    }
  ]
})

所以当我们浏览器访问根目录的时候,会渲染三个视图,分别对应三个组件。


  1. 重定向和别名

重定向:指的是当我们访问一个路由的时候,需要把这个路由重新定位到一个新的路由,不使用原来的组件

别名: 当我们访问一个路由的时候,给它起一个小名,当我们访问这个小名的时候,还是会跳到那个路由。

重定向

重定向也是通过 routes 配置来完成,下面例子是从 /a 重定向到 /b

const router = new VueRouter({
  routes: [
    {
      path: '/a',
      redirect: '/b',
      component: '...'
    }
  ]
})

重定向的目标也可以是一个命名空间的路由

const router = new VueRouter({
  routes: [
    {
      path: '/a',
      redirect: {name: 'foo'}
    }
  ]
})

甚至是一个方法,动态返回重定向目标

别名

『重定向』的意思是,当用户访问 /a时,URL 将会被替换成 /b,然后匹配路由为 /b,那么『别名』又是什么呢?

/a 的别名是 /b,意味着,当用户访问 /b 时,URL 会保持为 /b,但是路由匹配则为 /a,就像用户访问 /a 一样。

上面对应的路由配置为:

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

推荐阅读更多精彩内容