Vue.js讀音 /vjuː/, 相似於 viewjavascript
Vue.js是前端三大新框架:Angular.js、React.js、Vue.js之一,Vue.js目前的使用和關注程度在三大框架中稍微勝出,而且它的熱度還在遞增。css
Vue.js能夠做爲一個js庫來使用,也能夠用它全套的工具來構建系統界面,這些能夠根據項目的須要靈活選擇,因此說,Vue.js是一套構建用戶界面的漸進式框架。html
Vue的核心庫只關注視圖層,Vue的目標是經過儘量簡單的 API 實現響應的數據綁定,在這一點上Vue.js相似於後臺的模板語言。前端
Vue也能夠將界面拆分紅一個個的組件,經過組件來構建界面,而後用自動化工具來生成單頁面(SPA - single page application)系統。vue
Vue.js使用文檔已經寫的很完備和詳細了,經過如下地址能夠查看: https://cn.vuejs.org/v2/guide/
vue.js若是當成一個庫來使用,能夠經過下面地址下載: https://cn.vuejs.org/v2/guide/installation.htmljava
首先經過將vue.js做爲一個js庫來使用,來學習vue的一些基本概念,咱們下載了vue.js後,須要在頁面上經過script標籤引入vue.js,開發中可使用開發版本vue.js,產品上線要換成vue.min.js。ios
<script type="text/javascript" src="js/vue.min.js"></script>
每一個 Vue 應用都是經過實例化一個新的 Vue對象開始的:git
window.onload = function(){ var vm = new Vue({ el:'#app', data:{message:'hello world!'} }); } ...... <div id="app">{{ message }}</div>
其中,el屬性對應一個標籤,當vue對象建立後,這個標籤內的區域就被vue對象接管,在這個區域內就可使用vue對象中定義的屬性和方法。github
當一個 Vue 實例被建立時,它向 Vue 的響應式系統中加入了其data對象中能找到的全部的屬性。當這些屬性的值發生改變時,視圖將會產生「響應」,即匹配更新爲新的值。還能夠在Vue實例中定義方法,經過方法來改變實例中data對象中的數據,數據改變了,視圖中的數據也改變。ajax
window.onload = function(){ var vm = new Vue({ el:'#app', data:{message:'hello world!'}, methods:{ fnChangeMsg:function(){ this.message = 'hello Vue.js!'; } } }); } ...... <div id="app"> <p>{{ message }}</p> <button @click="fnChangeMsg">改變數據和視圖</button> </div>
模板語法指的是如何將數據放入html中,Vue.js使用了基於 HTML的模板語法,容許開發者聲明式地將DOM綁定至底層 Vue 實例的數據。全部 Vue.js的模板都是合法的 HTML ,因此能被遵循規範的瀏覽器和 HTML 解析器解析。
數據綁定最多見的形式就是使用「Mustache」語法 (雙大括號) 的文本插值:
<span>Message: {{ msg }}</span>
若是是標籤的屬性要使用值,就不能使用「Mustache」語法,須要寫成使用v-bind指令:
<a v-bind:href="url" v-bind:title='tip'>百度網</a>
插入的值當中還能夠寫表達式:
{{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.split('').reverse().join('') }} <a v-bind:href="url">連接文字</a>
指令 (Directives) 是帶有「v-」前綴的特殊屬性。指令屬性的值預期是單個JavaScript表達式,指令的職責是,當表達式的值改變時,將其產生的連帶影響,響應式地做用於DOM。常見的指令有v-bind、v-if、v-on。
<!-- 根據ok的布爾值來插入/移除 <p> 元素 --> <p v-if="ok">是否顯示這一段</p> <!-- 監聽按鈕的click事件來執行fnChangeMsg方法 --> <button v-on:click="fnChangeMsg">按鈕</button>
v-bind和v-on事件這兩個指令會常常用,因此有簡寫方式:
<!-- 完整語法 --> <a v-bind:href="url">...</a> <!-- 縮寫 --> <a :href="url">...</a> <!-- 完整語法 --> <button v-on:click="fnChangeMsg">按鈕</button> <!-- 縮寫 --> <button @click="fnChangeMsg">按鈕</button>
使用v-bind指令來設置元素的class屬性或者sytle屬性,它們的屬性值能夠是表達式,vue.js在這一塊作了加強,表達式結果除了是字符串以外,還能夠是對象或者數組。
能夠給v-bind:class傳一個對象,以動態的切換class
<div class="static" v-bind:class="{active:isActive,'text-danger':hasError }"></div>
data屬性值以下:
data: { isActive: true, hasError: false }
最終渲染的效果:
<div class="static active"></div>
也能夠給v-bind:class傳一個對象引用
<div v-bind:class="classObject"></div>
data屬性值能夠寫成:
data: { classObject: { active: true, 'text-danger': false } }
能夠給v-bind:class傳一個數組,以應用一個 class 列表
<div v-bind:class="[activeClass, errorClass]"></div> ...... data: { activeClass: 'active', errorClass: 'text-danger' }
最終渲染爲:
<div class="active text-danger"></div>
若是你也想根據條件切換列表中的 class,能夠用三元表達式:
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
不過,當有多個條件class時這樣寫有些繁瑣。因此在數組語法中也可使用對象語法:
<div v-bind:class="[{ active: isActive }, errorClass]"></div>
v-bind:style 的對象語法十分直觀——看着很是像 CSS,但實際上是一個JavaScript 對象。CSS 屬性名能夠用駝峯式 (camelCase) 來命名:
<div v-bind:style="{color: activeColor, fontSize: fontSize + 'px' }"></div>
data數據以下:
data: { activeColor: 'red', fontSize: 30 }
也能夠給v-bind:style傳一個對象引用
<div v-bind:style="styleObject"></div>
data數據以下:
data: { styleObject: { color: 'red', fontSize: '13px' } }
v-bind:style 的數組語法能夠將多個樣式對象應用到同一個元素上:
<div v-bind:style="[baseStyles, overridingStyles]"></div>
<!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>Document</title> <style> .tab_con{ margin: 50px auto; width: 500px; height: 350px; } .tab_btns{ height: 50px; } .active{ background: gold; } input{ width: 100px; height: 50px; background: #ddd; border: 0; outline: none; } .tab_cons{ height: 300px; background:gold; } /* 在css中要特別注意權重的問題,否則會致使css樣式出現錯誤 */ .tab_cons div{ height: 300px; line-height: 300px; text-align:center; display: none; font-size: 30px; } .tab_cons .current{ display: block; } </style> <script src="vue.js"></script> <script> window.onload = function(){ var vm = new Vue({ el : ".tab_con", data:{ iNum:0, }, }); } </script> </head> <body> <div class="tab_con"> <div class="tab_btns"> <input type="button" value="按鈕一" v-bind:class="[(iNum==0)?'active':'']" v-on:click="iNum=0"> <input type="button" value="按鈕二" v-bind:class="[(iNum==1)?'active':'']" v-on:click="iNum=1"> <input type="button" value="按鈕三" v-bind:class="[(iNum==2)?'active':'']" v-on:click="iNum=2"> </div> <div class="tab_cons"> <div v-bind:class="[(iNum==0)?'current':'']">按鈕一對應的內容</div> <div v-bind:class="[(iNum==1)?'current':'']">按鈕二對應的內容</div> <div v-bind:class="[(iNum==2)?'current':'']">按鈕三對應的內容</div> </div> </div> </body> </html>
經過條件指令能夠控制元素的建立(顯示)或者銷燬(隱藏),經常使用的條件指令以下:
v-if能夠控制元素的建立或者銷燬
<h1 v-if="ok">Yes</h1>
v-else指令來表示 v-if 的「else 塊」,v-else 元素必須緊跟在帶 v-if 或者 v-else-if 的元素的後面,不然它將不會被識別。
<div v-if="Math.random() > 0.5"> Now you see me </div> <div v-else> Now you don't </div>
v-else-if,顧名思義,充當 v-if 的「else-if 塊」,能夠連續使用:
<div v-if="type === 'A'"> A </div> <div v-else-if="type === 'B'"> B </div> <div v-else-if="type === 'C'"> C </div> <div v-else> Not A/B/C </div>
另外一個用於根據條件展現元素的選項是 v-show 指令。用法和v-if大體同樣,可是它不支持v-else,它和v-if的區別是,它製做元素樣式的顯示和隱藏,元素一直是存在的:
<h1 v-show="ok">Hello!</h1>
經過v-for指令能夠將一組數據渲染到頁面中,數據能夠是數組或者對象,v-for 指令須要使用 item in items 形式的特殊語法,items 是源數據數組而且 item 是數組元素迭代的別名。
<ul id="example-1"> <li v-for="item in items"> {{ item}} </li> </ul>
vue對象建立以下:
var example1 = new Vue({ el: '#example-1', data: { items: ['foo','bar'] } })
若是想加上索引值,能夠加上第二個參數
<ul id="example-2"> <li v-for="(item, index) in items"> {{ index }} - {{ item.message }} </li> </ul>
也能夠用 v-for 經過一個對象的屬性來迭代
<ul id="v-for-object"> <li v-for="value in object"> {{ value }} </li> </ul>
若是想加上對象屬性名,能夠加上第二個參數
<ul id="v-for-object"> <li v-for="(value,key) in object"> {{ key }}-{{ value }} </li> </ul>
能夠用 v-on 指令監聽 DOM 事件,並在觸發時運行一些 JavaScript 代碼,事件的處理,簡單的邏輯能夠寫在指令中,複雜的須要在vue對象的methods屬性中指定處理函數。
<div id="example-1"> <!-- 在指令中寫處理邏輯 --> <button v-on:click="counter += 1">Add 1</button> <p>The button above has been clicked {{ counter }} times.</p> </div> ...... var example1 = new Vue({ el: '#example-1', data: { counter: 0 } })
methods屬性中指定處理函數:
<div id="example-2"> <!-- greet 是在下面定義的方法名 --> <button v-on:click="greet">Greet</button> </div> ...... var example2 = new Vue({ el: '#example-2', data: { name: 'Vue.js' }, // 在 `methods` 對象中定義方法 methods: { greet: function () { // `this` 在方法裏指向當前 Vue 實例 alert('Hello ' + this.name + '!') } } })
實際開發中,事件綁定有時候牽涉到阻止事件冒泡以及阻止默認行爲,在vue.js能夠加上事件修飾符
<!-- 阻止單擊事件繼續傳播 --> <a v-on:click.stop="doThis"></a> <!-- 提交事件再也不重載頁面 --> <form v-on:submit.prevent="onSubmit"></form> <!-- 修飾符能夠串聯 --> <a v-on:click.stop.prevent="doThat"></a> <!-- 只有修飾符 --> <form v-on:submit.prevent></form>
<!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"> <link rel="stylesheet" href="css/main2.css"> <title>Document</title> <script src="vue.js"></script> <script> window.onload = function(){ var vm = new Vue({ el: "#tankuang", data:{ isShow : false, } }) } </script> </head> <body> <div id ="tankuang" @click="isShow=false"> <input type="button" value="彈出彈框" id="btn01" @click.stop ="isShow=true"> <div class="pop_main" id="pop" @click ="isShow=false" > <div class="pop_con" v-show="isShow" @click.stop> <div class="pop_title" > <h3>系統提示</h3> <a href="#" id="shutoff" @click.stop="isShow=false">×</a> </div> <div class="pop_detail" > <p class="pop_text">親!請關注近期的優惠活動!</p> </div> <div class="pop_footer"> </div> </div> <div class="mask" v-show="isShow"></div> </div> </div> </body> </html>
能夠用 v-model 指令在表單 <input> 及 <textarea> 元素上建立雙向數據綁定。它會根據控件類型自動選取正確的方法來更新元素
<input v-model="message" placeholder="edit me"> <p>Message is: {{ message }}</p>
<span>Multiline message is:</span> <p>{{ message }}</p> <textarea v-model="message" placeholder="add multiple lines"></textarea>
單個複選框,綁定到布爾值:
<input type="checkbox" id="checkbox" v-model="checked"> <label for="checkbox">{{ checked }}</label>
多個複選框,綁定到同一個數組:
<div id='example-3'> <input type="checkbox" id="jack" value="Jack" v-model="checkedNames"> <label for="jack">Jack</label> <input type="checkbox" id="john" value="John" v-model="checkedNames"> <label for="john">John</label> <input type="checkbox" id="mike" value="Mike" v-model="checkedNames"> <label for="mike">Mike</label> <br> <span>Checked names: {{ checkedNames }}</span> </div> ...... new Vue({ el: '#example-3', data: { checkedNames: [] } })
<div id="example-4"> <input type="radio" id="one" value="One" v-model="picked"> <label for="one">One</label> <br> <input type="radio" id="two" value="Two" v-model="picked"> <label for="two">Two</label> <br> <span>Picked: {{ picked }}</span> </div> ...... new Vue({ el: '#example-4', data: { picked: '' } })
<div id="example-5"> <select v-model="selected"> <option disabled value="">請選擇</option> <option>A</option> <option>B</option> <option>C</option> </select> <span>Selected: {{ selected }}</span> </div> ...... new Vue({ el: '...', data: { selected:'' } })
模板內的表達式很是便利,可是設計它們的初衷是用於簡單運算的。在模板中放入太多的邏輯會讓模板太重且難以維護。例如:
<div id="example"> {{ message.split('').reverse().join('') }} </div>
這個表達式的功能是將message字符串進行反轉,這種帶有複雜邏輯的表達式,咱們可使用計算屬性
<div id="example"> <p>Original message: "{{ message }}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p> </div> ...... var vm = new Vue({ el: '#example', data: { message: 'Hello' }, computed: { // 計算屬性的 getter reversedMessage: function () { // `this` 指向 vm 實例 return this.message.split('').reverse().join('') } } })
偵聽屬性的做用是偵聽某屬性值的變化,從而作相應的操做,偵聽屬性是一個對象,它的鍵是要監聽的對象或者變量,值通常是函數,當你偵聽的元素髮生變化時,須要執行的函數,這個函數有兩個形參,第一個是當前值,第二個是變化後的值。
window.onload = function(){ var vm = new Vue({ el:'#app', data:{ iNum:1 }, watch:{ iNum:function(newval,oldval){ console.log(newval + ' | ' + oldval) } }, methods:{ fnAdd:function(){ this.iNum += 1; } } }); }
Vue.js容許你自定義過濾器,可被用於一些常見的文本格式化。過濾器能夠用在兩個地方:雙花括號插值和 v-bind 表達式
<!-- 在雙花括號中 --> {{ prize | RMB }} <!-- 在v-bind中 --> <div v-bind:id="rawId | formatId"></div>
過濾器其實是一個函數,能夠在一個組件的選項中定義組件內部過濾器:
filters:{ RMB:function(value){ if(value=='') { return; } return '¥ '+value; } }
或者在建立 Vue 實例以前全局定義過濾器:
Vue.filter('Yuan',function(value){ if(value=='') { return; } return value+'元'; });
此時過濾器'RMB'只能在定義它的對象接管標籤內使用,而'Yuan'能夠全局使用.
每一個Vue實例在被建立時都要通過一系列的初始化過程——例如,須要設置數據監聽、編譯模板、將實例掛載到DOM並在數據變化時更新 DOM 等。同時在這個過程當中會自動運行一些叫作生命週期鉤子的函數,咱們可使用這些函數,在實例的不一樣階段加上咱們須要的代碼,實現特定的功能。
在實例初始化以後,數據觀測 (data observer) 和 event/watcher 事件配置以前被調用。
在實例建立完成後被當即調用。在這一步,實例已完成如下的配置:數據觀測 (data observer),屬性和方法的運算,watch/event 事件回調。然而,掛載階段還沒開始
在掛載開始以前被調用:相關的 render 函數首次被調用。
實例掛載到dom以後被調用,能夠當成是vue對象的ready方法來使用,通常用它來作dom的初始化操做。
數據發生變化前調用
數據發生變化後調用.
vue.js沒有集成ajax功能,要使用ajax功能,可使用vue官方推薦的axios.js庫來作ajax的交互。 axios庫的下載地址:https://github.com/axios/axios/releases
axios({ method: 'post', url: '/user/12345', data: { firstName: 'Fred', lastName: 'Flintstone' } });
axios請求的寫法也寫成get方式後post方式。
// 爲給定 ID 的 user 建立請求 // then是請求成功時的響應,catch是請求失敗時的響應 axios.get('/user?ID=12345') .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); // 可選地,上面的請求能夠這樣作 axios.get('/user', { params: { ID: 12345 } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
axios.post('/user', { firstName: 'Fred', lastName: 'Flintstone' }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });