vue路由

路由

路由起步

  • 監(jiān)聽地址欄的改變.根據(jù)改變渲染不同的組件

  • 基本使用

    • 下載安裝路由 npm install vue-router

    • 創(chuàng)建路由表(項(xiàng)目下的一個(gè)router.js文件)

      • 引入vue和vue-router

        import vue from 'vue'
        import vueRouter from 'vue-router'
        
      • 在vue中使用vue-router

        vue.use(vueRouter)
        
      • 創(chuàng)建路由實(shí)例 確定路徑和組件的對(duì)應(yīng)關(guān)系 "/"表示的是根目錄

        let router = new vueRouter({
          routes:[
            {
              path:'/son1',//地址欄的地址
              component:son1//如果你的地址欄變成son1我就渲染son1組件
            },
        
            {
              path:'/son2',//同上
              component:son2
            }
          ]
        
        
        })
        
      • 拋出路由實(shí)例

        export default router
        
    • 在main.js 里注冊(cè)路由

      import Vue from 'vue'
      import App from './App.vue'
      import router from './router/router'//引入路由文件
      
      Vue.config.productionTip = false
      
      new Vue({
        router:router, //注冊(cè)路由
        // 渲染一個(gè)app組件
        render: h => h(App)
      }).$mount('#app')
      
      
    • 完成main.js注冊(cè)后就可以使用兩個(gè)組件

      • <router-link> 控制地址欄的改變

        • 有一個(gè)to屬性來控制地址欄變成啥樣

          • to屬性后面跟對(duì)象要加 : 號(hào)
      • 可以跟組件名

        <template>
          <div id="app">
            這是根組件
            <!-- <banner></banner>
            <box></box> -->
            <router-link to = '/son1'>son1</router-link>
             <router-link to = '/son2'>son2</router-link>
          <router-view></router-view>
          </div>
        </template>
        
      - 也可以跟path路徑名(前面要加:號(hào))
      
            ```js
            <router-link :to ='{path:"/recommend"}'  active-class = 'hehe'>recommend</router-link>
      
      • 路由命名..就是在路由注冊(cè)表中用name給路由命名

        • 也可以跟name屬性(也要加冒號(hào))

           <router-link :to ='{name:"hanjie"}'  active-class = 'hehe'>recommend</router-link>
          
        
        
      
    • <router-link> 默認(rèn)渲染成<a>標(biāo)簽

    • tag 用來控制<router-link>渲染成什么標(biāo)簽

    • active-class 激活狀態(tài)類名,只有選中狀態(tài)才會(huì)添加class名

      ```js
        <router-link to = '/son1' tag = 'span' active-class = 'hehe'>son1</router-link>
      
      
      
  • <router-view> 開啟一片空間,渲染指定的組件

    • 在哪使用直接在哪用就行,起到一個(gè)占位的作用.根據(jù)地址欄渲染不同的組件.可以寫多個(gè).

      ```js
       <router-view></router-view>
      ```
      

路由模式 mode

  • 在路由注冊(cè)表中可以控制路由模式

  • 歷史模式(history) 地址欄中沒有#符號(hào)

  • hash模式 地址欄中有#符號(hào)

    let router = new vueRouter({
      mode:'history',
      routes:[
        {
          path:'/son1',//地址欄的地址
          component:son1//如果你的地址欄變成son1我就渲染son1組件
        },
    
        {
          path:'/son2',//同上
          component:son2
        }
      ]
    

路由命名

  • 路由命名.
    • .就是在路由注冊(cè)表中用name給路由命名也可以實(shí)現(xiàn)跳轉(zhuǎn)
      • 也可以跟name屬性(也要加冒號(hào))
 <router-link :to ='{name:"hanjie"}'  active-class = 'hehe'>recommend</router-link>
  • 命名視圖

    • 在一個(gè)頁面渲染多個(gè)組件時(shí)可以使用

      • 在注冊(cè)表中 把component修改成components
       {
            path:'/namerouter',//同上
            name:'namerouter',
            components:{
              default:son1, //默認(rèn)渲染組件
              a:son2,
              b:son3
            }
          }
        ]
      
      • 在使用組件文檔處可以寫成這種模式..
      <router-link :to ='{name:"namerouter"}'  active-class = 'hehe'>namerouter"</router-link>
              <router-view></router-view> //不加name默認(rèn)是default:son1
              <router-view name='a'></router-view>
              <router-view name='b'></router-view>
      

重定向和別名

  • 重定向(redirect)

    • 剛進(jìn)入頁面的時(shí)候不能什么組件都不顯示,所以要設(shè)置一個(gè)默認(rèn)顯示的組件

       {
            path:'/',         //如果地址欄上只顯示/的話
            redirect:'/son1'  //那就跳轉(zhuǎn)到'./son1'
      
          }
      

聲明式導(dǎo)航和編程式導(dǎo)航

  • 聲明式導(dǎo)航

    • 通過標(biāo)簽實(shí)現(xiàn)跳轉(zhuǎn)頁面..比如<a>標(biāo)簽
    • 在路由中使用<router-link>進(jìn)行組件切換的就是聲明式導(dǎo)航
  • 編程式導(dǎo)航

    • 通過代碼實(shí)現(xiàn)跳轉(zhuǎn)頁面的...比如js中的window.location.href=‘path’

    • 在路由中由對(duì)象下的api 進(jìn)行組件切換的叫做編程式導(dǎo)航.

      • 常用的有三種方法 push replace go (back,forward(go方法相當(dāng)于這兩種方法.))

        • 首先添加一個(gè)點(diǎn)擊事件

          <span @click="go('/son3')">son3</span>
          
        • 可以接受字符串/對(duì)象/的傳參

             go(path){
                console.log(this)
                this.$router.push(path)
                this.$router.push({path:path})
                this.$router.push({name:'起的名字'})
              }
            }
          
        • 三種方法的不同

          • push每次跳轉(zhuǎn).地址都會(huì)保存到地址棧中,所以可以一級(jí)一級(jí)的返回
          • replace 返回會(huì)直接返回到最初的頁面
          • go(可以跟數(shù)字來指定回退幾步)

