昨天大概粗糙的瞭解了一下Vue的概況以後,並無從框架、語法的細節來進一步學習。那今天經過一個簡單的實例來繼續完善一下Vue這方面的空白,用一些看得見的效果摸的着的代碼在不斷完成小目標的過程當中慢慢消化一下相關的知識點。固然用一個簡單的實例來徹底掌握Vue也不太現實,只是經過這樣一個例子來樹立學習的信心,瞭解Vue基礎知識點。javascript
Vue-cli-todolist
,是一個用vue-cli3工具初始化項目,而後在此基礎上完成todolist的案例,相關的技術棧:Vue-cli3, Vue,VueRouter,Vuex
。Element-ui,IView, Vux
等UI組件爲輔助。css
先看一下咱們完成的效果:html
分享前的約定: 如下大部分命令步驟基於Mac系統,Windows系統差別點也會提到。前端
爲了保持代碼可以長期有效,也方便麪試時展現,建議將代碼以Git的方式存放,好比:http://github.com
,http://gitee.com
,https://bitbucket.org/
等等。選擇任意一款新建倉庫:vue-cli-todolist
,git clone
倉庫到本地(Windows
系統建議非桌面的盤符路徑存儲,好比D:/vue-todolist),而後cd ..
,在iTerm
新建一個 tab 準備進行安裝Vue-cli
,留存當前的tab等安裝完成以後運行npm run serve
。vue
若是有舊版vuecli先得卸載,而後才能安裝新版。java
npm uninstall -g vue-cli vue -V
輸出:vue不是內外部命令時說明卸載成功,一樣,新版安裝成功經過這個命令來驗證。node
node -v
來肯定是否安裝成功,若是輸出相似v10.15.3
字樣表示安裝成功。//同時也安裝了npm
,輸入如下命令來確認npm -v
,若是輸入6.4.1
字樣表示安裝成功。 call:nodenpm install -g @vue/cli
命令安裝最新版,其中-g
的意思是安裝到全局,就像一個全局變量同樣,之後在任何一個目錄均可以運行建立命令vue create
。sudo npm install --global vue-cli
,不然會報這樣的錯誤Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
,若是是Windows同窗注意在右鍵用管理員方式打開cmd。vue create vue-cli-todolist
經過此命令在原來git clone項目的Tab中來建立一個項目。建議選擇Merge,若是是Overwrite會刪除.git隱藏文件,致使不能進行git commit,安裝完成後經過vue -V
來驗證是否安裝成功,若是輸出3.7.0
這樣的字樣,就說明安裝成功了。css3
$ cd vue-test $ npm run serve
根據命令行中提示的端口號,就能夠預覽到一個基礎的項目頁面。git
而後刪除根目錄下.gitignore文件中的dist目錄,說明之後dist目錄也須要提交上傳,git提交代碼,推送到遠程,在github倉庫刷新頁面看到代碼結構,說明代碼遠程推送成功。github
npm i vue-router -S
經過此命令來安裝路由組件,不少朋友剛開始不太會區分-S,-D的區別,這個-S表示上線依賴,是--save
縮寫,表示上線以後還須要存在的代碼塊,好比Vue.js,對應package.json中的dependencies: {}
,-D表示開發依賴,是--save-dev
縮寫,表示只是在開發階段使用,上線以後只使用他的結果文件就能夠了,好比sass-loader, babel,對應package.json中的devDependencies: {}
。npm i sass-loader -D
經過此命令來安裝咱們後面用到的scss,也能夠經過一個命令用空格分隔安裝多個組件,好比:npm i sass-loader vue-loader -D
。
ps: call:npm
增長路由的目的仍是爲了讓咱們更方便的進行編程,好比:有些頁面須要用戶登陸以後才能訪問?好比有些頁面進入以後後退就不讓他進入這個頁面?等等這樣的場景均可以經過路由來實現。
src
目錄下新建router.js
,引入相關的對象,而後use
,最後export
。import Vue from 'vue' import Router from 'vue-router' Vue.use(Router)
export default new Router({ routes: [ { path: '/', name: 'home', component: () => import('@/views/home'), } ], })
import router from './router' new Vue({ router, render: h => h(App), }).$mount('#app')
/#/
,最後顯示爲http://localhost:8080/#/
,且顯示畫面沒有報錯,說明咱們的路由配置文件添加成功。加入scss的目的是讓咱們更快更方便的方式編寫css
,瞭解一下。
須要在項目中使用scss
,只須要在.vue組件中的style中添加lang="scss",就可使用了:
<style lang="scss"> </style>
//node-sass包比較難安裝,須要屢次從新安裝。
Can't resolve 'sass-loader'
,這時候就須要咱們經過命令npm i sass-loader -D
來安裝依賴。他主要的功能就是負責把scss編譯爲css。安裝完成以後,仍是會報Cannot find module 'node-sass'
,咱們繼續npm i node-sass -D
安裝依賴。
安裝完成以後刷新頁面仍是報錯,這時候須要從新啓動服務了。具體步驟爲先:ctrl+c
中止服務,而後輸入命令npm run serve
啓動,再刷新頁面,畫面重現。
npm i todomvc-common todomvc-app-css -S
,而後在main.js中引入:import 'todomvc-common/base.css' import 'todomvc-app-css/index.css'
那到這一步咱們前期的準備工做已經完成了,下面就是根據頁面特色進行組件的拆分了。
拆分組件的難點在於,組織結構上趨於分散,但數據處理上趨於集中,集中的數據便於管理或驅動頁面視圖。
組件是Vue開發當中最小的組成單元,以.vue擴展名結尾,他包括:Html結構, JS, CSS,數據流,監聽處理子組件觸發事件,引用子組件(ref)。
如何拆分是一個開發習慣,並無一個準確的原則,細拆能夠拆分一個按鈕爲一個組件單元,但拆的越細壞處是會形成頁面維護的困難,好處是頁面組件的複用性更好。若是拆的少,組件結構關係比較簡單,可是頁面組件複用性不高,最終要達到指望效果仍是要平衡和取捨。
根據當前頁面的特色,大致拆分爲如下四個部分,分別爲:Header, List, Footer, Copyright,新建對應的*.vue文件而且放置在vue-cli-todolist/src/components
目錄下,而後相應的組件在vue-cli-todolist/src/views/home.vue
中引入,而後在增長:
components:{ Header, List, Footer }
須要注意的是Copyright
在整個操做容器外部,因此放在App.vue
中。
因爲Vue單數據流的限制規則,此組件頁面是操做整個Todolist數據源的總頁面,全部對數據的操做方法都彙總在此組件來實現,包括子組件對數據源的操做。父級 prop 值的更新會向下傳遞,但不能反向傳遞,也不能在子組件直接修改 prop。這樣作的目的是爲了防止從子組件意外改變父級組件的狀態,從而致使數據流向難以理解。其實對Todolist的操做,就是常說的是增刪改查,只是少了一個查找而已,頁面上的常規操做就是對Todolist數據源對象的的增長刪除修改,那對應的代碼其實就是數據的push, splice, forEach
等方法。須要注意的是這些操做數據的結果都是基於瀏覽器的,刷新以後並不存在,解決辦法後端接口存儲和本地存儲,本案例中經過localStorage存儲在本地。
而後咱們找一行有特徵引入組件的方式來分析一下,好比:
<main-view :todos="filteredTodos" @del-todo="delTodo" @all-done="allDone"></main-view>
:todos="filteredTodos"
傳下去,而後經過@del-todo="delTodo" @all-done="allDone"
進行捕獲處理。home.vue
中輸入<header>....</header>
,刷新頁面以後發現並無達到指望的效果,只有<header>....</header>
的代碼片斷。這時候就發現組件名稱不能與HTML的原有標籤名稱重複,不然當普通的html標籤解析。修改Header.vue爲HeaderView.vue以後刷新頁面,獲得指望結果頁面。另外的一個辦法就是大寫,好比:<Header>....</Header>
。此頁面雖然Html元素很少,但須要處理的東西仍是挺多,包括點擊進行中處理,雙擊進入編輯狀態,.enter.blur事件退出編輯狀態,基本每一個Html元素上都須要js代碼的處理,這裏邊大概有這幾點分享:
<input v-model="field" /> <input :value="field" @input="field = $event.target.value" />
每當輸入框內容發生變化時,就會觸發 oninput ,把最新的value傳遞給 field。
:class
computed -> set || get
通常計算屬性默認都是getter,全選的處理須要主動的修改數據源。
https://cn.vuejs.org/v2/guide/computed.html
h1 { font-size: 8vh; }
若是視口的高度是200px,那麼上述代碼中h1元素的字號將爲16px,即(8x200)/100=16
點擊狀態每次切換須要切換畫面,畫面的變化依賴於路由,因此須要記錄路由名稱 this.current
,在home.vue中經過watch來實現:
'$route' (to) { this.current = to.name },
版權頁面佈局採用Flex形式佈局。擴展認識:Flex垂直水平居中對齊
若是說App.vue是項目的組件入口文件的話那麼main.js就是項目的代碼入口,全部相關js的初始化以及npm包的引用都在此文件處理。ES6規定,import必須放在首行,有的組件須要Vue.use,有的則不須要。
Vue全家桶相關的Router, Vuex都須要在此文件綁定。
同時習慣於vue-cli2 npm run dev方式的同窗,也能夠在package.json中增長:
"scripts": { "dev": "npm run serve", "serve": "vue-cli-service serve" }
能夠用npm run dev繼續運行當前項目。
記錄當前狀態下實際安裝的各個npm package的具體來源和版本號,package.json文件只能鎖定大版本,也就是版本號的第一位,並不能鎖定後面的小版本你每次npm install都是拉取的該大版本下的最新的版本,爲了穩定性考慮幾乎是不敢隨意升級依賴包的,這將致使多出來不少工做量,因此package-lock.json安裝一個依賴的時候就鎖定在你安裝的這個版本。
在根目錄增長vue.config.js,css,js默認訪問根目錄,而咱們發佈以後的目錄是http://www.host.com/dist/,多了一層dist,因此須要配置publicPath,不然控制檯報找不到資源的錯誤:
module.exports = { publicPath: './', productionSourceMap: false }
至此爲止,今天階段性的學習就到此告一段落了。學習到此處有疑問的同窗,加QQ羣:364912432
,Vue交流微信羣須要加入QQ羣以後邀請。
源碼在這,vue-cli-todolist
若是還想進一步學習,那能夠看咱們這些分支:
帶m的移動端,由此能夠發現,這個項目不可是能夠學習入手的項目,也是能夠作爲相關其它UI組件Demo場地,再加個路由就能夠自由的玩耍了:
dev-base
: 是基礎版,沒有Vuex的版本dev-vuex
: 是Vuex版本dev-element-ui
: 是element-ui版本dev-m-vux
: 是移動端vux版本,帶m的移動端dev-base
: 是基礎版gh-paes
: 在線預覽頁面分支