天天看點

Vue-router 前端路由

前端路由:

  前端路由主要是使用Hash (....#/login)進行路由切換的,不會重新整理頁面,類似于頁面中的錨連結,隻是在單頁面中進行切換,并不會向後端發送請求。

  可以再router中設定屬性mode 為 "history" 使得路由程式設計 /login.

後端路由:

  後端路由主要是沒有路由都會向後端發送請求,都會重新整理頁面

npm 安裝:

npm install vue-router

//在對應的子產品中将其綁定到Vue上。

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)      

任何元件内通路路由器:this.$router,就是整個的路由對象;

通路目前路由:this.$route;

1.元件的路由切換

<div id="app">
    <!-- 使用router-link 代替原本的a連結 tag表示最終渲染成的标簽 同時具備了點選切換元件的功能 -->
    <router-link to="/login" tag="span">登入</router-link>
  
  //除了使用router-link來定義導航連接配接,還可以使用router的執行個體方法:
   
  // this.$router.push(location,onComplete?,onAbort?) //類似window.location.href,向histroy棧中添加一個新的
           // 帶查詢參數,變成 /register?plan=private
                 //router.push({ path: 'register', query: { plan: 'private' }})           
  //toute      
  <router-link to="/register" tag="a">注冊</router-link>
    <!-- 切換的元件的占位符 ,顯示切換到的元件-->
    <router-view></router-view>
  </div>


  <template id="login">
    <h3>登入</h3>
  </template>
  <template id="register">
      <h3>注冊</h3>
    </template>

  <script>



    var login = {
      template:"#login",
    }
    var register = {
      template:"#register"
    }

    const router = new VueRouter({
      routes:[      

      // component中的login是子元件對象,不是字元串。

        {path:"/",redirect:"/login"}, //設定預設路由 重定向

        {path:"/login",component:login, alias: '/b'}, //alias 起别名 使用/b 和使用/login的作用一樣 都會跳轉到login元件上。

        {path:"/register",component:register,name:"register"},

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

    {path:"*"} //比對所有路徑,一般放到最後,比對404檔案
    {path:“/user-*”}//比對所有以 /user-開頭的路徑
       // 路徑放置的順序會影響比對
      ]
    })

   new Vue({
    el:"#app",
    data:{
    },
    components:{
      login,register
    },
    // 将路由和Vue執行個體實作綁定。
    router:router,//也可直接 router,
   })



      

 2.路由嵌套

<div id="app">
    <h3>首頁</h3>
    <router-link to="/main">main頁面</router-link>
    //maink元件的占位
    <router-view></router-view> 
  </div>

  <template id="maink">
   <div>
      <h3>main</h3>
  //router-link中的位址必須是絕對位址/main/login,如果是login則會跳轉到/login下。
  //子元件被切換的時候,并不會銷毀原來的所有元件,而是複用了其他元件隻銷毀了子元件。
//也就是說/mian/login跳轉到/main/register的時候,/main元件并不會重新的建構或是重新的調用created函數。     
 <router-link to="/main/login" >登入</router-link>
      <router-link to="/main/register">注冊</router-link>
     <transition name="my" mode="out-in">
        // 登入或是注冊元件的占位
        <router-view></router-view>
     </transition>
   </div>
  </template>

  <template id="login">
    <h3>登入</h3>
  </template>
  <template id="register">
      <h3>注冊</h3>
  </template>

  <script>

    var maink = { //template的id值不能和DOM的标簽一樣
      template:"#maink",
    }

    var login = {
      template:"#login",
    }
    var register = {
      template:"#register"
    }

    const router = new VueRouter({
      routes:[
        {
          path:"/main",
          component:maink,
          children:[//子路由
            {
              path:"login",//注意不是從根目錄開始的 不加斜杠
              component:login,
            },{
              path:"register",
              component:register
            }

          ]
        },
       
      ]
    })

   new Vue({
    el:"#app",
    data:{
    },
    components:{
      login,register,
      maink 
    },
    // 将路由和Vue執行個體實作綁定。
    router:router,//也可直接 router,
   })      

 3.路由傳值

  