路由傳參

切換組件的時(shí)候給目標(biāo)組件傳一個(gè)參數(shù)

  • 切換的時(shí)候傳遞參數(shù)

  • 切換完畢 在目標(biāo)組件接受參數(shù)

    • 動(dòng)態(tài)路由

      • 傳參
        • 路徑中有最少一項(xiàng)是變量(這個(gè)變量可以是任何數(shù)據(jù))
          • 在地址欄中必須要輸入/son2/任意數(shù)據(jù)/任意數(shù)據(jù)..這樣的格式才能訪問組件
         {
            path:'/son2/:hehe/:xixi',//同上
            component:son2
          },
      
      • 接受參數(shù)
        • 在目標(biāo)組件中(如上圖代碼就是在son2組件中)通過this.$route.params來接受數(shù)據(jù)
    • query傳參

      • 傳參

        • 相當(dāng)于get傳遞參數(shù).

        • 數(shù)據(jù)會(huì)出現(xiàn)在地址欄上,缺少安全性

        • 數(shù)據(jù)有長(zhǎng)度限制

          this.$router.push('/name:us-123&ps=123')
          this.$router.push({path:'/name',query:{us:123,ps:134}})
          
      • 接受數(shù)據(jù)

        • 在目標(biāo)組件里通過this.$router.query()進(jìn)行接受
    • params傳參

      • 傳參

        • 不會(huì)出現(xiàn)地址欄上,\

        • 沒有長(zhǎng)度限制

        • 不能和path一起使用

          this.$router.push({name:'hehe',params:{us:123,ps:123}})
          
      • 接收

        • 在目標(biāo)組件里通過this.$router.param()進(jìn)行接受

嵌套路由又稱子路由

  • 在一個(gè)路由組件里嵌套別的路由

  • 在路由注冊(cè)表下需要嵌套的組件中使用children屬性

    • 注意不用加'/'
     {
          path:'/my',
          component:My,
          children:[
            {
              path:'userinfo',
              component:UserInfo
            },
            {
              path:'userlogin',
              component:UserLogin
            }
          ]
        },
    
  • 在my.vue中使用二級(jí)路由

    <router-view></router-view>
    

導(dǎo)航守衛(wèi)(路由攔截器)

  • 就是切換組件路由時(shí)起到一個(gè)攔截作用,可以先判斷下是否符合某些條件在決定是否切換

  • 某些頁面登錄之后才能訪問,沒有登錄不能訪問

完整的導(dǎo)航解析流程

  1. 導(dǎo)航被觸發(fā)。
  2. 在失活的組件里調(diào)用離開守衛(wèi)先较。
  3. 調(diào)用全局的 beforeEach 守衛(wèi)敞恋。
  4. 在重用的組件里調(diào)用 beforeRouteUpdate 守衛(wèi) (2.2+)瘸右。
  5. 在路由配置里調(diào)用 beforeEnter顶瞒。
  6. 解析異步路由組件。
  7. 在被激活的組件里調(diào)用 beforeRouteEnter话浇。
  8. 調(diào)用全局的 beforeResolve 守衛(wèi) (2.5+)挽鞠。
  9. 導(dǎo)航被確認(rèn)。
  10. 調(diào)用全局的 afterEach 鉤子漏隐。
  11. 觸發(fā) DOM 更新喧半。
  12. 用創(chuàng)建好的實(shí)例調(diào)用 beforeRouteEnter 守衛(wèi)中傳給 next 的回調(diào)函數(shù)。

