最近找了些教程,順帶着趴在官網上,看了看 Vue 的一些內容,入門的一些概念,以及基礎語法,還有一些經常使用的操做,瞄了一眼,通篇文字+貼了部分代碼 9000 多字,入門語法什麼的仍是很好理解的,之前也有必定作小程序的基礎,感受仍是很類似的,不過對於一些稍複雜的點,感受仍是總結的不夠細緻,例如插槽,和計算屬性等,平時前端的東西看的也不是不少,學習過程當中整理的筆記,和你們一塊兒分享交流!歡迎各位大大交流意見~javascript
Vue (讀音 /vjuː/,相似於 view) 是一套用於構建用戶界面的漸進式框架。與其它大型框架不一樣的是,Vue 被設計爲能夠自底向上逐層應用。Vue 的核心庫只關注視圖層,不只易於上手,還便於與第三方庫或既有項目整合。css
看了一些教程以及文章,簡單理解的漸進式框架就三個字【不強求】,Vue並不強求你用它的全部內容(功能特性),用戶徹底能夠根據本身狀況進行選擇,使用其部分便可。html
這一塊某乎上有一個比較好的答案,很容易度娘到,貼了部分前端
vue即主張較少,也就是說能夠在原有系統上面,引入vue直接就能夠當jquery用,使用 vue,你能夠在原有大系統的上面,把一兩個組件改用它實現,當 jQuery 用;也能夠整個用它全家桶開發
正式學習 Vue 前咱們首先還須要瞭解一個基於前端的架構模式,也就是 MVVM ,它是 Model-View-ViewMode 的簡寫,其關係簡單的描述爲下圖:vue
在 MVVM 架構中,視圖和數據是沒有辦法直接進行溝通的,只能經過 ViewModel 來作一箇中間關係,ViewModel 能夠觀察到數據的變化,而後更新視圖內容,亦或者監聽到視圖的變化,並能通知數據發生改變java
後面我立刻會寫一個入門的小案例,能夠一塊兒來體會一下它的特色!node
一、體積小jquery
二、更高的運行效率webpack
三、雙向數據綁定ios
四、生態豐富、學習成本低
編寫 Vue 你能夠選擇使用 Vscode 、 HBuilder 、sublime、Webstrom、甚至 IDEA 都是能夠的,自行選擇就行了
首先咱們須要引入 Vue,你能夠去官網直接 down 下文件,進行一個本地的引入,相似引入 jQuery,或者使用一個網絡的引用,例以下文中,在官網中就能夠找到這種引入或下載的地址
能夠看到,引入後,咱們經過 new 的這種形式建立了一個 Vue 的實例,其中經過 el 找到 id 值爲 hello 的 div 進行綁定,在 data 中進行一個賦值,而在div 中 經過兩組大括號來對數據進行回顯
若是你有一些微信小程序的基礎的話,其實能夠發現,這二者結構看起來彷佛有一些類似的
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="hello"> <h2>{{content}}</h2> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> var vm = new Vue({ el: "#hello", data:{ content: "Hello Vue!" } }) </script> </body> </html>
回顯數據確定是沒問題的,咱們試着在控制檯修改 content 的值,能夠看到隨之頁面也就發生改變了
咱們已經成功建立了第一個 Vue 應用!看起來這跟渲染一個字符串模板很是相似,可是 Vue 在背後作了大量工做。如今數據和 DOM 已經被創建了關聯,全部東西都是 響應式的。咱們要怎麼確認呢?打開你的瀏覽器的 JavaScript 控制檯 (就在這個頁面打開),並修改app.message
的值,你將看到上例相應地更新。注意咱們再也不和 HTML 直接交互了。一個 Vue 應用會將其掛載到一個 DOM 元素上 (對於這個例子是
#app
) 而後對其進行徹底控制。那個 HTML 是咱們的入口,但其他都會發生在新建立的 Vue 實例內部。—— Vue 官網
若是有接觸過 Thymeleaf 這樣的模板,你能夠看出來,上面的 Vue 案例就是採用了一個簡潔模板語法,即兩組大括號包裹值,來聲明式聲明式地將數據渲染進 DOM 的系統,這其實和 Thymeleaf 中的 $ 加一組大括號 是類似的
咱們還有一種綁定元素的方式:即便用指令
<div id="hello-2"> <span v-bind:title="content"> 鼠標懸停幾秒鐘查看此處動態綁定的提示信息! </span> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> var vm = new Vue({ el: "#hello-2", data:{ content: '頁面加載於 ' + new Date().toLocaleString() } }) </script>
觀察結果,咱們將鼠標懸停在文字上方,被綁定的數據就會出現
你看到的 v-bind
attribute 被稱爲指令。指令帶有前綴 v-
,以表示它們是 Vue 提供的特殊 attribute,代碼的意思就是將這個元素節點的 title
attribute 和 Vue 實例的 content
property 保持一致」
若是你在控制檯進行修改 vm.content 的值,綁定的數據依舊會發生變化
注:使用 v-bind 須要頭部引入一個約束
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
若是使用 IDEA 安裝 Vue.js 插件 會有提示補全
條件判斷使用的指令就是 v-if
、v-else-if
、v-else
來看兩個例子,首先是對於 true 或者 false 的判斷
<div id="hello-3"> <h2 v-if="isBoy">是男孩</h2> <h2 v-else>是女孩</h2> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> var vm = new Vue({ el: "#hello-3", data:{ isBoy: true } }) </script>
默認顯示是男孩,咱們接着在控制檯修改成false
接着是對於值的判斷,咱們拿一個比較成績的小例子,不過對數值的約束仍是不夠嚴謹的,僅僅爲了講解 if 這個例子,明白意思就行
<div id="hello-3"> <h2 v-if="score < '60'">成績不及格</h2> <h2 v-else-if="score >= '60' && score < '80'">成績及格</h2> <h2 v-else>成績優秀</h2> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> var vm = new Vue({ el: "#hello-3", data:{ score: 66 } }) </script>
在結果中繼續修改看看
經過 v-for
就能夠進行循環遍歷,真例如 java 中的 加強for 只不過是把 冒號 換成了 in,students 對應 data 中的數組名,student 表明其中的每一項,經過 XXX.xx 的形式取出具體的屬性值
<div id="hello-4"> <li v-for="student in students"> {{student.name}} </li> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> var vm = new Vue({ el: "#hello-4", data: { students: [{name: '張三'}, {name: '李四'}, {name: '王五'}] } }) </script>
試着在控制檯 push 一個新的,一樣會更新出來
說明:這裏演示的只是最基本的一種狀況,不少時候,若遍歷的數組中爲對象,且對象有多個值,例如含有 id 這樣的值,通常會將這種惟一的 id 值做爲 key 值,例如:
<div v-for="item in items" v-bind:key="item.id"> <!-- 內容 --> </div>
爲了給 Vue 一個提示,以便它能跟蹤每一個節點的身份,從而重用和從新排序現有元素,你須要爲每項提供一個惟一key
attribute:建議儘量在使用
v-for
時提供key
attribute,除非遍歷輸出的 DOM 內容很是簡單,或者是刻意依賴默認行爲以獲取性能上的提高。
常常咱們須要經過點擊一些按鈕或者標籤組件等,使得用戶能夠與應用進行交互,也就是進行事件綁定,在 Vue 中咱們能夠經過 v-on
指令添加一個事件監聽器來進行
注:使用 v-on 引入約束
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
示例代碼
<div id="hello-5"> <button v-on:click="helloWorld">你好世界</button> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> var vm = new Vue({ el: "#hello-5", data: { content: "Hello World !" }, methods: { helloWorld: function () { alert(this.content); } } }) </script>
能夠看到,經過 v-on:click
就將 helloWorld 這個事件綁定了,而事件的具體邏輯須要定義在 Vue 對象的 methods 中
早在開篇介紹 MVVM 架構模式的時候,圖中就提到了 View 和 ViewModel 之間的雙向綁定,通俗的說就是:當數據發生變化時,視圖也變化,而當視圖發生變化的時候,數據也跟着變化
其實在前面的基本語法中,咱們已經能很明顯的體會到了前半句,即修改 data 中的數據,從而引發視圖中的變化,咱們這裏就重點提一下後半句
首先,Vue 提供了 v-model
指令,它能輕鬆實現表單輸入和應用狀態之間的雙向綁定
從常見的表單中的幾種形式來說,咱們可使用 v-model
指令在表單的 input
、textarea>
、select
等上進行數據的雙向綁定,它能夠根據控件類型選取正確的方法來更新元素
不過使用 v-model
指令後會忽略表單原先的 value、checked、selected 等的初始值,而總將 Vue 實例中的數據最爲數據源
input 中 ,輸入文本
<div id="hello-6"> 輸入: <input type="text" v-model="content" > 輸出: {{content}} </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> var vm = new Vue({ el: "#hello-6", data: { content: "Hello World !" }, }) </script>
在輸出的位置使用兩組大括號進行 content 這個值的回顯咱們以前就已經能作到了,而咱們在 input 的屬性中使用 v-model 進行對於 content 的綁定,這樣就可使得輸入框中輸入的值能夠直接影響 data 中 content 的值,即隨着你 input 中輸入值的修改,隨之輸出位置的內容也會變化
input 中 ,單選框
<div id="hello-6"> 性別: <input type="radio" name="gender" value="男" v-model="gender">男 <input type="radio" name="gender" value="女" v-model="gender">女 輸出: {{gender}} </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> var vm = new Vue({ el: "#hello-6", data: { gender: '男' }, }) </script>
效果顯示
select 中
<div id="hello-6"> <select v-model="choose"> <option value="" disabled>---請選擇---</option> <option>A-蘋果</option> <option>B-櫻桃</option> <option>C-西瓜</option> </select> 輸出: {{choose}} </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> var vm = new Vue({ el: "#hello-6", data: { choose: '' }, }) </script>
Vue 中組件也是一個很重要的概念,例如一個頁面中,頭部、底部、側邊欄、主內容區 均可以看作一個一個組件,不過有一些組件是固定的,例如頭部,還有一些是變換的例如內容區
Vue 中就容許咱們使用小型、獨立和一般可複用的組件構建大型應用
注:實際都是建立 .vue 模板文件,並不會用直接在頁面中書寫的這種形式,僅爲講解方便
直接拿一個簡單,不過還算相對完善的案例來進行講解‘
先說一下最終咱們想幹嗎,例如 div 或者 input 等等 都是一個一個標籤,咱們如今向作的就是經過建立自定義組件模板,自定義出一個這樣的標籤,咱們在須要的地方只須要引用這個標籤,咱們就能夠達到顯示出模板中想要的效果,達到抽取複用的效果
首先使用 Vue.component....... 這樣的格式建立組件,在其中 ideal-20 就是組件標籤的名字, template 就表明模板中的內容,props 表明咱們在引用處傳入的參數名
接着在一個已經綁定好的 hello-7 的 div 中引入自定義組件標籤 ideal-20,而咱們想要遍歷 data 中的 fruits 數組,在 ideal-20 屬性中進行 for 遍歷便可,同時咱們須要將每一項經過 v-bind:ideal="item"
綁定參數到組件模板中,由於數組不是一個普通的數組,因此賦 id 爲 key值
<div id="hello-7"> <ideal-20 v-for="item in fruits" v-bind:ideal="item" v-bind:key="item.id"></ideal-20> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> // 定義名爲 todo-item 的新組件 Vue.component('ideal-20', { props: ['ideal'], template: '<li>{{ideal.name}}</li>' }) var vm = new Vue({ el: "#hello-7", data: { fruits: [ {id: 0, name: '蘋果'}, {id: 1, name: '櫻桃'}, {id: 2, name: '山竹'} ] } }) </script>
效果展現
首先咱們須要提一下,爲何要用這個東西呢?
咱們在之前傳統的開發中,咱們通常會使用 Ajax 進行通訊,而 Vue,js 做爲一個視圖層框架,並不支持 Ajax 的通訊功能,因此可使用 Axios 來實現 Ajax 的異步通訊
首先看一下它的特色:
首先咱們拿一段 json 來模擬數據
{ "name": "BWH_Steven", "blog": "www.ideal-20.cn", "about": { "country": "中國", "phone": "13888888888" }, "students": [ { "id": 0, "name": "張三" }, { "id": 1, "name": "李四" }, { "id": 2, "name": "王五" } ] }
經過下圖咱們就能夠知道 咱們能夠將代碼寫到 mounted() 中去
接着就是使用的代碼了
首先除了引入 Vue 還須要引入 Axios 的 CDN,在 mounted() 方法中,去拿到這個json文件,同時將 response.data 也就是拿到的值,賦值給咱們在 data() 中定義的 info 中
注意:data 和 data() 是不同的
接着在綁定好的 hello-8 div 中就能夠調用回顯了
說明:爲何給 v-clock 添加了一個樣式呢,這是由於,顯示數據的過程是先顯示出{{info.name}}
這樣的字樣,拿到值後,再去渲染,若是網速慢的狀況下能夠看到 info.name 的,體驗不是很好
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title> <style> [v-clock] { display: none; } </style> </head> <body> <div id="hello-8" v-clock> <div>{{info.name}}</div> <div>{{info.blog}}</div> <div>{{info.about.country}}</div> <div>{{info.about.phone}}</div> <div>{{info.students[0].name}}</div> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script> var vm = new Vue({ el: "#hello-8", data() { return { info: {} } }, mounted() { axios.get("../json/data.json").then(response => (this.info = response.data)); } }) </script> </body> </html>
這一段,我認爲官方文檔說的仍是比較清楚的
模板內的表達式很是便利,可是設計它們的初衷是用於簡單運算的。在模板中放入太多的邏輯會讓模板太重且難以維護。例如:
<div id="example"> {{ message.split('').reverse().join('') }} </div>
在這個地方,模板再也不是簡單的聲明式邏輯。你必須看一段時間才能意識到,這裏是想要顯示變量 message
的翻轉字符串。當你想要在模板中多包含此處的翻轉字符串時,就會更加難以處理。
因此,對於任何複雜邏輯,你都應當使用計算屬性。
<div id="hello-9"> <p>原始數據: "{{ message }}"</p> <p>翻轉數據: "{{ reversedMessage }}"</p> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> var vm = new Vue({ el: '#hello-9', data: { message: 'Hello' }, computed: { // 計算屬性的 getter reversedMessage: function () { // `this` 指向 vm 實例 return this.message.split('').reverse().join('') } } }) </script>
結果:
原始數據: "Hello"
翻轉數據: "olleH"
這裏咱們聲明瞭一個計算屬性 reversedMessage
。咱們提供的函數將用做 property vm.reversedMessage
的 getter 函數:
console.log(vm.reversedMessage) // => 'olleH' vm.message = 'Goodbye' console.log(vm.reversedMessage) // => 'eybdooG'
你能夠打開瀏覽器的控制檯,自行修改例子中的 vm。vm.reversedMessage
的值始終取決於 vm.message
的值。
你能夠像綁定普通 property 同樣在模板中綁定計算屬性。Vue 知道 vm.reversedMessage
依賴於 vm.message
,所以當 vm.message
發生改變時,全部依賴 vm.reversedMessage
的綁定也會更新。並且最妙的是咱們已經以聲明的方式建立了這種依賴關係:計算屬性的 getter 函數是沒有反作用 (side effect) 的,這使它更易於測試和理解。
計算屬性和方法的區別 ?
看到這裏,你會不會以爲,貌似我用方法也能夠實現這種效果啊,將具體的業務邏輯放在定義的方法中,可是他們最大的區別是計算屬性是基於它們的響應式依賴進行緩存的,也就是說,咱們上文中所依賴的 message 不發生改變,reversedMessage 會立刻獲取以前的結果,就不用再次執行函數了,計算屬性能夠幫咱們節省大量的性能開銷,不過若是咱們並不但願出現緩存內容,就可使用方法來代替它
在 2.6.0 中,咱們爲具名插槽和做用域插槽引入了一個新的統一的語法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 這兩個目前已被廢棄但未被移除且仍在文檔中的 attribute。新語法的由來可查閱這份 RFC。
這塊寫的太淺了,不看也罷
插槽就是子組件給父組件一個佔位符即 <slot></slot>
父組件就能在這個佔位符,填一些模板或者 HTML 代碼
簡單點理解就是組件套組件
就像下面我定義了三個組件,ideal是父組件,在其中用 slot 進行佔位,同時用 name 屬性指向到了這兩個子組件 ideal-title 和 ideal-content,而爲了子組件中顯示的數據來自服務器(模擬)因此須要動態地顯示,即經過傳參(前面講解組件模板有說過),配合遍歷等讀出 data 中的數據便可
<div id="hello-10"> <ideal> <ideal-title slot="ideal-title" v-bind:title="title"></ideal-title> <ideal-content slot="ideal-content" v-for="contentItem in contents" v-bind:content="contentItem"></ideal-content> </ideal> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> <script> Vue.component("ideal", { template: '<div>\ <slot name="ideal-title"></slot>\ <ul>\ <slot name="ideal-content"></slot>\ </ul>\ </div>' }) Vue.component("ideal-title", { props: ['title'], template: '<div>{{title}}</div>' }) Vue.component("ideal-content", { props: ['content'], template: '<li>{{content}}</li>' }) var vm = new Vue({ el: '#hello-10', data: { title: "理想二旬不止", contents: ["Java", "Linux", "數據庫"] } }) </script>
結果以下:
Vue-cli 是官方提供的一個用於快速建立 Vue 項目的腳手架,能夠簡單的理解爲 Maven ,即建立時選擇一個骨架那種感受,能讓開發更加便捷
cmd 下輸入 node -v
,出現版本號即正常,輸入 npm -v
一樣出現版本號即正常
# -g 表明全局安全 推薦此方法 npm install cnpm -g # 還有一種辦法就是每次使用 npm 都在後面加一串字符串,不推薦 npm install --registry=https://registry.npm.tabao.org
安裝後打開此路徑(abc是我這臺機器的用戶名,根據本身的來):
C:\Users\abc\AppData\Roaming\npm\node_modules
正常狀況下里面會有安裝好的 cnpm,接着咱們就開始安裝 vue-cli
cnpm install vue-cli -g
安裝後在 npm 文件夾下打開 cmd 輸入 vue-list
,若出現下圖這種星狀內容,則完畢
本身在想要的位置建立一個目錄,選擇基於 webpack 的 vue 應用程序
此文件夾下的 cmd 中輸入命令
vue init webpack vue_02_myvue
輸入一些基本信息,例如 項目名 做者名
下面的內容若是有選項的回車配合 n(也就是no)進行
這時,它會詢問你是否自動執行 npm install(以下),是的話則會自動安裝一些依賴,點擊否,須要自行再輸入命令安裝,因此選擇是就好了
Should we run npm install for you after the project has been created? (recommended) npm
完成以後,項目中的 node_modules 就會多出不少不少依賴
再接着,它又會提醒初始化好了,你若是想啓動就能夠執行這兩條,第一句是從外面的文件夾進入到我自定義的那個項目文件夾中,第二句則是啓動
出現若是所示內容則啓動成功,經過後面的地址和端口就能夠訪問
找個編輯器看一下,我用 IDEA Open進這個文件夾來,就能夠進行修改了,具體的代碼文件仍是在 src 目錄下,同時還能夠配置 IDEA 的 Terminal 爲有管理員權限的 cmd 或者終端,能更便捷一些
如何快速建立項目
蓋菜咱們建立 vue 項目的時候,選擇的是 webpack 進行打包,可是都是自動化的過程,咱們手動的操做一下,能更好的理解
webpack是一個現代 Javascript應用程序的靜態模塊打包器( module bundler)。當webpack處理應用程序時,它會遞歸地構建一個依賴關係 Dependency graph),其中包含應用程序須要的毎個模塊,而後將全部這些模塊打包成一個或多個 bundle
webρack是當下最熱門的前端資源模塊化管理和打包工具,它能夠將許多鬆散耦合的模塊按照
依賴和規則打包成符合生產環境部署的前端資源。還能夠將按需加載的模塊進行代碼分離,等到實際
須要時再異步加載。經過 loader轉換,任何形式的資源均可以當作模塊,好比 Commonis、AMD、ES六、CSS、JSON、 Coffee Script、LESS等;
安裝 webpack、webpack-cli ,若是 npm 不太慢先考慮使用 npm 再考慮使用 cnpm
cnpm install webpack -g cnpm install webpack-cli -g
經過 webpack -v
、webpack-cli -v
查看是否出現版本號肯定安裝是否成功
exports.test = function () { document.write("<h2>理想二旬不止</h2>") }
var demo = require("./demo") demo.test();
module.exports = { entry: "./modules/main.js", output: { filename: "./js/bundle.js" } };
abc@LAPTOP-5T03DV1G MINGW64 /f/develop/IdeaProjects/framework-code/vue/webpack_01_first $ webpack Hash: 7f61ef9440a6bab63058 Version: webpack 4.44.1 Time: 334ms Built at: 2020-09-05 4:18:40 PM Asset Size Chunks Chunk Names ./js/bundle.js 1020 bytes 0 [emitted] main Entrypoint main = ./js/bundle.js [0] ./modules/main.js 42 bytes {0} [built] [1] ./modules/demo.js 82 bytes {0} [built] WARNING in configuration The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each e nvironment. You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script src="dist/js/bundle.js"></script> </body> </html>
補充:配置文件中可能會有哪些內容
Vue Router是 Vue.js 的官方路由器。它與 Vue.js 核心深度集成,使使用 Vue.js 輕鬆構建單頁應用程序變得垂手可得。功能包括:
簡單的說,能夠實現一些頁面的跳轉,例如咱們頭部的內容是不變的,內容部分須要根據連接改變
安裝步驟:
因爲 vue-router 是一個插件包,仍是老辦法,npm/cnpm
npm install vue-router --save-dev
安裝後若是有一些問題,根據提示,輸入對應命令便可,就像我遇到了提示輸入 npm audit fix
建立好項目後,刪掉默認的 HelloWorld那個組件,而後再 components 中新建兩個自定義組件,例如我建立的 FirstDemo.vue 和 Main.vue 前者是一個子頁面,後者表明主頁面,隨便自擬
FirstDemo.vue
<template> <h1>第一個Demo頁面</h1> </template> <script> export default { name: "FirstDemo.vue" } </script> <style scoped> </style>
Main.vue
<template> <h1>首頁</h1> </template> <script> export default { name: "Main.vue" } </script> <style scoped> </style>
接着建立 router 文件夾,以及其中的 index.js 主配置
注:若是在一個模塊化工程中使用它,必需要經過 Vue.use() 明確地安裝路由功能
import Vue from 'vue' import VueRouter from 'vue-router' import FirstDemo from '../components/FirstDemo' import Main from '../components/Main' Vue.use(VueRouter); export default new VueRouter({ routes: [ { // 路由路徑 path: "/firstDemo", name: 'firstDemo', // 跳轉的組件 component: FirstDemo }, { // 路由路徑 path: "/main", name: 'main', // 跳轉的組件 component: Main } ] })
修改 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' import App from './App' import router from './router' Vue.config.productionTip = false Vue.use(router); /* eslint-disable no-new */ new Vue({ el: '#app', //配置路由 router, components: {App}, template: '<App/>' })
以及正式的書寫頁面,引入連接
<template> <div id="app"> <h1>理想二旬不止</h1> <router-link to="/main">首頁</router-link> <router-link to="/firstDemo">第一個Demo頁面</router-link> <router-view></router-view> </div> </template> <script> export default { name: 'App', } </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_03_vue_elementui 的項目,同時安裝 vue-router、e1ement-ui、sass-loader 、node-sass 插件
# 建立項目 vue init webpack vue_03_vue_elementui # 進入工程目錄 cd vue_03_vue_elementui # 安裝vue-router npm install vue-router --save-dev # 安裝e1ement-ui npm i element-ui -S # 安裝依賴 npm install # 安裝SASS加載器 cnpm install sass-loader node-sass --save-dev # 啓動測試 npm run dev
補充:Npm命令解釋
接着就能夠在編輯器中打開了,看我的選擇,我這裏用 IDEA 打開,打開後注意看一下 modules 文件夾中是否已經把 router sass 等內容成功安裝了
接着將默認的 HelloWorld 那個組件和默認 logo 刪掉,開始編寫代碼,建立一個 views 文件夾用來放視圖
建立 Login.vue 和 Main.vue
Login.vue
<template> <h1>主頁面</h1> </template> <script> export default { name: "Main.vue" } </script> <style scoped> </style>
Main.vue
<template> <div> <el-form ref="loginForm" :model="form" :rules="rules" label-width="80px" class="login-box"> <h3 class="login-title">歡迎 登陸</h3> <el-form-item label=" 帳號" prop="username"> <el-input type="text" placeholder="請輸入帳號" v-model="form.username"/> </el-form-item> <el-form-item label=" 密碼" prop="password"> <el-input type="password" placeholder=" 請輸入密碼" v-model="form.password"/> </el-form-item> <el-form-item> <el-button type="primary" v-on:click="onSubmit( 'loginForm' )">登陸</el-button> </el-form-item> </el-form> <el-dialog title="舒適提示" :visible.sync="dialogVisible" width="30%" :before-close="handLeClose"> <span>請輸入帳號和密碼</span> <span slot="footer" class="dialog- footer"> <el-button type="primary" @click="dialogVisible = false">肯定</el-button> </span> </el-dialog> </div> </template> <script> export default { name: "Login", data() { return { form: { username: '', password: '' }, //表單驗證,須要在el-form-item 元素中增長prop 屬性 rules: { username: [ {required: true, message: " 帳號不可爲空", trigger: 'blur'} ], password: [ {required: true, message: " 密碼不可爲空 ", trigger: 'blur'} ] }, //對話框顯示和隱藏 dialogVisible: false } }, methods: { onSubmit(formName) { //爲表單綁定驗證功能 this.$refs[formName].validate((valid) => { if (valid) { //使用vue-router路由到指定頁面,該方式稱之爲編程式導航 this.$router.push("/main"); } else { this.dialogVisible = true; return false; } }); } } } </script> <style lang="scss" scoped> .login-box { border: 1px solid #DCDFE6; width: 350px; margin: 40px auto; padding: 35px 35px 15px 35px; border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px; box-shadow: 0 0 25px #909399; } .login-title { text-align: center; margin: 0 auto 40px auto; color: #303133; } </style>
建立 router 文件夾,以及其中的 index.js,配置好跳轉內容
index.js
import Vue from 'vue' import VueRouter from 'vue-router' import Login from '../views/Login' import Main from '../views/Main' Vue.use(VueRouter); export default new VueRouter({ routes: [ { path: "/main", component: Main }, { path: "/login", component: Login } ] })
修改 main.js ,使用 router 和 elementui,關於 router 前面就說過,至於後者,照着官網起步文檔就明白了
https://element.eleme.cn/#/zh-CN/component/quickstart
main.js
import Vue from 'vue' import App from './App' import router from './router' import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; Vue.config.productionTip = false; Vue.use(router); Vue.use(ElementUI); /* eslint-disable no-new */ new Vue({ el: '#app', router, render: h => h(App) });
App.vue
<template> <div id="app"> <h1>理想二旬不止</h1> <router-link to="/main">首頁</router-link> <router-link to="/login">登陸頁面</router-link> <router-view></router-view> </div> </template> <script> export default { name: 'App', } </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>
到這裏就寫好了,咱們能夠開始運行了,可是運行時,我分別出現了以下錯誤
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined Module build failed: TypeError: this.getResolve is not a function
經查閱後,修改項目目錄下 package.json 中的 sass-loder 的版本 從 10.0.2 到 8.0.2 到 7.3.1 才能夠正常經過 npm run dev 運行
"sass-loader": "^7.3.1",
注:修改配置後須要從新 npm install 或者 cnpm install
展現一下最終效果:
點擊首頁效果:
點擊登陸頁面效果:
最後,在某立刻找了一個現成的頁面案例,簡單搭了下後臺跑了一下,也算鞏固一下最前面的基礎語法,後臺就基本的 SSM ,給了三個接口方法,做爲一個後端,這應該算基本功了哇
/user/findAll
、/user/indById
、 /user/updateUser
就是簡單的查詢和一個更新操做,查詢的主體是一個用戶類,有這麼幾個基本字段
public class User implements Serializable { private Integer id; private String username; private String password; private Integer age; private String sex; private String email; ...... }
頁面中承接的數據的關鍵代碼以下
首先是關於全部用戶數據展現的,經過一個對於 userList 的遍歷,而後經過大括號組和 X.x 的形式取出屬性值
<tr v-for="u in userList"> <td><input name="ids" type="checkbox"></td> <td>{{u.id}}</td> <td>{{u.username}} </td> <td>{{u.password}}</td> <td>{{u.sex}}</td> <td>{{u.age}}</td> <td class="text-center">{{u.email}}</td> <td class="text-center"> <button type="button" class="btn bg-olive btn-xs">詳情</button> <button type="button" class="btn bg-olive btn-xs" @click="findById(u.id)">編輯</button> </td> </tr>
點擊編輯後執行對於當前用戶的查詢方法,用於回顯,下面經過 v-model 進行與 user 的綁定(js後面給出)
<div class="box-body"> <div class="form-horizontal"> <div class="form-group"> <label class="col-sm-2 control-label">用戶名:</label> <div class="col-sm-5"> <input type="text" class="form-control" v-model="user.username"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">密碼:</label> <div class="col-sm-5"> <input type="text" class="form-control" v-model="user.password"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">性別:</label> <div class="col-sm-5"> <input type="text" class="form-control" v-model="user.sex"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">年齡:</label> <div class="col-sm-5"> <input type="text" class="form-control" v-model="user.age"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">郵箱:</label> <div class="col-sm-5"> <input type="text" class="form-control" v-model="user.email"> </div> </div> </div> </div>
要實現數據交互,最重要的仍是定義數據,與使用 axios 進行異步請求
var vue = new Vue({ el: "#app", data: { user: {id: "", username: "", password: "", age: "", sex: "", email: ""}, userList: [] }, methods: { findAll: function () { var _this = this; axios.get("user/findAll.do").then(function (response) { _this.userList = response.data; console.log(_this.userList); }).catch(function (err) { console.log(err); }); }, findById: function (userid) { var _this = this; axios.get("user/findById.do", { params: { id: userid } }).then(function (response) { _this.user = response.data; $('#myModal').modal("show"); }).catch(function (err) { }); }, update: function (user) { var _this = this; axios.post("user/updateUser.do", _this.user).then(function (response) { _this.findAll(); }).catch(function (err) { }); } }, created() { this.findAll(); } });
上述代碼其實很好理解,首先定義了 user 和 userList 兩個數據,userList 就是前面展現全部用戶數據的一個遍歷內容,用來承載 findAll 後的數據,user 則是對於進行單個用戶查詢,即修改時回顯當前用戶舊信息的一個承載實體,由於查詢全部的操做是一開始就進行,因此在 created() 中就執行 findAll 方法,在 methos 中建立查和改的方法,經過 axios 進行 get 或者 post 請求,同時將返回的結果進行處理
說明:.then
中的是請求成功後執行的內容,.catch
中是請求失敗後執行的內容
注意:最關鍵的一個內容就是在 axios 前定義了 var _this = this
若是有接觸太小程序可能會感到很熟悉,這裏定義的緣由是由於 例如在 axios 中有這樣的語句 _this.userList = response.data;
若是 userList 中前直接使用 this,這就表明着查找 axios 中的此內容,但咱們明顯想指代的是 data 中的 userList,因此此定義 _this
步驟不可省略
效果以下:
查詢全部
查詢當前用戶以及修改
若是文章中有什麼不足,歡迎你們留言交流,感謝朋友們的支持!
若是能幫到你的話,那就來關注我吧!若是您更喜歡微信文章的閱讀方式,能夠關注個人公衆號
在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤一個堅持推送原創開發技術文章的公衆號:理想二旬不止