vue基礎知識二
所有程式碼沒有引入vue.js!!!!
vue例項化物件中的this指向
在vue中 this指向vue的例項化物件
const app = new Vue({ el:"#app", data:{ name:"張三" }, methods:{ tryThis(){ console.log(this); console.log(this === app); // true } } }) console.log(app);
app例項化後 data和methods裡面的屬性 會直接整合到vue例項上
例項化物件上已經沒有data和methods屬性 取值時 只需要使用this進行取值
自定義指令
1、自定義指令:使用Vue.directive(id,definition)註冊全域性自定義指令,使用元件的directives選項註冊區域性自定義指令。
全域性註冊:
Vue.directive('xxx', { inserted: function (el) { //指令屬性 } });
區域性註冊:
var app = new Vue({ el: '#app', directives: { xxx: {//指令屬性 } } });
2、鉤子函式:
指令定義函式提供了幾個鉤子函式(可選):
bind:只調用一次,指令第一次繫結到元素時呼叫,用這個鉤子函式可以定義一個在繫結時執行一次的初始化動作。
inserted:被繫結元素插入父節點時呼叫(父節點存在即可呼叫,不必存在於 document 中)。
update:第一次是緊跟在 bind 之後呼叫,獲得的引數是繫結的初始值,之後被繫結元素所在的模板更新時呼叫,而不論繫結值是否變化。通過比較更新前後的繫結值,可以忽略不必要的模板更新(詳細的鉤子函式引數見下)。
componentUpdated:被繫結元素所在模板完成一次更新週期時呼叫。
unbind:只調用一次, 指令與元素解綁時呼叫。
3、鉤子函式的引數:(el, binding, vnode, oldVnode)
el:指令所繫結的元素,可以用來直接操作 DOM 。
binding:一個物件,包含以下屬性
name:指令名,不包含v-的字首;
value:指令的繫結值;例如:v-my-directive="1+1",value的值是2;
oldValue:指令繫結的前一個值,僅在update和componentUpdated鉤子函式中可用,無論值是否改變都可用;
expression:繫結值的字串形式;例如:v-my-directive="1+1",expression的值是'1+1';
arg:傳給指令的引數;例如:v-my-directive:foo,arg的值為 'foo';
modifiers:一個包含修飾符的物件;例如:v-my-directive.a.b,modifiers的值為{'a':true,'b':true}
vnode:Vue編譯的生成虛擬節點;
oldVnode:上一次的虛擬節點,僅在update和componentUpdated鉤子函式中可用。
1 <div id="app" v-demo:foo.a.b="message"></div> 2 3 Vue.directive('demo', { 4 bind: function (el, binding, vnode) { 5 console.log('bind'); 6 var s = JSON.stringify 7 el.innerHTML = 8 'name: ' + s(binding.name) + '<br>' + 9 'value: ' + s(binding.value) + '<br>' + 10 'expression: ' + s(binding.expression) + '<br>' + 11 'argument: ' + s(binding.arg) + '<br>' + 12 'modifiers: ' + s(binding.modifiers) + '<br>' + 13 'vnode keys: ' + Object.keys(vnode).join(', ') 14 } 15 }); 16 new Vue({ 17 el: '#app', 18 data: { 19 message: 'hello!' 20 } 21 });
4、函式簡寫:大多數情況下,我們可能想在 bind 和 update 鉤子上做重複動作,並且不想關心其它的鉤子函式。可以這樣寫:
1 Vue.directive('color-swatch', function (el, binding) { 2 el.style.backgroundColor = binding.value 3 })
5.多值入參
我們可以通過 JavaScript 的物件字面量,為自定義指令一次性傳入多個值。其實任意一個合法的 JavaScript 表示式都是支援的。
<div id="app3"> <div v-deniro-directive2="{title:'物理學家新發現四起黑洞相撞事件',content:'物理學家探測到了它們向地球發來的引力波'}"></div> </div> <script> Vue.directive('deniro-directive2', { bind: function (el, binding, vnode) { el.innerHTML = 'title:' + binding.value.title + '<br>' + 'content:' + binding.value.content + '<br>'; } }); var app3 = new Vue({ el: '#app3', data: { } }); </script>
計算屬性
為什麼要使用計算屬性
模板內的表示式通常用於簡單的運算,當其過長或邏輯複復雜時,會變得難以維護
什麼是計算屬性
在Vue應用中,在模板中雙向繫結一些資料或者表示式,但是表示式如果過長,或者邏輯更為複雜時,就會變得臃腫甚至難以維護和閱讀
計算屬性的用法
在一個計算屬性裡可以完成各種複雜的邏輯,包括運算、函式呼叫等,只要最終返回一個結果就可以。
<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: { reversedMessage: function () { // `this` 指向 vm 例項 return this.message.split('').reverse().join('') } } });
計算屬性還可以依賴多個Vue 例項的資料,只要其中任一資料變化,計算屬性就會重新執行,檢視也會更新。
計算屬性還有兩個很實用的小技巧容易被忽略:一是計算屬性可以依賴其他計算屬性; 二是計算屬性不僅可以依賴當前Vue 例項的資料,還可以依賴其他例項的資料
<div id="app1"></div> <div id="app2">{{ reverseText}}</div> var app1 = new Vue({ el: '#app1', data: { text: 'computed' } }); var app2 = new Vue({ el: '#app2', computed: { reverseText: function(){ return app1.text.split('').reverse().join(''); //使用app1的資料進行計算 } } });
每一個計算屬性都包含一個getter 和一個setter ,我們上面的兩個示例都是計算屬性的預設用法, 只是利用了getter 來讀取。
在你需要時,也可以提供一個setter 函式, 當手動修改計算屬性的值就像修改一個普通資料那樣時,就會觸發setter 函式,執行一些自定義的操作
var vm = new Vue({ el: '#demo', data: { firstName: 'Foo', lastName: 'Bar' }, 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 也會相應地被更新。
計算屬性快取
其實細心的話就會發現,呼叫methods裡的方法也能實現和計算屬性一樣的效果,甚至有的方法還能接收引數,使用起來更加的靈活,既然使用methods就可以實現,那為什麼還需要計算屬性呢?原因就是計算屬性是基於他的依賴快取的。一個計算屬性所依賴的資料發生變化時,他才會重新取值,
所以依賴的text只要不改變。計算屬性也就不更新
computed:{
now:function()
{
return Date.now()
}
}
這裡的Date.now()不是響應式依賴,所以計算屬性now 不會更新,但是methods則不同,只要重新渲染他就會被呼叫,因此函式也會被執行。
使用計算屬性還是methods取決於你是否需要快取,當遍歷大陣列和做大量計算時,應當使用計算屬性,除非你不希望得到快取