全局前置守衛(wèi)

  • 不管哪個(gè)路由發(fā)生改變都可以觸發(fā)全局前置守衛(wèi)

  • 在路由創(chuàng)建表中(自己另起一行)

  • 三個(gè)參數(shù)

    • to 到哪去 想要切換哪個(gè)組件
    • from 從哪來 從哪個(gè)組件切換過來的
    • next 是否允許切換
      • 后面可以跟一個(gè)組件路徑.指定切換到指定的組件
    router.beforeEach((to, from, next) => {
      console.log(from)//從哪而來
      console.log(to)//到哪去
      let islogin = true;
      if(to.path==='/singer'){
        if(islogin){
          next()
        }else{
      next('/my/userlogin')
        }
      }else{
        next()            //可以去
      }
    
    })
    
    

路由獨(dú)享的守衛(wèi)(局部攔截器)

  • 語法和全局守衛(wèi)一樣,只是定義為位置不一樣.

  • 在哪個(gè)組件配置里定義的就在那個(gè)組件有效

      {
          path:'/singer',
          component:Singer,
          beforeEnter: (to, from, next) => {
            console.log('什么么')
            next()
          }
        },
    

全局后置鉤子

  • 組件跳轉(zhuǎn)完成之后觸發(fā)

    router.afterEach((to, from) => {
    
    })
    

全局解析守衛(wèi)

  • 和全局前置守衛(wèi)用法是一樣的.只是調(diào)用的時(shí)間不一樣

組件內(nèi)置守衛(wèi)

直接修改動(dòng)態(tài)導(dǎo)航時(shí)不會(huì)已引起組件的重新創(chuàng)建 組件是復(fù)用的

組件內(nèi)的守衛(wèi)

beforeRouterEnter 進(jìn)入組件之前

beforeRouterUpdate

當(dāng)前組件路由發(fā)生修改

動(dòng)態(tài)導(dǎo)航修改組件復(fù)用不會(huì)重新創(chuàng)建銷毀

監(jiān)聽路由發(fā)生改變

beforeRouterLeave 組件離開的時(shí)候觸發(fā)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末青责,一起剝皮案震驚了整個(gè)濱河市挺据,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脖隶,老刑警劉巖扁耐,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異产阱,居然都是意外死亡婉称,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門构蹬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來王暗,“玉大人,你說我怎么就攤上這事庄敛∷滓迹” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵铐姚,是天一觀的道長(zhǎng)策肝。 經(jīng)常有香客問我,道長(zhǎng)隐绵,這世上最難降的妖魔是什么之众? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮依许,結(jié)果婚禮上棺禾,老公的妹妹穿的比我還像新娘。我一直安慰自己峭跳,他們只是感情好膘婶,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布缺前。 她就那樣靜靜地躺著,像睡著了一般悬襟。 火紅的嫁衣襯著肌膚如雪衅码。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天脊岳,我揣著相機(jī)與錄音逝段,去河邊找鬼。 笑死割捅,一個(gè)胖子當(dāng)著我的面吹牛奶躯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亿驾,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼嘹黔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了莫瞬?” 一聲冷哼從身側(cè)響起儡蔓,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乏悄,沒想到半個(gè)月后浙值,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恳不,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檩小,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烟勋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片规求。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卵惦,靈堂內(nèi)的尸體忽然破棺而出阻肿,到底是詐尸還是另有隱情,我是刑警寧澤沮尿,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布丛塌,位于F島的核電站,受9級(jí)特大地震影響畜疾,放射性物質(zhì)發(fā)生泄漏赴邻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一啡捶、第九天 我趴在偏房一處隱蔽的房頂上張望姥敛。 院中可真熱鬧,春花似錦瞎暑、人聲如沸彤敛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墨榄。三九已至玄糟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袄秩,已是汗流浹背茶凳。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留播揪,地道東北人贮喧。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像猪狈,于是被迫代替她去往敵國(guó)和親箱沦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

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

  • 本文轉(zhuǎn)載于前端工匠雇庙。如有侵權(quán)聯(lián)系本人立刻刪除 一谓形、首先帶著問題 要學(xué)習(xí)vue-ro...
    qiaoguoxing閱讀 465評(píng)論 0 1
  • ? 通常我們會(huì)用一個(gè)或多個(gè)路由表,來匹配所有頁面的路徑疆前。但這不能滿足一些特定的需求寒跳。 # 解惑 ? 好幾次被問到怎...
    果汁涼茶丶閱讀 2,286評(píng)論 0 8
  • 這里說的Vue中的路由是指前端路由,與后端路由有所區(qū)別竹椒。我們可以使用url來獲取服務(wù)器的資源童太,而這種url與資源的...
    一顆腦袋閱讀 599評(píng)論 0 0
  • PS:轉(zhuǎn)載請(qǐng)注明出處作者: TigerChain地址http://www.reibang.com/p/9a7d7...
    TigerChain閱讀 63,840評(píng)論 9 218
  • 你好像又進(jìn)步多一點(diǎn)了书释,現(xiàn)在的行動(dòng)力變強(qiáng)了,該做的事情沒有拖一兩個(gè)月那么久赊窥,看爆惧,來新家的第一天,你就做了好多事锨能。 凌...
    天野丟閱讀 203評(píng)論 1 1