vue 2 + vue-router 2 實現SPA

github項目地址請點這裏。html

使用 Vue.js 時,咱們就已經把組件組合成一個應用了,當咱們要把 vue-router 加進來,只須要配置組件和路由映射,而後告訴 vue-router 在哪裏渲染它們。vue

先來看一下官方提供的最簡單的例子:webpack

HTML

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <!-- 使用 router-link 組件來導航. -->
    <!-- 經過傳入 `to` 屬性指定連接. -->
    <!-- <router-link> 默認會被渲染成一個 `<a>` 標籤 -->
    <router-link to="/foo">Go to Foo</router-link>
    <router-link to="/bar">Go to Bar</router-link>
  </p>
  <!-- 路由出口 -->
  <!-- 路由匹配到的組件將渲染在這裏 -->
  <router-view></router-view>
</div>

從HTML文件裏面咱們須要學會的是:git

  1. <router-link>標籤是咱們要跳轉的連接,to=""是必須的屬性,雙引號中的內容是咱們接下來在JS文件中定義的路由path。
  2. <router-view>標籤是展現咱們匹配到的組件的區域。

JavaScript

// 0. 若是使用模塊化機制編程,導入Vue和VueRouter,要調用 Vue.use(VueRouter)

// 1. 定義(路由)組件。
// 也能夠從其餘文件 import 進來
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }

// 2. 定義路由
// 每一個路由應該映射一個組件。 其中"component" 能夠是
// 經過 Vue.extend() 建立的組件構造器,
// 或者,只是一個組件配置對象。
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

// 3. 建立 router 實例,而後傳 `routes` 配置
// 你還能夠傳別的配置參數, 不過先這麼簡單着吧。
const router = new VueRouter({
  routes // (縮寫)至關於 routes: routes
})

// 4. 建立和掛載根實例。
// 記得要經過 router 配置參數注入路由,
// 從而讓整個應用都有路由功能
const app = new Vue({
  router
}).$mount('#app')

// 如今,應用已經啓動了!

JavaScript文件主要作的事情是:github

  1. 定義路由列表,即routes。
  2. 建立router實例及router配置,即router。
  3. 建立和掛載根實例。

以上只是教咱們用最簡單的方法使用vue-router。但實際開發過程當中,首先咱們的vue組件顯然不會只有一個template模板這麼簡單,會用到vue的單文件組件;其次咱們一般會但願<router-view>的範圍是整個頁面,而不是像如今這樣一直有幾個礙眼的導航存在於頁面上,這就須要先定義好默認狀態下<router-view>顯示的內容。web

既然是單頁應用(SPA),那麼整個項目有如下三個文件是必要的:vue-router

  1. 一個html文件:index.html
  2. 一個webpack打包時的入口js文件:main.js
  3. 一個根vue組件,做爲其餘組件的掛載點:app.vue

另外還有兩個自定義組件:homepage.vue和chat.vue。咱們但願的結果是他們之間互相跳轉。vuex

下面看下這幾個文件的具體內容:編程

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Vue.js v2</title>
</head>
<body>
  <!--由於咱們用App.vue做爲根組件,這裏只須要寫一個渲染用的掛載元素#application便可-->
  <div id="application"></div>
  <!--這裏的dist目錄是webpack打包後的js文件的路徑-->
  <script src="dist/main.js"></script>
</body>
</html>

main.js

這裏咱們選擇把路由配置也寫到main.js中,你也能夠寫到一個單獨的router.js中再引入到main.js中。segmentfault

//引入vue、vue-router和根組件app.vue
import Vue from 'vue'
import VueRouter from 'vue-router'
import App from './components/app.vue'

Vue.use(VueRouter)

// 引入自定義組件
import HomePage from './components/homepage.vue'
import Chat from './components/chat/chat.vue'

//定義路由
const routes = [
    //這裏 path: '/' 表明應用首頁顯示的內容
    { path: '/', component: HomePage },
    { path: '/chat', component: Chat }
];

//建立router實例
const router = new VueRouter({
  //mode指定路由模式,默認'hash',另外一種可選的模式是'history'
  mode: 'hash',
  routes,
});

new Vue({
  el: '#application',
  router,
  render: h => h(App) //用render函數渲染引入的組件App.vue到index.html中的#application元素中
})

app.vue

<template lang="html">
  <div id="app">
    <!--這裏是組件的渲染區域-->
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  data () {
    return {
    }
  },
}
</script>

自定義組件 homepage.vue

這個組件的內容也是進入應用默認展現的頁面內容。

<template>
    <div>
        <h1>homepage</h1>
        <router-link to="/chat">Go to chat</router-link>
    </div>
</template>

自定義組件 chat.vue

<template>
    <div>
        <h1>Chat</h1>
        <router-link to="/">Go to homepage</router-link>
    </div>
</template>

寫完後你會發現這兩個頁面是互相跳轉的,沒錯,就是這樣。

通常咱們會把路由信息routes提取到一個單獨的文件中,像這樣:

路由信息提取到單獨文件中 route-config.js:

import HomePage from './components/homepage.vue'
import Chat from './components/chat/chat.vue'

export default [
    { 
        path: '/',
        component: HomePage 
    },
    { 
        path: '/chat', 
        component: Chat 
    }
];

而後在main.js中引入: import routes from './route-config.js' 就能夠了。

參考文獻:

  1. vue-router 2官方文檔: http://router.vuejs.org/zh-cn/
  2. Vue-router2.0學習筆記: https://segmentfault.com/a/11...
  3. vue2.0構建單頁應用最佳實戰: https://segmentfault.com/a/11...
  4. 一個完整的vue應用 ( vuex+vue-router ) 起手: https://segmentfault.com/a/11...
相關文章
相關標籤/搜索