Web前端-Vue--路由,本地mock數據搭建,keep-alive,active-class,重定向redirect

路由

   路由的最基本配置:

    1.下載vue-router模塊(我們搭建vue項目時 已經勾選下載 所以在這不需要重複下載)

    2.在main.js 使用import語句 引入vue-router模塊

    3.讓vue加載路由功能
      Vue.use(VueRouter)

   創建vue對象 配置路由

    1.創建VueRouter對象  構造函數傳入大括號 配置路由
    2.VurRouter 常用的屬性:
        1.mode(路由模式):  hash和history
          hash:哈希模式(路徑後面帶/#/)

          history 歷史路徑模式 (需要服務器環境配置
            開發時不影響 一旦打包 如果失去了服務器配置環境  那麼頁面空白)

        2.base: 基本路徑
            例如:  我們的vue路徑是  www.myvue.com

                  加入 base:"itszt" 後

                  路徑是:
                      www.myvue.com/itszt/

      3.routes 配置路由路徑的
        值是一個數組  數組裏面每一個路由 都是一對大括號


        每一個路由對象 的配置:


          path:"" //路徑是什麼
          component:組件對象  //訪問什麼組件
          name:"" //給當前組件起名字 (後面傳參要用到)

      4.把new出來的 配置好的 路由對象 綁定給vue對象
          在Vue的大括號裏面 定義屬性名  router: new出來的那個VueRouter對象


      5.把router-view這個標籤  寫到指定位置 讓路由顯示出來

<keep-alive>
      <!--vue2.0提供了一個keep-alive組件,
      用來緩存組件,避免多次加載相應的組件,減少性能消耗-->
      <router-view/>
    </keep-alive>

        那麼路由在回退時 不觸發mounted鉤子函數了
        因爲這個標籤的作用就是讓組件可以緩存
        那麼也就是不觸發mounted  如果我們的數據是在mounted裏面獲取的
        那麼一旦回退 數據不重新獲取了
        那麼怎麼才能重新獲取呢
        跟keep-alive標籤對應的鉤子函數就是activated

 

 


import Vue from 'vue'
import App from './App'
import VueRouter from "vue-router"
import Student from "./components/Student"
import Teacher from "./components/Teacher"

Vue.use(VueRouter);


var myrouter=new VueRouter({
    // mode:"hash" 默認
    // base:"itszt"
    routes:[
      {


        path:"/student",
        component:Student


      },
      {
        path:"/teacher",
        component:Teacher

      },



    ]



});




new Vue({
  el: '#app',
  //把路由對象註冊進Vue
  router:myrouter,

  components: { App },
  template: '<App/>'
})

*   在main.js裏面直接做路由的配置 雖然效果是沒問題的
*   但是代碼結構太亂


*   我們要把路由的所有配置代碼單獨提出去  寫成一個js文件
*
*   在js文件裏面 把路由配置成功 new出來 router對象
*
*   最後 通過 export default router; 把配置好的對象對外暴露
*
*   在main.js裏面通過 import語句 引入這個對外暴露的router對象
*   最後把router對象在Vue裏面註冊一下

maina.js文件代碼

import Vue from 'vue'
import App from './App'


import router from "./router"  //如果引入的是一個文件夾  則默認找index


//router跟el  components屬性名 一樣是Vue規定好的
new Vue({
  el: '#app',
  //鍵和值一樣
  router,

  components: { App },
  template: '<App/>'
})

router/index.js文件代碼

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

Vue.use(VueRouter);

import Home from "../components/Home";
import Gwc from "../components/Gwc";
import User from "../components/User";

var router=new VueRouter({
  mode:"history",

  routes:[

    //當前/路徑 表示 頁面加載時 默認訪問首頁  訪問首頁時  默認router-view展示哪個組件
    {
      path:"/",
      component:Home

    },
    {
      path:"/gwc",
      component:Gwc

    },
    {
      path:"/user",
      component: User

    }
  ]
})

//我們需要把創建出來的 router對象 導出 去   main.js纔可以導入
export default router;

app.vue代碼   用<router-view></router-view>展示組件

<template>
  <div id="app">
      <h1>我是app首頁的導航</h1>
    <ul id="nav">
      <li><a href="/">首頁</a></li>
      <li><a href="/gwc">購物車</a></li>
      <li><a href="/user">個人中心</a></li>
    </ul>

      <router-view></router-view>

  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

<style>


</style>

控制路由跳轉的方式

控制跳轉路由的方式有很多
          比如原生的 a標籤  路徑寫上路由路徑 則可以跳轉
              還有 js代碼的 window.location="路由路徑"

         但是這些跳轉  都是原生提供的

router路由模塊裏面兩種對應的跳轉方式:

         1.靜態標籤跳轉:  router-link標籤
            router-link標籤 必須有的屬性 to屬性
            表示當前的路由跳轉目標 如果沒有就報錯
            router-link一旦加上to屬性 那麼默認解析成a標籤

            tag="li" 表示把 router-link標籤解析成li標籤
                或者其他標籤也可以  可以改成任意標籤

            如果想要給route-link標籤綁定事件
            vue提供了  給自定義組件標籤綁定事件的方式:
              @事件名稱.native="驅動函數"
              通過添加.native時間修飾符 能夠給自定義組件綁定事件

<router-link @click.native="show" tag="div" to="/">首頁</router-link>
<router-link @click.native="show" tag="div" to="/gwc">購物車</router-link>
<router-link @click.native="show" tag="div" to="/user">個人中心</router-link>


         2.動態js代碼跳轉: this.$router.push("路由路徑")
            通過自己寫標籤 給標籤添加點擊事件  js代碼的方法跳轉路由


        會記錄歷史記錄的跳轉方式
            this.$router.push("路由路徑") 就是js控制路由跳轉
        不會有歷史記錄的跳轉方式

            this.$router.replace("路由路徑")

            如果跳轉到下一個路由用的是 replace方法 那麼當前頁面路由不會記錄到歷史記錄中

<template>
  <div id="app">
   <h1>我是App.vue主頁</h1>
 
<!--      靜態標籤的方式跳轉路由-->
   <!-- <router-link @click.native="show" tag="div" to="/">首頁</router-link>
    <router-link @click.native="show" tag="div" to="/gwc">購物車</router-link>
    <router-link @click.native="show" tag="div" to="/user">個人中心</router-link>-->

  <p>
    <button @click="go1">首頁</button>
    <button @click="go2">購物車</button>
    <button @click="go3">個人中心</button>


  </p>


    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App',
  methods:{
    show(){
      alert("路由即將要跳轉")
    },
    go1(){
      this.$router.push("/")

    },
    go2(){
      // this.$router.push("/gwc")
      this.$router.replace("/gwc")

    },
    go3(){
      this.$router.push("/user")

    }
  }
}
</script>

<style>

</style>

 子路由的配置

  子路由就是在當前路由下面  還有路由

      例如:
          當前路由是:  /gwc

          子路由可以是  /gwc/list1    /gwc/youhui   /gwc/xiaoliang

      子路由的配置步驟:
        1.找到要配置子路由父路由對象

        2.在父路由的對象裏面 添加一個屬性 children:[]

        3.在children的中括號裏面添加子路由對象進行配置

        4.子路由對象也是path  component name三個屬性

        5.配置完以後 要把router-view放到父路由的頁面模板自己找個位置

main.js代碼

import Vue from 'vue'
import Router from 'vue-router'
import Home from "../components/Home"
import Gwc from "../components/Gwc"
import User from "../components/User"
//引入User路由的三個子路由對象
import Tuijian from "../components/User/Tuijian"
import Logout from "../components/User/Logout"
import Setting from "../components/User/Setting"


Vue.use(Router)

export default new Router({
  mode:"history",
  routes: [
    {
      path: '/',
      component:Home

    },
    {
      path: '/gwc',
      component:Gwc

    },
    {
      path: '/user',
      component:User,
      children:[
        {
          path:"/user/", //表示 跳轉到/user時  user裏面的router-view默認顯示推薦這個子路由
          component:Tuijian

        },
        {
          path:"/user/logout",
          component:Logout
        },
        {
          path:"/user/setting",
          component:Setting
        }


      ]

    },
  ]
})

子路由的父模塊代碼

<template>
    <div>
        <h2>個人中心</h2>
      <ul>
        <li @click="logout">註銷登陸</li>
        <li>修改密碼</li>
        <li @click="setting">幫助與設置</li>
      </ul>

      <router-view></router-view>

    </div>
</template>

