聲明式渲染是初接觸vue所最被震撼的指么,似乎這就是vue的所有酝惧,但果真如此嗎榴鼎?
//
聲明式渲染意為用簡(jiǎn)潔的 模板語(yǔ)法 來(lái)聲明式地將數(shù)據(jù)渲染進(jìn)dom
//
然后是指令,什么是指令呢晚唇?vue的指令會(huì)綁定一個(gè)表達(dá)式 并將特性應(yīng)用到DOM上
這里兩個(gè)比較常用的有v-on,用于監(jiān)聽(tīng)dom事件,v-bind,用于響應(yīng)式地更新HTML屬性
指令還有修飾符
v-bind用于響應(yīng)式地更新html屬性巫财,比較特殊的語(yǔ)法有class的動(dòng)態(tài)綁定,
//
{
/****/
}
這樣的形式就是一個(gè)對(duì)象
//
class的active 和ss是否存在取決于isActive 和isSSS的布爾值缺亮。
綁定的數(shù)據(jù)對(duì)象不必內(nèi)聯(lián)定義在模板里翁涤,可以用
data: {
classObject: {
active: true,
ss: false
}
} 代替
//
這種語(yǔ)法,其實(shí)仔細(xì)想想萌踱,替換后是一樣的葵礼,isActive,isSSS都替換成了相應(yīng)的data中的數(shù)據(jù),和這種直接以對(duì)象(屬性并鸵,值對(duì))形式賦值完全是等價(jià)的
(這里鸳粉,思維提煉下是 上面那種形式 等價(jià)于 data中的一個(gè)數(shù)據(jù)項(xiàng) , 這個(gè)數(shù)據(jù)項(xiàng)是一個(gè)對(duì)象园担,即上面那種形式就是對(duì)象)
//
以上是對(duì)象語(yǔ)法届谈,數(shù)組語(yǔ)法可以這樣寫(xiě)
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
修飾符 用于指出一個(gè)指令應(yīng)該以特殊方式綁定(特殊處理方式)
prevent stop 并不理解具體會(huì)怎樣~~
生命周期鉤子
計(jì)算屬性
模板語(yǔ)法有一定的運(yùn)算能力,但運(yùn)算復(fù)雜之后會(huì)導(dǎo)致可讀性降低弯汰,所以此時(shí)要用到計(jì)算屬性艰山。
計(jì)算屬性的特色是什么呢?雖然它是一個(gè)表達(dá)式咏闪,但由于它的緩存性質(zhì)曙搬,其實(shí)可以把它看做一個(gè)值。
解釋如下鸽嫂,計(jì)算一個(gè)表達(dá)式纵装,即 y=x*z,y的值(即計(jì)算屬性的值)是依賴于x和z的,在第一次計(jì)算之后,如果它的依賴据某,即x和z不變的話橡娄,那么它就不需要重新計(jì)算,直接返回值了癣籽。所以這叫計(jì)算屬性的依賴挽唉,所以說(shuō)計(jì)算屬性就是可以看做一個(gè)值。
偵聽(tīng)屬性
當(dāng)某數(shù)據(jù)發(fā)生變化時(shí)筷狼,可以設(shè)置為此采取的動(dòng)作
var vm = new Vue({
el: '#demo',
data: {
datatowatch: 'Foo'
},
watch: {
datatowatch: function (val) {
// do something for the data change
}
}
})
vue具有可復(fù)用的特性瓶籽,即 如果Html元素可以被重復(fù)使用,不會(huì)銷毀他去新建新的dom元素桑逝,如
在兩種登錄模式中棘劣,所用的input其實(shí)是同一個(gè),不會(huì)因切換登錄模式而改變
當(dāng)然楞遏,有時(shí)這種特性不是我們需要的茬暇,此時(shí)我們只需添加一個(gè)key屬性就可以了
vue數(shù)組操作的注意事項(xiàng)
由于 JavaScript 的限制首昔,Vue 不能檢測(cè)以下變動(dòng)的數(shù)組:
當(dāng)你利用索引直接設(shè)置一個(gè)項(xiàng)時(shí),例如:vm.items[indexOfItem] = newValue
當(dāng)你修改數(shù)組的長(zhǎng)度時(shí)糙俗,例如:vm.items.length = newLength
為了解決第一類問(wèn)題勒奇,以下兩種方式都可以實(shí)現(xiàn)和 vm.items[indexOfItem] = newValue 相同的效果,同時(shí)也將觸發(fā)狀態(tài)更新:
// Vue.set
Vue.set(example1.items, indexOfItem, newValue)
為了解決第二類問(wèn)題巧骚,你可以使用 splice:
example1.items.splice(newLength)
還是由于 JavaScript 的限制赊颠,Vue 不能檢測(cè)對(duì)象屬性的添加或刪除:
var vm = new Vue({
data: {
a: 1
}
})
// `vm.a` 現(xiàn)在是響應(yīng)式的
vm.b = 2
// `vm.b` 不是響應(yīng)式的
對(duì)于已經(jīng)創(chuàng)建的實(shí)例,Vue 不能動(dòng)態(tài)添加根級(jí)別的響應(yīng)式屬性劈彪。但是竣蹦,可以使用 Vue.set(object, key, value) 方法向嵌套對(duì)象添加響應(yīng)式屬性。例如沧奴,對(duì)于:
var vm = new Vue({
data: {
userProfile: {
name: 'Anika'
}
}
})
你可以添加一個(gè)新的 age 屬性到嵌套的 userProfile 對(duì)象:
Vue.set(vm.userProfile, 'age', 27)
你還可以使用 vm.$set 實(shí)例方法痘括,它只是全局 Vue.set 的別名:
vm.$set(vm.userProfile, 'age', 27)
組件組合
每個(gè)組件實(shí)例的作用域是孤立的,
//
什么是作用域滔吠?我猜測(cè)是變量的生存空間纲菌,離開(kāi)這個(gè)空間,變量就失效了疮绷。
父組件模板的內(nèi)容在父組件作用域內(nèi)編譯翰舌;子組件模板的內(nèi)容在子組件作用域內(nèi)編譯《В《===這個(gè)是一定的椅贱,不變的,絕對(duì)的
這個(gè)作用域可以理解為new Vue({
//這部分就是這個(gè)Vue的作用域
//
})
//
那么組件件的數(shù)據(jù)交互是通過(guò)另外方式進(jìn)行的
總的來(lái)說(shuō)是
prop 向下傳遞唉韭,事件(emit event)向上傳遞
子組件顯式聲明props,然后父組件調(diào)用的時(shí)候直接傳遞參數(shù)就可以了
動(dòng)態(tài)prop要用v-bind來(lái)綁定
事件接口
每個(gè) Vue 實(shí)例都實(shí)現(xiàn)了事件接口夜涕,即:
使用 $on(eventName) 監(jiān)聽(tīng)事件
使用 $emit(eventName) 觸發(fā)事件
//
不能用 $on 監(jiān)聽(tīng)子組件釋放的事件犯犁,而必須在模板里直接用 v-on 綁定
這句話的意思是emit 和 on 必須在同一個(gè)(級(jí))組件中属愤?
反正聽(tīng)他的話,父子組件用v-on監(jiān)聽(tīng)把酸役。
//
v-on綁定的語(yǔ)法是
v-on:(釋放的事件名)="(處理事件的函數(shù)名)"
編譯作用域
// 讓我們來(lái)看這段
大霧
一個(gè)常見(jiàn)錯(cuò)誤是試圖在父組件模板內(nèi)將一個(gè)指令綁定到子組件的屬性/方法:
假定 someChildProperty 是子組件的屬性住诸,上例不會(huì)如預(yù)期那樣工作。父組件模板并不感知子組件的狀態(tài)涣澡。
如果要綁定子組件作用域內(nèi)的指令到一個(gè)組件的根節(jié)點(diǎn)贱呐,你應(yīng)當(dāng)在子組件自己的模板里做:
Vue.component('child-component', {
// 有效,因?yàn)槭窃谡_的作用域內(nèi)
template: '
Child
',
data: function () {
return {
someChildProperty: true
}
}
})
上面這種形式有效我可以理解,在根組件中定義了它
但是所有組件不都是這樣注冊(cè)的嗎入桂?如果是說(shuō)單頁(yè)面組件我尚能理解奄薇,但這后面好像還有別的東西
理解錯(cuò)了,沒(méi)好好讀抗愁,它的意思是在這個(gè)組件內(nèi)部聲明了馁蒂,看那個(gè)tmplate
這段要闡明的就是說(shuō)呵晚,每個(gè)模板的內(nèi)容都在自己組件的作用域中進(jìn)行編譯。
////
插槽
用于組合父組件和子組件的內(nèi)容
譬如 一臺(tái)電腦沫屡,它有各種硬件接口饵隙,我們使用它(組件),但是我們還想在它里面加點(diǎn)東西沮脖,那我們就在它的接口上插上去金矛,這樣就把東西加在我們想加的地方了,并且不會(huì)覆蓋電腦的其他東西勺届。
以下是一個(gè)插槽的實(shí)例:
//
假定 my-component 組件有如下模板:
我是子組件的標(biāo)題
只有在沒(méi)有要分發(fā)的內(nèi)容時(shí)才會(huì)顯示驶俊。
父組件模板:
我是父組件的標(biāo)題
這是一些初始內(nèi)容
這是更多的初始內(nèi)容
渲染結(jié)果:
我是父組件的標(biāo)題
我是子組件的標(biāo)題
這是一些初始內(nèi)容
這是更多的初始內(nèi)容
//
當(dāng)有多段插入元素時(shí),我們可能不想簡(jiǎn)單的插入一大段免姿,怎么方便的使用插槽呢废睦?
所以除了普通插槽還有具名插槽(有name屬性的插槽)
示例如下
//
例如,假定我們有一個(gè) app-layout 組件养泡,它的模板為:
父組件模板:
這里可能是一個(gè)頁(yè)面標(biāo)題
主要內(nèi)容的一個(gè)段落嗜湃。
另一個(gè)主要段落。
這里有一些聯(lián)系信息
渲染結(jié)果為:
這里可能是一個(gè)頁(yè)面標(biāo)題
主要內(nèi)容的一個(gè)段落澜掩。
另一個(gè)主要段落购披。
這里有一些聯(lián)系信息
在設(shè)計(jì)組合使用的組件時(shí),內(nèi)容分發(fā) API 是非常有用的機(jī)制肩榕。
//分發(fā)即
父組件將內(nèi)容穿插到子組件中刚陡,意即分發(fā)
//
還有 作用域插槽
作用域插槽是一種特殊類型的插槽,用作一個(gè) (能被傳遞數(shù)據(jù)的) 可重用模板株汉,來(lái)代替已經(jīng)渲染好的元素筐乳。
我的理解是:用于向父組件傳遞數(shù)據(jù)
//
在子組件中,只需將數(shù)據(jù)傳遞到插槽乔妈,就像你將 prop 傳遞給組件一樣:
//把要傳遞給父組件的數(shù)據(jù)寫(xiě)在這里
在父級(jí)中蝙云,具有特殊特性 slot-scope 的