使用vue已經有3、四個月了,可是隻是學着使用了一些基本方法。由於如今的前端框架愈來愈多(Angular,React...),可是我相信萬變不離其宗,不少用法框架之間仍是想通的,因此借總結的vue的機會深刻了解vue到每一個細節,之後能更加熟練地使用vue,有機會也能在別的框架中體會相通的思想。javascript
// ... computed: { fullName: { // getter get: function () { return this.firstName + ' ' + this.lastName }, // setter set: function (newValue) { var names = newValue.split(' ') this.firstName = names[0] this.lastName = names[names.length - 1] } } } // ...
如今在調用 vm.fullName = 'John Doe'
時,setter 會被調用,vm.firstName
和 vm.lastName
也會有相應更新。 html
<div v-bind:style="styleObject"></div> data: { styleObject: { color: 'red', fontSize: '13px' } }
注意:v-show直接用在組件上時,v-else會出現問題,能夠用v-show代替v-else前端
<custom-component v-show="condition"></custom-component> <p v-show="!condition">這可能也是一個組件</p>
v-if
有更高的切換消耗而 v-show
有更高的初始渲染消耗。由於v-if裏有數據和子組件,故操做時會不斷銷燬和重建,成本較高。可是v-show裏的元素會被始終編譯和保留
v-forvue
基本寫法一: <ul id="example-2"> <li v-for="item in items"> {{ parentMessage }} - {{ $index }} - {{ item.message }} </li> </ul> 基本寫法二: <div v-for="(index, item) in items"> {{ index }} {{ item.message }} </div>
new Vue({ el: '#repeat-object', data: { object: { FirstName: 'John', LastName: 'Doe', Age: 30 } } }) 基本寫法一: <ul id="repeat-object" class="demo"> <li v-for="value in object"> {{ $key }} : {{ value }} </li> </ul> 基本寫法二: <div v-for="(key, val) in object"> {{ key }} {{ val }} </div>
數組變更檢測java
eg. .push()、.pop()、.shift()、.unshift()、.splice()、.sort()、.reverse() json
1.不能之間用索引設置元素,eg. vm.items[0] = {}
; 解決辦法:使用$set方法,如 example.items.$set(0,{aaa:'changed!'}),這樣就能夠觸發新視圖了數組
2.不能直接設置數組的長短, eg. vm.items.length = 0; 解決辦法:直接賦給一個空數組緩存
1. $set(數組索引,要修改的值)前端框架
使用方法:如上第一點的使用方法框架
2.$remove(下標)
<button v-on:click="say('hello!', $event)">Submit</button>
// ... methods: { say: function (msg, event) { // 如今咱們能夠訪問原生事件對象 event.preventDefault() } }
<input v-on:keyup.enter="submit">
表單控件的綁定,主要由v-model進行雙向綁定
表單
參數特性
v-model
在input
事件中同步輸入框值與數據,能夠添加一個特性 lazy
,從而改到在 change
事件中同步
動畫類處理方法,跳過
前面提到vue的項目就是一個組件樹,一個頁面的全部可見的模塊均可以細化成一個組件。
想要實現一個組件主要先從初始化根實例,定義組件和註冊組件
// 定義 var MyComponent = Vue.extend({ template: '<div>A custom component!</div>' }) // 註冊 Vue.component('my-component', MyComponent) // 建立根實例 new Vue({ el: '#example' })
props
能夠從父組件傳給子組件的一些數據
<!-- 默認爲單向綁定 --> <child :msg="parentMsg"></child> <!-- 雙向綁定 --> <child :msg.sync="parentMsg"></child> <!-- 單次綁定 --> <child :msg.once="parentMsg"></child>
父子組件通訊
<!-- 子組件模板 --> <template id="child-template"> <input v-model="msg"> <button v-on:click="notify">Dispatch Event</button> </template> <!-- 父組件模板 --> <div id="events-example"> <p>Messages: {{ messages | json }}</p> <child></child> </div> // 註冊子組件 // 將當前消息派發出去 Vue.component('child', { template: '#child-template', data: function () { return { msg: 'hello' } }, methods: { notify: function () { if (this.msg.trim()) { this.$dispatch('child-msg', this.msg) this.msg = '' } } } })
// 初始化父組件 // 將收到消息時將事件推入一個數組 var parent = new Vue({ el: '#events-example', data: { messages: [] }, // 在建立實例時 `events` 選項簡單地調用 `$on` events: { 'child-msg': function (msg) { // 事件回調內的 `this` 自動綁定到註冊它的實例上 this.messages.push(msg) } } })
咱們將這個示例分爲幾個步驟解讀:
notify
方法notify
方法在處理時,調用了$dispatch
,將事件派發到父組件的child-msg
事件,並給該該事件提供了一個msg參數child-msg
事件,父組件接收到子組件的派發後,調用child-msg
事件。
<child v-on:child-msg="handleIt"></child>
當子組件觸發了 "child-msg"
事件,父組件的 handleIt
方法將被調用。全部影響父組件狀態的代碼放到父組件的 handleIt
方法中;子組件只關注觸發事件。
參考資料:
http://www.cnblogs.com/keepfool/
http://v1-cn.vuejs.org/guide/components.html