vue记录---路由(vue-router)

二、路由(vue-router)

1)安装

使用如下命令进行安装vue-router。

cnpm i vue-router -S
2)配置路由
// 文件路径src/router/index.js
import Vue from 'vue';
import VueRouter from 'vue-router';

import Home from '@/view/Home';
import Login from '@/view/Login';
import Register from '@/view/Register';
import Search from '@/view/Search';

// 使用VueRouter插件
Vue.use(VueRouter)

export default new VueRouter({
  // 配置路由模式
  mode: "hash",
  // 配置路由规则
  routes: [
    {
      path: "/home",
      component: Home,
    },
    {
      path: "/login",
      component: Login,
    },
    {
      path: "/register",
      component: Register,
    },
    {
      path: "/search",
      component: Search,
    },
    {
      path: "/",
      redirect: "/home", // 重定向到/home
    },
  ]
})

3)注册路由
// 文件路径src/main.js
import Vue from 'vue'
import App from './App.vue'
// 引入配置好的路由
import router from '@/router';

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  // 注册路由
  router
}).$mount('#app')

4)使用路由
  1. 使用router-view标签,作为路由组件需要显示的内容占位。
      <template>
        <div id="app">
          <Header/>
          <router-view></router-view>
          <Footer/>
        </div>
      </template>
    
    
  2. 路由跳转
    • 声明式路由跳转(router-link)备注:需要注意使用此方式时,一定需要在router-link标签中\color{red}{添加 to 属性}
      <p>
        <span>请</span>
        <router-link to="/login">登录</router-link>
        <router-link to="/register" class="register">免费注册</router-link>
      </p>
      
    • 函数式路由跳转(this.$router.push)
      // 处理点击搜索
      handleSearch() {
        this.$router.push('/search')
      }
      
5)路由传参(编程式路由跳转传参)
  1. 传递参数
    • 传递query参数

        // 处理点击搜索
        handleSearch() {
          // 传递query参数方式一,字符串传参
          // this.$router.push("/search?keyword=" + this.keyword)
          // 传递query参数方式二,模板字符串传参
          // this.$router.push(`/search?keyword=${this.keyword}`)
          // 传递query参数方式三,对象形式传参
          this.$router.push({
            path: 'search',
            query: {
              keyword: this.keyword
            }
          })
        }
      

      使用$route.query.keyword接收。

      <h1>params参数是:{{$route.params.keyword}}</h1>
      
    • 传递params参数

      handleSearch() {
        // 传递params参数方式一,字符串传参
        // this.$router.push("/search/" + this.keyword)
        // 传递params参数方式二,模板字符串传参
        // this.$router.push(`/search/${this.keyword}`)
        // 传递params参数方式二,对象形式传参
        this.$router.push({
          name: 'search',
          params: {
            keyword: this.keyword
          }
        })
      }
      

      \color{red}{注意:传递params参数时需要重新配置路由。例如如下配置:}

      {
        /**
         * 采用对象形式传递params参数时,需要为路由添加name属性。
        * 通过name属性进行传递,不可通过path进行传递。
        */
        name: "search",
        // 采用非对象形式传递params参数时,需要使用“/:keyword”进行占位,
        path: "/search/:keyword",
        component: Search,
      }
      

      使用$route.params.keyword进行接受

      <h1>params参数是:{{$route.params.keyword}}</h1>
      
    • 关于params参数传递补充:

      • \color{red}{通过对象形式进行传递params参数时,不可与path结合,只能重新给路由添加name属性配置,使其与name进行结合。}
      • \color{red}{如使其params参数可传可不传时,需要在路由配置中占位符之后添加“?”,例如下配置:}
        {
          /**
          * 采用对象形式传递params参数时,需要为路由添加name属性。
          * 通过name属性进行传递,不可通过path进行传递。
          */
          name: "search",
          // 采用非对象形式传递params参数时,需要使用“/:keyword”进行占位,
          path: "/search/:keyword?",// ? ==> 可是其keyword可传可不传
          component: Search,
          meta: {
            footerIsShow: true
          }
        }
        
      • \color{red}{在params参数可传可不传的前提下,给params参数传递为空时,需要借助undefined进行处理,例如下所示:}
        this.$router.push({
          name: 'search',
          params: {
            keyword: ""||undefined
          }
        })
        
      • \color{red}{路由进行传递参数时,可借助props进行传递,在路由组件获取值时,则与获取父组件中的值方法一至,需对路由进行配置,如下配置所示:}
        {
          /**
          * 采用对象形式传递params参数时,需要为路由添加name属性。
          * 通过name属性进行传递,不可通过path进行传递。
          */
          name: "search",
          // 采用非对象形式传递params参数时,需要使用“/:keyword”进行占位,
          path: "/search/:keyword?",// ? ==> 可是其keyword可传可不传
        
          // 借助props进行传递参数
          // props: true, // 传递方式一、Boolean值的情况
          // props: {keyword: "sdf"}, // 传递方式二、对象值的情况
          props: ($router) => {
            return {keyword: $router.params.keyword} 
          }, // 传递方式三、函数值的情况
          component: Search,
          meta: {
            footerIsShow: true
          }
        },
        
6)路由元信息
  1. 可在路由配置中对其进行元信息(meta)选项的配置,如下所示:
    routes: [
        {
          path: "/home",
          component: Home,
          meta: {
            footerIsShow: true
          }
        },
        {
          path: "/login",
          component: Login,
          meta: {
            footerIsShow: false
          }
        },
        {
          path: "/register",
          component: Register,
          meta: {
            footerIsShow: false
          }
        },
        {
          /**
           * 采用对象形式传递params参数时,需要为路由添加name属性。
          * 通过name属性进行传递,不可通过path进行传递。
          */
          name: "search",
          // 采用非对象形式传递params参数时,需要使用“/:keyword”进行占位,
          path: "/search/:keyword",
          component: Search,
          meta: {
            footerIsShow: true
          }
        },
        {
          path: "/",
          redirect: "/home", // 重定向到/home
          meta: {
            footerIsShow: true
          }
        },
      ]
    
  2. 通过$route.meta.footerIsShow进行获取其中的值:
    <div id="app">
      <Header/>
      <router-view></router-view>
      <Footer v-show="$route.meta.footerIsShow"/>
    </div>
    
7)路由补充

在使用编程式传参时,对同一个路由传递相同参数时,会发生\color{red}{NavigationDuplicated} 异常,解决办法,需要配置路由对其push||replace方法进行重写,其配置如下:

// 文件路径src/router/index.js
// 备份原有的push方法
const originPush = VueRouter.prototype.push
// 重写push方法
VueRouter.prototype.push = function (location, resolve, reject) {
  resolve && reject
    ? originPush.call(this, location, resolve, reject)
    : originPush.call(this, location, () => { }, () => { })
}
// 备份原有的replace方法
const originReplace = VueRouter.prototype.replace
// 重写push方法
VueRouter.prototype.replace = function (location, resolve, reject) {
  resolve && reject
    ? originReplace.call(this, location, resolve, reject)
    : originReplace.call(this, location, () => { }, () => { })
}

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

推荐阅读更多精彩内容