<div id="app">
  
    <router-link to="/login?id=99&name=zzzz">登入</router-link>
    <router-link to="/register/444">注冊</router-link>
    <router-view></router-view> 
  </div>

  <template id="login">
    <div>
      // 當直接在連結中使用?來進行Key value的拼接的時候,在元件中通過 $route.query 來接收要查詢的資料  無需修改路由驗證規則
        <h3>登入=------{{this.$route.query.name}}</h3>
    </div>
  </template>

  <template id="register">
     <div>
       // 當在連接配接中使用 /register/444 這樣的路由的時候,并且需要修改router中的路由規則/register/:id,使用$route.params來擷取資料
        <h3>注冊------{{this.$route.params.id}}</h3>
     </div>
  </template>

  <script>
    var login = {
      template:"#login",
    }
    var register = {
      template:"#register",
    }
    const router = new VueRouter({
      routes:[
        { path:"/login", component:login },
        { path:"/register/:id", component:register },
     //還可利用props進行解耦,而不是使用$router擷取參數
      //https://router.vuejs.org/zh/guide/essentials/passing-props.html#%E5%87%BD%E6%95%B0%E6%A8%A1%E5%BC%8F
       
      ],      

      linkActiveClass:"myactive", //點選切換元件的是時候 連接配接高亮 "myactive" 自定義類選擇器

})

   new Vue({
    el:"#app",
    data:{
    },
    components:{
      login,register
    },
    // 将路由和Vue執行個體實作綁定。
    router:router,//也可直接 router,
   })
 
 </script>
          

 4.命名視圖

<div id="app">
    <router-view></router-view> 
    <!-- 名字和components中的一樣 -->
    <router-view name="left"></router-view>  
    <router-view name="right"></router-view> 
  </div>

  <template id="top">
    <div>
        <h3>top</h3>
    </div>
  </template>

  <template id="left">
     <div>
        <h3>left</h3>
     </div>
  </template>
  <template id="right">
      <div>
         <h3>right</h3>
      </div>
   </template>

  <script>
    var top1 = { //top 也不可以作為元件對象名
      template:"#top",
    }
    var left = {
      template:"#left",
    }
    var right = {
      template:"#right"
    }
    const router = new VueRouter({
      routes:[
        { 
          path:"/", 
          components:{ //是個components對象
            default: top1,
            left:left,
            right:right,
          }
         },
      ],
    })

   new Vue({
    el:"#app",
    data:{
    },
    components:{
      top,left,right
    },
    // 将路由和Vue執行個體實作綁定。
    router:router,//也可直接 router,
   })
 
 </script>      

 5.導航守衛

//router.js

//參數和查詢的改變并不會觸發進入和離開的導航守衛
//全局前置守衛,是異步解析執行
//to 将要進入的路由對象 路由對象
// from 目前導航正要離開的路由 路由對象
// next 函數  參數 false  空參數 next('/') 或者 next({ path: '/' }): 跳轉到一個不同的位址 是必須調用的函數
router.beforeEach((to, from, next)=>{
   //可以做攔截器
   //有問題
   if(to.path === "/mine"){ //在這裡可能會出現溢出的情況,需要認真看。https://www.jianshu.com/p/1187f8f74a72
     next('/home');
   }
   next();
})



      

//後置守衛

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

   //和前置守衛參數基本一樣

 })

//路由獨享守衛

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
}}


鈎子函數的調用時機:
  //在切換元件的時候,
 1.導航被觸發
 2.失效的元件調用 beforeRouteLeave
 3.全局的beforeEach
 4.重用的元件beforeRouteUpdate
 5.全局beforeEnter
 6.解析元件
 7.激活元件的beforeRouteEnter
 8.全局的beforeResolve
 9.導航被确認
 10.全局的afterEach
 11.更新DOM