1. 程式人生 > 其它 >Vue cli之路由router

Vue cli之路由router

一、安裝路由

Vue-router用於提供給vue專案在開發中用於繫結url和元件頁面的關係的核心外掛。

預設情況下,vue沒有提供路由的功能,所以我們使用vue-router,並需要在專案根目錄。

npm install vue-router

  

安裝了vue-router外掛以後,我們必須要對路由進行初始化並且還要繫結元件與url地址之間的路由對映關係。

首頁,我們需要在一個單獨的目錄router下建立路由檔案index.js,例項化路由物件並繫結元件和url地址的關係。

二、基本使用

在src路徑下建立router/index.js,程式碼:

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

Vue.use(VueRouter);

import Home from "../views/Home";
import HelloWorld from "../components/HelloWorld";
import Forecast from "../components/Forecast";


export default new VueRouter({
  mode: "history", // hash 表示以位址列的雜湊值作為路徑,history以歷史物件的url作為路徑
  routes:[  // 路由列表,裡面的每一個成員都是一個url地址和元件的對映關係
    {
      path: "/",
      component: Home,
    },
    {
      path: "/hi",
      component: HelloWorld,
    },
    {
      path: "/index",
      component: Forecast,
    }
  ]
});

  

main.js,程式碼:

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'    // 沒有宣告路徑,則預設從node_module中導包過來
import App from './App'  // 如果由聲明瞭路徑,則表示從當前檔案出發根據路徑關係進行導報
import axios from "axios";
import router from "./router/index";  // 匯入路由物件
// 初始化axios物件
Vue.prototype.$http = axios.create();
Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

  

App.vue,程式碼:

<template>
  <div id="app">
    <!--    <HelloWorld msg="Welcome to Your Vue.js App"/>-->
    <!--    <Home></Home>-->
    <router-view></router-view>
  </div>
</template>

<script>
// import HelloWorld from './components/HelloWorld.vue'
// import Home from './views/Home'

export default {
  name: 'App',
  components: {
    // HelloWorld
    // Home
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

  

三、頁面跳轉

vue-router提供了2種寫法讓我們實現頁面跳轉。

1、通過router-link來跳轉

App.vue,程式碼:

<template>
  <div id="app">
    <p><a href="/">Home</a></p>
    <p><a href="/hi">HI</a></p>
    <p><a href="/index">Index</a></p>

    <hr>
    <p>
      <router-link to="/">Home</router-link>
    </p>
    <p>
      <router-link to="/hi">HI</router-link>
    </p>
    <p>
      <router-link :to="url">Index</router-link>
    </p>

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

<script>
export default {
  name: 'App',  // 元件名
  data() {
    return {
      url: "/index",
    }
  },
  components: { // 子元件

  }
}
</script>

<style>

</style>

  

注意:一般在開發中不會在App.vue編寫具體的程式碼,我們這裡僅僅是為了方便學習演示。

2、通過this.$router來跳轉

App.vue,程式碼:

<template>
  <div id="app">

    <a href="" @click.prevent="goto">Index</a>
    <hr>
   <router-view></router-view>
  </div>
</template>

<script>
export default {
  name: 'App',  // 元件名
  data(){
    return {
       url: "/index",
       user: "root",
    }
  },
  methods:{
    goto(){
      // 頁面跳轉
      if(this.user === "root"){
        this.$router.push("/index"); // ajax頁面跳轉到指定的路由地址
        // this.$router.back(); // 跳轉返回上一頁
        // this.$router.go(-1); // -1相當於back,後退一頁
        // this.$router.go(1); // 1表示forward,前進一頁
      }
    }
  },
  components: { // 子元件

  }
}
</script>

<style>

</style>

四、傳遞引數

vue-router提供了2種用於開發中傳遞引數的方式給我們使用。

1、路徑引數

url地址的路徑作為變數,傳遞引數到下一個頁面元件中進行獲取使用。

router/index.js,程式碼:

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

Vue.use(VueRouter);

import Home from "../views/Home";
import HelloWorld from "../components/HelloWorld";
import Forecast from "../components/Forecast";
import Article from "../components/Article";


export default new VueRouter({
  mode: "history", // hash 表示以位址列的雜湊值作為路徑,history以歷史物件的url作為路徑
  routes:[  // 路由列表,裡面的每一個成員都是一個url地址和元件的對映關係
    {
      path: "/",
      component: Home,
    },
    {
      path: "/hi",
      component: HelloWorld,
    },
    {
      path: "/index",
      component: Forecast,
    },
     {
      path: "/article/:year/:month",
      component: Article,
    },


  ]
});

  

Article.vue,程式碼:

<template>
  <div>
    查詢{{year}}年{{month}}的系列文章
  </div>
</template>

<script>
export default {
  name: "Article",
  data(){
    return {
      year: 0,
      month: 0,
    }
  },
  created() {
    this.year = this.$route.params.year;
    this.month = this.$route.params.month;
  }
}
</script>

<style scoped>

</style>

2、查詢引數

url地址的查詢字串作為引數,在下一個頁面元件中進行獲取使用。

App.vue:

<template>
  <div id="app">
    <a href="" @click.prevent="goto">Index</a>
    <hr>
   <router-view></router-view>
  </div>
</template>

<script>
export default {
  name: 'App',  // 元件名
  data(){
    return {
       url: "/index",
       user: "root",
    }
  },
  methods:{
    goto(){
      // 頁面跳轉
      if(this.user === "root"){
        this.$router.push("/index?city=南京"); // ajax頁面跳轉到指定的路由地址
      }
    }
  },
  components: { // 子元件

  }
}
</script>

<style>

</style>

  

Forecast.vue,程式碼:

<template>
  <div>
    <input type="text" v-model="city">
    <button @click="get_weather">獲取天氣</button>
    <table v-if="weather_list.length>1">
      <tr>
        <th>日期</th>
        <th>天氣</th>
        <th>溫度</th>
        <th>風向</th>
      </tr>
      <tr v-for="weather in weather_list">
        <td>{{weather.date}}</td>
        <td>{{weather.type}}</td>
        <td>{{weather.low}}~{{weather.high}}</td>
        <td>{{weather.fengxiang}}{{weather.fengli|format}}</td>
      </tr>
    </table>
  </div>
</template>

<script>
export default {
  name: "Index",
  data(){
    return {
      city: "北京",
      weather_list:[],
    }
  },
  filters:{
    format(content){
      return content.replaceAll("<![CDATA[","").replaceAll("]]>","");
    }
  },

  created(){
      // 任意一個元件中都可以獲取查詢引數
      console.log(this.$route.query); // 獲取所有的查詢引數
      if(this.$route.query.city){
         this.city = this.$route.query.city
      }

  },
  methods:{
    get_weather(){
      // 傳送http請求獲取天氣
      this.$http.get("http://wthrcdn.etouch.cn/weather_mini",{
        params:{
          city: this.city,
        }
      }).then(response=>{
        console.log(response.data.data.forecast);
        this.weather_list = response.data.data.forecast;
      }).catch(error=>{
        console.log(error);
      })
    }
  }
}
</script>

<style scoped>
table{
  width: 800px;
  border-collapse: collapse;
}
td,th{
  border: 1px solid red;
}
</style>