vue基礎語法
vue官網連接:https://cn.vuejs.org/html
1、Vue簡介前端
Vue.js 是一個用於建立 Web 交互界面的庫。它讓你經過簡單而靈活的 API 建立由數據驅動的 UI 組件。vue
Vue.js是一款輕量級的、以數據驅動構建web界面的前端JS框架,它在架構設計上採用了MVVM(Model-View-ViewModel)模式,其中ViewModel是Vue.js的核心,它是一個Vue的實例,而這個實例又做用域頁面上的某個HTML元素。html5
其核心在於經過數據驅動界面的更新和展現而非JS中經過操做DOM來改變頁面的顯示。java
2、Vue快速入門
進入文件夾,按住shift,右鍵打開cmd窗口,下載vue.js.
npm install vueios
咱們經過new Vue()構建了一個Vue的實例。web
在實例化 Vue 時,須要傳入一個選項對象,它能夠包含數據、模板、掛載元素、方法、生命週期鉤子等選項。好比:掛載元素(el)和數據(data),咱們能夠操縱數據改變視圖。數據庫
el表示Vue要操做哪個元素下面的區域,好比:#app則表示操做id爲app的元素下面的區域;express
data表示Vue實例的數據對象,data的屬性可以響應數據的變化;每一個 Vue 實例都會代理其 data 對象裏全部的屬性。npm
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <p>{{message}}</p> </div> </body> <script_top src="js/vue.js"></script_top> <script_top> // 1.建立Vue的案例 let vm = new Vue({ el:'#app', data:{ //vue中的model -> 數據 message:'你好,世界!' } }) </script_top> </html>
運行結果:
2.2 Vue中雙向數據綁定
MVVM模式其自身是實現了數據的雙向綁定的,在Vue.js中咱們能夠經過指令v-model來實現數據雙向綁定。
代碼以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <p>{{message}}</p> <input type="text" v-model="message"> </div> </body> <script_top src="js/vue.js"></script_top> <script_top> let vm = new Vue({ el:'#app', data:{ //vue中的model -> 數據 message:'你好,世界!' } }) </script_top> </html>
運行結果:
pycharm識別VUE 設置:以下圖
模板設置:
英文版:
2.3調用模板:
Vue的經常使用指令
Vue.js提供了很多經常使用的內置指令,接下來咱們快速搞定它們,這對咱們接下來的開發幫助很大。主要有:
v-once指令
v-if指令
v-show指令
v-else指令
v-for指令
v-on指令
v-bind指令
v-once:執行一次性地插值,當數據改變時,插值處的內容不會更新。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <h3>v-once:是不會改變的</h3> <p v-once>原始值:{{msg}}</p> <p>後面的:{{msg}}</p> <input type="text" v-model="msg"> </div> <script_top src="js/vue.js"></script_top> <script_top> let vm = new Vue({ el:'#app', data:{ msg:'你好,世界!' } }); </script_top> </body> </html>
運行結果: v-model 動態傳值給msg 變量了。 加上v-once,變量的值不會改變!!!
v-if : 能夠接收一個表達式. 不知足條件能夠註釋(沒有該標籤)
條件渲染指令,根據表達式的真假來添加或刪除元素。其語法結構是:v-if="expression",其中expression是一個返回bool值的表達式,其結果能夠是true或false,也能夠是返回true或false的表達式。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>04-Vue的經常使用指令-v-if</title> </head> <body> <div id="app"> <p v-if="show">要顯示出來!</p> <p v-if="hide">不要顯示出來!</p> <!--v-if能夠接收一個表達式.不知足條件能夠註釋。--> <p v-if="height > 1.55">小明身高:{{height}}m</p> <p v-if="height1 > 1.55">小明身高:{{height1}}m</p> </div> <script_top src="js/vue.js"></script_top> <script_top> //經過數據操控界面 let vm = new Vue({ el:'#app', data:{ show:true, hide:false, //v-if能夠接收一個表達式. height:1.68, height1:1.50, } }); </script_top> </body> </html>
運行結果:
擴展:
![](http://static.javashuo.com/static/loading.gif)
咱們也能夠打開控制檯,作出以下輸入,進一步體會數據驅動思想: 在上述案例中,Vue.js進行數據綁定也徹底支持Javascript_top表達式支持,這些表達式會在Vue實例的數據做用域下做爲Javascript_top被解析。 {{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.split('').reverse().join('') }} <div v-bind:id="'list-' + id"></div> 有個限制就是,每一個綁定都只能包含單個表達式,如下則不會生效: <!-- 這是語句,不是表達式 --> {{ var a = 1 }} <!-- 流控制也不會生效,請使用三元表達式 --> {{ if (ok) { return message } }}
v-show : v-show是根據表達式之真假值,切換元素的 display CSS 屬性
也是條件渲染指令,不一樣的是有 v-show 的元素會始終渲染並保持在 DOM 中。和v-if指令不一樣點在於:v-show是根據表達式之真假值,切換元素的 display CSS 屬性,當條件變化時該指令觸發過渡效果。
代碼以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>05-Vue的經常使用指令-v-show</title> </head> <body> <div id="app"> <p v-show="show">要顯示出來!</p> <p v-show="hide">不要顯示出來!</p> <!--v-show能夠接收一個表達式.不知足條件則不顯示。至關於display:none--> <p v-show="height > 1.55">小明身高:{{height}}m</p> <p v-show="height1 > 1.55">小明身高:{{height1}}m</p> </div> <script_top src="js/vue.js"></script_top> <script_top> //經過數據操控界面 let vm = new Vue({ el:'#app', data:{ show:true, hide:false, //v-show能夠接收一個表達式. height:1.68, height1:1.50, } }); </script_top> </body> </html>
運行結果: v-show 不符合至關於 display:none;
v-show和v-if的區別:
v-if 是真實的條件渲染,由於它會確保條件塊在切換當中適當地銷燬與重建條件塊內的事件監聽器和子組件;
v-show 則只是簡單地基於 CSS 切換。
v-if 有更高的切換消耗而 v-show 有更高的初始渲染消耗。所以,若是須要頻繁切換使用 v-show 較好,若是在運行時條件不大可能改變則使用 v-if 較好。
v-else 二選一 注意:v-else前一兄弟元素必須有 v-if 或 v-else-if。
能夠用v-else指令爲v-if或v-show添加一個「else塊」。
代碼以下:v-if和v-else結合
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>06vue-v-else命令</title> </head> <body> <div id="app"> <!--v-else:是不能單獨使用的。前面必須加上v-if/v-show.而且必須黏在一塊兒,不然會報錯。--> <p v-if="height > 1.70">小明身高:{{height}}m</p> <p v-else>小明身高不足1.70m</p> </div> <script_top src="js/vue.js"></script_top> <script_top> //經過數據操控界面 let vm = new Vue({ el:'#app', data:{ //v-else. height:1.88, } }); </script_top> </body> </html>
v-else-if 多選一
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>07Vue的經常使用指令v-else-if</title> </head> <body> <div id="app"> <!--v-else-if--> <p>輸入的成績對於的等級是:</p> <p v-if="score >= 90">優秀</p> <p v-else-if="score >= 80">良好</p> <p v-else-if="score >= 60">及格</p> <p v-else>不及格</p> <input type="text" v-model="score"> </div> <script_top src="js/vue.js"></script_top> <script_top> //經過數據操控界面 let vm = new Vue({ el:'#app', data:{ //v-else-if. score:50 //優秀 良好 及格 不及格 } }); </script_top> </body> </html>
v-for 基於數據渲染一個列表,相似於JS中的遍歷。其數據類型能夠是 Array | Object | number | string。
該指令之值,必須使用特定的語法(item, index) in items, 爲當前遍歷元素提供別名。 v-for的優先級別高於v-if之類的其餘指令
代碼以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>08-Vue的經常使用指令v-for</title> </head> <body> <div id="app"> <p v-for="(score, index) in scores"> {{index + ':' + score}} </p> <hr> <p v-for="d in dog"> {{d}} </p> <hr> <p v-for="str in name"> {{str}} </p> <hr> <p v-for="n in phone"> {{n}} </p> </div> <script_top src="js/vue.js"></script_top> <script_top> let vm = new Vue({ el:'#app', data:{ scores:[100,87,88,80], dog:{name:'旺財',age:6,height:1.2}, name:'er', phone:'123', } }); </script_top> </body> </html>
v-for練習
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> table{ width:600px; border:2px solid orangered; text-align:center; } thead{ background:orangered; } </style> </head> <body> <div id="app"> <table> <thead> <tr> <td>姓名</td> <td>年齡</td> <td>性別</td> </tr> </thead> <tbody> <tr v-for="p in persons"> <td>{{p.name}}</td> <td>{{p.age}}</td> <td>{{p.sex}}</td> </tr> </tbody> </table> </div> <script_top src="js/vue.js"></script_top> <script_top> let vm = new Vue({ el:'#app', data:{ persons:[ {name:'張三',age:18,sex:'男'}, {name:'李四',age:20,sex:'男'}, {name:'王五',age:23,sex:'女'}, {name:'趙6',age:30,sex:'男'} ] } }); </script_top> </body> </html>
v-text:標籤裏的內容都不會渲染。 v-html:字符串標籤。 標籤裏的內容都不會渲染。
代碼以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <p>{{msg}}hahaha</p> <!-- v-text:標籤裏的內容都不會渲染 --> <p v-text="msg">呵呵呵呵</p> <hr> <!-- 字符串標籤。 標籤裏的內容都不會渲染--> <div v-html="html"> 哈哈哈哈 <input type="text"> </div> </div> <script_top src="js/vue.js"></script_top> <script_top> let vm = new Vue({ el:'#app', data:{ msg:'今每天氣真好!', html:'<input type="date"><input type="color">' } }); </script_top> </body> </html>
運行結果:
v-bind 簡寫方式:冒號 動態綁定屬性、樣式、類 動態地綁定一個或多個特性,或一個組件 prop 到表達式。
v-bind指令能夠在其名稱後面帶一個參數,中間用一個冒號隔開。這個參數一般是HTML元素的特性(attribute),好比:
v-bind:src="imageSrc" 能夠縮寫: :src="imgaeSrc"
:class="{ red: isRed }" 或 :class="[classA, classB]" ...
:style="{ fontSize: size + 'px' }" 或 :style="[styleObjectA, styleObjectB]" ...
綁定一個有屬性的對象,好比:v-bind="{ id: someProp, 'other-attr': otherProp }"
...
語法結構:v-bind:argument="expression"
由於 Mustache 不能在 HTML 屬性中使用,應使用 v-bind 指令,Mustache 是一個 logic-less (輕邏輯)模板解析引擎,它的優點在於能夠應用在 Javascript_top、PHP、Python、Perl 等多種編程語言中。
案例實操:讓HTML5學院在各大學院中處於選中狀態
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>2.class</title> <style> .active{ background-color:orangered; font-size:20px; color:#fff; } </style> </head> <body> <div id="app"> <p v-for="(college,index) in colleges" :class="index === activeIndex ? 'active' : ''"> {{college}} </p> <p style="color:red">今天的天氣很好!</p> <p :style="{color:fontColor}">今天的天氣很好!</p> </div> <script_top src="js/vue.js"></script_top> <script_top> let vm = new Vue({ el:'#app', data:{ colleges:[ 'ios學院', 'java學院', 'html5學院', 'ui學院', 've學院' ], activeIndex:0, fontColor:'green', } }); </script_top> </body> </html>
運行結果:
v-on 簡寫方式:@ 動態地綁定一個或多個特性,或一個組件 prop 到表達式;其做用和v-bind相似。注意:若是用在普通元素上時,只能監聽 原生 DOM 事件;可是若是用在自定義元素組件上時,也能夠監聽子組件觸發的自定義事件。
經常使用的修飾符包括:
.stop - 調用 event.stopPropagation();中止冒泡。
.prevent - 調用 event.preventDefault(); 中止監聽原生事件。
.capture - 添加事件偵聽器時使用 capture 模式。
.self - 只當事件是從偵聽器綁定的元素自己觸發時才觸發回調。
.{keyCode | keyAlias} - 只當事件是從偵聽器綁定的元素自己觸發時才觸發回調。
.once - 觸發一次。
使用手法:
<!-- 方法處理器 -->
<button v-on:click="doThis"></button>
<!-- 內聯語句 -->
<button v-on:click="doThat('hello', $event)"></button>
<!-- 縮寫 -->
<button @click="doThis"></button>
<!-- 中止冒泡 -->
<button @click.stop="doThis"></button>
<!-- 阻止默認行爲 -->
<button @click.prevent="doThis"></button>
<!-- 阻止默認行爲,沒有表達式 -->
<form @submit.prevent></form>
<!-- 串聯修飾符 -->
<button @click.stop.prevent="doThis"></button>
<!-- 鍵修飾符,鍵別名 -->
<input @keyup.enter="onEnter">
<!-- 鍵修飾符,鍵代碼 -->
<input @keyup.13="onEnter">
<!-- the click event will be triggered at most once -->
<button v-on:click.once="doThis"></button>
綁定事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>v-on</title> </head> <body> <div id="app"> <!-- v-vind:簡寫冒號。綁定:屬性、樣式、類 --> <p :style="{color:fontColor}">{{msg}}</p> <button v-on:click="msg='娃哈哈'">改變內容</button> <!-- v-on:簡寫@ --> <button @click="changeContent()">改變內容1</button> <button @click="changeContentColor()">改變字體顏色</button> </div> <script_top src="js/vue.js"></script_top> <script_top> let vm = new Vue({ el:'#app', data:{ msg:'今天的天氣很好!', fontColor:'red' }, methods:{ // 實例因此函數實現 // 鉤子函數 changeContent(){ // alert(0); this.msg='測試改掉沒有!'; }, changeContentColor(){ this.fontColor = 'green'; } } }); </script_top> </body> </html>
綜合練習:增刪小例子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #app{ margin:50px auto; width:600px; } fieldset{ border:1px solid orangered; margin-bottom: 20px; } fieldset input{ width:200px; height:30px; margin:10px 0; } table{ width:600px; border:2px solid orangered; text-align:center; } thead{ background:orangered; } </style> </head> <body> <div id="app"> <!-- 第一部分 --> <fieldset> <legend>貝貝學生錄入系統</legend> <div> <span>姓名:</span> <input type="text" placeholder="請輸入姓名" v-model="newStudent.name"> </div> <div> <span>年齡:</span> <input type="text" placeholder="請輸入年齡" v-model="newStudent.age"> </div> <div> <span>性別:</span> <select v-model="newStudent.sex"> <option value="男">男</option> <option value="女">女</option> </select> </div> <div> <span>手機號:</span> <input type="text" placeholder="請輸入手機號" v-model="newStudent.phone"> </div> <!-- v-on @ --> <button @click="createNewStudent()">建立新用戶</button> </fieldset> <!-- 第二部分 --> <table> <thead> <tr> <td>姓名</td> <td>年齡</td> <td>性別</td> <td>手機號</td> <td>操做</td> </tr> </thead> <tbody> <tr v-for="(p,index) in persons"> <td>{{p.name}}</td> <td>{{p.age}}</td> <td>{{p.sex}}</td> <td>{{p.phone}}</td> <td> <button @click="deleteStudentMsg(index)">刪除</button> </td> </tr> </tbody> </table> </div> <script_top src="js/vue.js"></script_top> <script_top> let vm = new Vue({ el:'#app', data:{ persons:[ {name:'張三',age:18,sex:'男',phone:'12345'}, {name:'李四',age:20,sex:'男',phone:'12345'}, {name:'王五',age:23,sex:'女',phone:'12345'}, {name:'趙6',age:30,sex:'男',phone:'12345'} ], newStudent:{name:'',age:0,sex:'男',phone:''}, }, methods:{ // 建立一條新記錄 createNewStudent(){ // 姓名不能爲空 if(this.newStudent.name === ''){ alert('姓名不能爲空!'); return; } // 年齡不能小於0 if(this.newStudent.age <= 0){ alert('請輸入正確的年齡!'); return; } // 手機號不能爲空 if(this.newStudent.phone === ''){ alert('手機號不能爲空!'); return; } // 往數據庫添加一條新元素 this.persons.unshift(this.newStudent); // 清空數據 this.newStudent = {name:'',age:0,sex:'男',phone:''}; }, // 刪除一條學生記錄 deleteStudentMsg(index){ this.persons.splice(index,1) } } }); </script_top> </body> </html>
運行結果:
計算屬性(computed properties)
1、原由?
雖然在模板中綁定表達式是很是便利的,可是它們實際上只用於簡單的操做。在模板中放入太多的邏輯會讓模板太重且難以維護。好比:
<div id="example">
{{ message.split('').reverse().join('') }}
</div>
這樣,模板再也不簡單和清晰。在實現反向顯示 message 以前,你應該經過一個函數確認它。因此,Vue.js提供了計算屬性來讓咱們去處理實例中的複雜邏輯。
計算屬性 (computed properties) 就是不存在於原始數據中,而是在運行時實時計算出來的屬性。
案例以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <p>初始值:{{name}}</p> <!-- 表達式要產生結果便可 --> <p>翻轉值:{{name.split('').reverse().join('')}}</p> <p>函數調用:{{revecrStr()}}</p> <!-- 直接調用計算屬性,就會直接調用get方法。 --> <p>計算屬性:{{reverse}}</p> </div> <script_top src="js/vue.js"></script_top> <script_top> new Vue({ el:'#app', data:{ name:'Rosc jack' }, methods:{ revecrStr(){ //函數 return this.name.split('').reverse().join(''); }, }, //計算選項 computed:{ // get方法 計算屬性 // 直接調用計算屬性,就會直接調用get方法。 reverse(){ return (this.name.split('').reverse().join('')); } } }) </script_top> </body> </html>
運行結果:
計算屬性被設計出來的目的在於:getter 是乾淨無反作用的。
2、計算屬性 和 Methods的區別?
當頁面從新渲染(不是刷新)的時候,計算屬性不會變化,直接讀取緩存使用,適合較大量的計算和改變頻率較低的屬性;而method,就是當頁面從新渲染的時候(頁面元素的data變化,頁面就會從新渲染),都會從新調用method。
若是不但願有緩存,咱們能夠用method取代computed。
疑惑:爲何須要緩存?
假設咱們有一個重要的計算屬性 A ,這個計算屬性須要一個巨大的數組遍歷和作大量的計算。而後咱們可能有其餘的計算屬性依賴於 A 。若是沒有緩存,咱們將不可避免的屢次執行 A 的 getter !
3、計算屬性的setter方法
計算屬性默認只有 getter ,不過在須要時你也能夠提供一個 setter :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>計算屬性</title> </head> <body> <div id="app"> <p>{{fullName}}</p> <!-- v-on @ --> <button @click="deal()">調用計算屬性的setter方法</button> </div> <script_top src="js/vue.js"></script_top> <script_top> new Vue({ el:'#app', data:{ firstName:'zhang', lastName:'sanfeng' }, methods:{ deal(){ // 調用計算屬性的setter方法 this.fullName = '娃 哈哈'; } }, computed:{ /*//get fullName(){ return this.firstName + ' ' + this.lastName }*/ fullName:{ // get方法 get:function(){ return this.firstName + ' ' + this.lastName; }, // set方法 至關於傳值。 set:function(str){ // alert(0) let nameArr = str.split(' '); this.firstName = nameArr[0]; this.lastName = nameArr[1]; } } } }) </script_top> </body> </html>