三十分鐘學(xué)會使用VUE搭建單頁應(yīng)用(SPA) 上

今天我們將學(xué)習(xí)如何用VUE構(gòu)建一個簡單的單頁應(yīng)用(SPA)

如果沒有其他特殊聲明,此教程中的VUE全部指的是VUE2.X版本

預(yù)覽

讓我們先看看最終的的單頁程序是什么樣子的

成果

閱讀本教程之前希望你能有如下的基礎(chǔ)知識:

  1. VUE基礎(chǔ)
  2. 如何創(chuàng)建VUE組件

如果你沒有任何VUE或者VUE組件的知識,可以看我之前的文章

VueJS簡明教程(一)之基本使用方法

使用Vue CLI 腳手架

我們將使用VUE提供的腳手架模塊Vue CLI拙泽,它可以使我們構(gòu)建的程序兼容ES5版本的瀏覽器。

NOTE: 當(dāng)然這需要你在Node.js環(huán)境下進(jìn)行開發(fā),如果你還沒有Node.js和NPM的基本知識荐操,建議你花半個小時的時間配置好Node.js環(huán)境骡澈,相信我,很簡單攀涵,百度隨便一搜就出來一大把教程铣耘。

如何你還沒有安裝Vue CLI,你可以用下面的命令進(jìn)行安裝

npm install -g vue-cli

NOTE: vue-cli已經(jīng)有了3.0版本以故,改名為 @vue/cli, 但是當(dāng)前vue-cli還是可以使用的蜗细,因為大部分用戶還是在用vue-cli,所以本教程也繼續(xù)使用vue-cli作為教學(xué)。

安裝完Vue CLI炉媒,我們將通過下面的命令構(gòu)建我們的VUE項目踪区。

vue init webpack spa

在上面的命令中,我們說明一下webpackspa這兩個參數(shù).

Webpack是指你想用哪個腳手架模板吊骤,這里其實(shí)用很多模板供我們選擇,比如簡化版webpack-simple缎岗,具體使用方法可以參考這里

SPA指的是你要把項目放在哪個文件夾里,這里就是SPA這個文件夾白粉,如果沒有系統(tǒng)會自動創(chuàng)建密强。

運(yùn)行上面這個命令后,會有一些選項讓你選擇蜗元,比如項目的名字等等或渤,全部默認(rèn)就可以。

運(yùn)行完上面的命令后奕扣,我們需要將當(dāng)前路徑改變到SPA這個文件夾內(nèi)薪鹦,然后安裝需要的模塊:

//改變路徑到spa文件夾下
cd spa
//安裝所有項目需要的npm模塊
npm install
//在開發(fā)環(huán)境下運(yùn)行程序
npm run dev

當(dāng)上面的命令運(yùn)行起來的時候,用瀏覽器訪問 http://localhost:8080 這個地址惯豆,我們會看到如下頁面:

VUE Router 的安裝與配置

在我們正式開始配置我們的單頁程序之前池磁,還有一個東西必須安裝,vue-router楷兽。

vue-router 是VUE官方提供的一個路由組件地熄,專門用來構(gòu)建VUE的單頁程序,它包含如下一些特點(diǎn):

  1. 支持嵌套路由
  2. 組件化路由配置
  3. 支持路由參數(shù)傳遞芯杀,支持通配符
  4. 比傳統(tǒng)路由更加優(yōu)化的導(dǎo)航控制
  5. 自動激活不同CSS樣式
  6. 支持HTML5歷史模式或哈希模式端考,支持IE9的自動回退功能
  7. 支持自定義的滾動軸特性

如果你之前接觸過angular router或者react-router,其實(shí)vue-router跟這兩個非常相似揭厚。

我們使用vue-router的原因就是它可以使我們的頁面在前端就完成切換却特,而不是每次切換頁面都要向服務(wù)器重新請求數(shù)據(jù),重載頁面筛圆。