<script>
    export default {

      methods:{
        logout(){
          this.$router.push("/user/logout")

        },
        setting(){
          this.$router.push("/user/setting")
        }

      }
    }
</script>

<style scoped>

</style>

 路由跳轉之間的傳參(包括父子路由)

         有兩種:

            1.path+query方式傳參
                跳轉時傳參數:
                   this.$router.push({
                  path:"/路由路徑",
                  query:{
                    //要傳過去的鍵值對
                    鍵1:值1,
                    鍵2:值2
                    .
                    .
                    .

                  }


                })

              跳轉過去後接受參數:
                在目標路由的mounted方法裏面 接受傳過來的路由參數
                this.$route.query 接受到傳過來的鍵值對那個對象
                通過 this.$route.query.鍵1 獲取值
                通過 this.$route.query.鍵2 獲取值
                .
                .
                .

              path+query方式路由傳參時  會在地址欄體現出參數的拼接

go2(){
      // this.$router.push("/gwc")
      //path+query的方式傳參
      this.$router.push({
        path:"/gwc",
        query:{
          mobile:"13812345678",
          userid:"10026"
        }

      })
    }
    export default {
        name: "Gwc",
      mounted(){
          /*console.log("傳過來的參數是:",this.$route.query);
          console.log("傳過來手機號是:",this.$route.query.mobile);
          console.log("傳過來用戶號是:",this.$route.query.userid);*/
      }
    }


            2.name+params方式傳參
                這種方式前提必須保證 路由配置時  已經添加了name屬性
             路由跳轉時傳參數
                this.$router.push({
                  name:"路由配置時的name值",
                  params:{
                    //要傳過去的鍵值對
                    鍵1:值1,
                    鍵2:值2
                    .
                    .
                    .

                  }

                })

            目標路由展現時  接收路由提交過來的參數:

                this.$route.params 接受到傳過來的鍵值對那個對象
                通過 this.$route.params.鍵1 獲取值
                通過 this.$route.params.鍵2 獲取值
                .
                .
                .
  *         這種方式傳的參數 不在地址欄體現出來 所以一旦頁面刷新
          數據就會丟失 只有第一次跳轉過來傳的那一次能夠接收到

go3(){
      // this.$router.push("/user")

    //  給user傳路由參數
      this.$router.push({
        name:"User",
        params:{
          mobile:"13912345678",
          userid:10086
        }
      })
    }
 mounted(){
        console.log("傳過來的參數是:",this.$route.params);
        console.log("傳過來手機號是:",this.$route.params.mobile);
        console.log("傳過來用戶號是:",this.$route.params.userid);


        if(this.$route.params.mobile){//如果有再賦值
          //  給當前組件的data裏面的一個變量賦值
          this.mobile=this.$route.params.mobile;

        }


      }

 

動態路由

    {
      // path: '/gwc',  //這個是固定路由 也就是 跳轉時 只能匹配/gwc
                      //如果我的需求是 /gwc/10006 是小強的購物車
      //                              /gwc/10007 是小白的購物車 等等等
      //               那麼此時我們需要配置動態路由

      path:"/gwc/:id", //這個:id是自己隨便起的名字 表示聲明一個id變量 以後所有的/gwc/隨便 的路由都能跳轉到購物車頁面
      name:"Gwc",
      component:Gwc

    }

本地mock數據搭建

1.打開cmd全局安裝json-server  
    輸入命令 cnpm/npm install json-server -g

2.找到自己要mock的json文件 複製到一個單獨文件夾
    用cmd切換到json文件所在的目錄


3.輸入命令 json-server 文件名.json --port 自己想一個端口 -h自己電腦ip

        -h可以不寫 默認以localhost啓動

 

active-class

  • 類型: string

  • 默認值: "router-link-active"

    設置鏈接激活時使用的 CSS 類名。默認值可以通過路由的構造選項 linkActiveClass 來全局配置。

     <ul>
            <router-link 
            replace
            :to='{name:v.path}'
            tag="li"
            v-for="(v,i) in products" :key="i"
            active-class="haha"
            @click.native="show(i)"
            >{{v.name}}</router-link>
    </ul>
    .left_inner li.haha,
    .left_inner li:hover {
        background: #4fc08d;
        color: #fff;
      }

    路由重定向

  •       //訪問/detail時  自動重定向去訪問analysis子路由
          redirect:"analysis",

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章