換句話說裂明,一個單頁程序就像是一個安裝在本地APP一樣,使用起來比傳統(tǒng)的網(wǎng)頁更加的流暢太援。

我們可以用下面的命令安裝vue-router.

npm install vue-router --save

現(xiàn)在讓我們打開 src/main.js 文件夾把路由模塊配置到我們的程序里.

復(fù)制下面的內(nèi)容并替換原來的 src/main.js:

// 導(dǎo)入vue實(shí)例
import Vue from 'vue'
//導(dǎo)入 App 組件
import App from './App'
//導(dǎo)入 vue router
import VueRouter from 'vue-router'
//告訴vue使用vue-router路由組件
Vue.use(VueRouter)
//定義路由表
const routes = []

// 創(chuàng)建路由器實(shí)例闽晦,并且傳入`routes`變量作為路由。
// 你還可以傳入別的參數(shù)提岔,不過在這里盡量簡單化就可以了
const router = new VueRouter({
  routes, 
  mode: 'history'
})
//實(shí)例化Vue實(shí)例
new Vue({
  //定義Vue綁定的跟元素
  el: '#app',
  //用<App/>代替根元素
  template: '<App/>',
  //聲明App組件仙蛉,這樣上面的<App/>元素就可以生效
  components: { App },
  //將上面聲明的路由器傳遞到根Vue實(shí)例
  router
}).$mount('#app')//將這個實(shí)例掛載到id=app的根元素上

讓我們屢一下上面這一段代碼,首先我們從node模塊中導(dǎo)入了vue模塊唧垦,接著我們又導(dǎo)入了App模塊(這個是本地定義的模塊)捅儒。

這個App模塊是我們在用vue cli腳手架創(chuàng)建這個項目的時候默認(rèn)幫我們創(chuàng)建的液样,作為我們整個項目的根模塊振亮。

之后巧还,我們導(dǎo)入了vue-router, 接著我們使用vue的靜態(tài)方法Vue.use,告訴vue我們將使用vue-router這個組件坊秸。

在下一行麸祷,我們定義了一個空的routes數(shù)組變量。每一個routes里面的元素為一條路由信息褒搔。當(dāng)前里面還沒有路由信息阶牍,后續(xù)會添加。

NOTE:注意英文中routes和router的區(qū)別星瘾,router是一個組件走孽,route是一條路由信息,routes是由多個路由信息(route)組成的路由表琳状。
可以這么理解磕瓷,把router當(dāng)成一個工人,這個工人(router)拿到一張由很多路由信息(route)組成的路由表(routes)念逞,然后每一次用戶請求頁面變化時困食,工人(router)會逐條比對路由表(routes)上的路由信息(route),遇到第一條匹配的信息就將對應(yīng)的頁面反饋給用戶

接下來我們做的是創(chuàng)建我們的路由器(router)翎承,一個vue-router的實(shí)例硕盹,在這里我們給它傳入了兩個參數(shù)。

第一個參數(shù)是一個我們之前聲明過的數(shù)組變量叨咖,路由表(routers)瘩例,另一個參數(shù)在聲明一種路由模式,這種模式下我們在URL中不會看到前導(dǎo)的#號甸各。
有興趣的讀者可以試試不加這個參數(shù)觀察一下URL有什么變化仰剿。同時,去掉這個#號也會使SEO優(yōu)化更加好痴晦。

最后南吮,我們創(chuàng)建了一個Vue實(shí)例,傳入了根組件<App/>誊酌,聲明了Vue的掛載點(diǎn)部凑。

現(xiàn)在,如果我們重新運(yùn)行這個程序碧浊,會發(fā)現(xiàn)頁面沒有任何變化涂邀。下面我們將會開始設(shè)置路由。

我將會把路由管道標(biāo)簽(<router-view></router-view>)加入到根組件<App/>中箱锐,也就是當(dāng)url符合某個路由信息(route)時比勉,對應(yīng)的組件就會被渲染(render)到這個路由管道標(biāo)簽內(nèi)。

現(xiàn)在打開src/App.vue文件,也就是根組件文件浩聋,用下面的內(nèi)容替換原有的內(nèi)容:

<template>
  <div id="app">
  <!--路由管道標(biāo)簽观蜗,任何符合某一路由(route)信息的組件都會在這個標(biāo)簽內(nèi)展示出來 -->
  <router-view></router-view>
  </div>
</template>

<script>
export default {
  name: 'app',
}
</script>
<!-- css格式 -->
<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-cli自動生成的代碼有幾點(diǎn)不一樣:

  1. 多了 router-view 標(biāo)簽用來渲染符合路由條件的組件
  2. 刪除了導(dǎo)入hello組件的語句import hello
  3. 刪除了script中關(guān)于component的定義
  4. 刪除了默認(rèn)的component是因為我們不需要了,因為我們在上面已經(jīng)定義了路由管道標(biāo)簽<router-view>

這時候我們在重新運(yùn)行程序衣洁,會發(fā)現(xiàn)是空白頁面

路由初始化

這時候我們需要定義Hello模塊作為我們的Home頁面墓捻,然后把相應(yīng)的路由信息(route)加到路由表(routes)中

打開main.js文件,把routes變量修改成如下形式并導(dǎo)入Hello組件:

//導(dǎo)入hello組件
import Hello from './components/Hello'
//定義路由表
const routes = [
//將根URL加入到路由表并聲明對應(yīng)Hello組件.
{ path: '/', component: Hello }
]

在上面的代碼中我們引入了腳手架默認(rèn)添加的Hello組件坊夫,并且將根URL / 對應(yīng)到了Hello組件上砖第,這時候如果我們重新運(yùn)行程序,會像下面這樣:

上面這個圖片里环凿,Vue的logo已經(jīng)不見了梧兼,這是因為之前在APP組件中已經(jīng)將顯示VUE logo圖標(biāo)的代碼刪除了。

現(xiàn)在智听,讓我們定義更多的路由袱院,在這之前先再創(chuàng)建一個組件。

在 src/somponents 文件夾下創(chuàng)建一個 About.vue 文件瞭稼,然后把下面的代碼放進(jìn)去忽洛。

<template>
  <div id="about">
    When you have a great story about how your product or service was built to change lives, share it. The "About Us" page is a great place for it to live, too. Good stories humanize your brand, providing context and meaning for your product. What’s more, good stories are sticky -- which means people are more likely to connect with them and pass them on.
  </div>
</template>

<script>
export default {
  name: 'about'
}
</script>
<style>
#about {
  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>

讓我們來看看上面這個About組件,這個組件里面只有簡單的一段話环肘,當(dāng)URL正好對應(yīng)這個組件的時候欲虚,它就會被渲染到<router-view>標(biāo)簽里面。

在這之前悔雹,我們需要在路由表中加入這個組件對應(yīng)的路由复哆。

打開 main.js 然后把路由表(routes)改成如下形式。

//導(dǎo)入Hello組件
import Hello from './components/Hello'
//導(dǎo)入Aboiut組件
import About from './components/About'
//定義路由表
const routes = [
//對應(yīng)Hello組件的路由地址
{ path: '/', component: Hello },
//對應(yīng)About組件的路由地址
{ path: '/about', component: About }
]

上面代碼唯一的改動就是增加了About組件的引入和對應(yīng)的路由信息腌零。

這時候如果我們在瀏覽器中訪問 http://localhost:8080/about 這個地址梯找,我們就會看到剛剛我們在About組件中寫的那段話。

在頁面中使用<router-link>標(biāo)簽

但是我們不能總是手工在瀏覽器中輸入地址去切換頁面益涧,所以我們需要用到另一個路由器標(biāo)簽<router-link></router-link>锈锤。

打開 App.vue 文件,然后在<router-view>標(biāo)簽上面加入兩個<router-link>標(biāo)簽:

<router-link v-bind:to="'/'">Home</router-link>
<router-link v-bind:to="'/about'">About</router-link>

上面兩個標(biāo)簽的作用就是創(chuàng)建兩個指向?qū)?yīng)URL的超鏈接闲询,用來做動態(tài)的路由轉(zhuǎn)換 (不用重載頁面的頁面轉(zhuǎn)換)久免。

這時候如果你重新啟動程序,會注意到頁面上多了兩個可以點(diǎn)擊的超鏈接扭弧,點(diǎn)擊任意一個阎姥,頁面和URL也會隨著變動,而且頁面并沒有重載鸽捻。

程序看起來是這個樣子的:

總結(jié)

好了呼巴,這就是如何構(gòu)建一個單頁程序(SPA)泽腮。

當(dāng)然,這個程序也可以構(gòu)建的更加復(fù)雜一些衣赶,比如:

  1. 添加更多的路由
  2. 通過路由傳遞參數(shù)信息
  3. 使用路由守護(hù)(route guards)來在保證沒有權(quán)限的用戶不能訪問特定頁面

在下一個教程中诊赊,我會分別介紹路由的參數(shù)傳遞和路由守護(hù)功能。

源代碼

碼字不易屑埋,喜歡請點(diǎn)贊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末豪筝,一起剝皮案震驚了整個濱河市痰滋,隨后出現(xiàn)的幾起案子摘能,更是在濱河造成了極大的恐慌,老刑警劉巖敲街,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件团搞,死亡現(xiàn)場離奇詭異,居然都是意外死亡多艇,警方通過查閱死者的電腦和手機(jī)逻恐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峻黍,“玉大人复隆,你說我怎么就攤上這事∧飞” “怎么了挽拂?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骨饿。 經(jīng)常有香客問我亏栈,道長,這世上最難降的妖魔是什么宏赘? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任绒北,我火速辦了婚禮,結(jié)果婚禮上察署,老公的妹妹穿的比我還像新娘闷游。我一直安慰自己,他們只是感情好贴汪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布储藐。 她就那樣靜靜地躺著,像睡著了一般嘶是。 火紅的嫁衣襯著肌膚如雪钙勃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天聂喇,我揣著相機(jī)與錄音辖源,去河邊找鬼蔚携。 笑死,一個胖子當(dāng)著我的面吹牛克饶,可吹牛的內(nèi)容都是我干的酝蜒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼矾湃,長吁一口氣:“原來是場噩夢啊……” “哼亡脑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邀跃,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤霉咨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拍屑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體途戒,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年僵驰,在試婚紗的時候發(fā)現(xiàn)自己被綠了喷斋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒜茴,死狀恐怖星爪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粉私,我是刑警寧澤顽腾,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站毡鉴,受9級特大地震影響崔泵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猪瞬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一憎瘸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陈瘦,春花似錦幌甘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鞍泉,卻和暖如春皱埠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咖驮。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工边器, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留训枢,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓忘巧,卻偏偏與公主長得像恒界,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子砚嘴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)际长,斷路器耸采,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 目錄 一、項目結(jié)構(gòu)的核心思想 二洋幻、項目目錄結(jié)構(gòu) 三、資源路徑編譯規(guī)則 四竭沫、index.html 五蜕提、build目錄...
    科研者閱讀 11,376評論 0 40
  • 相關(guān)概念 混合開發(fā)和前后端分離 混合開發(fā)(服務(wù)器端渲染) 前后端分離后端提供接口谎势,前端開發(fā)界面效果(專注于用戶的交...
    他愛在黑暗中漫游閱讀 2,793評論 4 45
  • 我不是一個善于付出真心的人。 很可惜杨名,我還不善于掩藏脏榆。 受了傷才懂得,別人刺痛你的遠(yuǎn)遠(yuǎn)沒有你給自己的問責(zé)台谍。 既是傷...
    吃不瘦的酷哈斯閱讀 209評論 1 0
  • When I saw this topic, the first answer in my heart is C...
    放開那個小鑫閱讀 219評論 0 1