vue.js 核心知識(shí)點(diǎn)四

目錄

- 4.1 vue更新數(shù)組或者對(duì)象時(shí)觸發(fā)視圖更新的方法

- 4.2 解決非工程化項(xiàng)目初始化頁(yè)面閃動(dòng)問(wèn)題

- 4.3 v-for產(chǎn)生的列表狰住,實(shí)現(xiàn)active的切換

- 4.4 v-model語(yǔ)法糖的使用

- 4.5 v-slot 指令 (插槽 vue2.6更新)


- 4.1 vue更新數(shù)組或者對(duì)象時(shí)觸發(fā)視圖更新的方法

- 觸發(fā)視圖更新的方法有如下幾種

1. Vue.set 響應(yīng)式新增與修改數(shù)據(jù)
可以設(shè)置對(duì)象或數(shù)組的值摄闸,通過(guò)key或數(shù)組索引宵统,可以觸發(fā)視圖更新

圖片描述

target:要更改的數(shù)據(jù)源(可以是對(duì)象或者數(shù)組)
key:要更改的具體數(shù)據(jù)
value :重新賦的值

  • 數(shù)組修改
Vue.set(array, indexOfItem, newValue)
this.array.$set(indexOfItem, newValue)
  • 對(duì)象修改
Vue.set(obj, keyOfItem, newValue)
this.obj.$set(keyOfItem, newValue)

2. Vue.delete
刪除對(duì)象或數(shù)組中元素流礁,通過(guò)key或數(shù)組索引砌函,可以觸發(fā)視圖更新

圖片描述

  • 數(shù)組修改
Vue.delete(array, indexOfItem)
this.array.$delete(indexOfItem)
  • 對(duì)象修改
Vue.delete(obj, keyOfItem)
this.obj.$delete(keyOfItem)

3. 數(shù)組對(duì)象直接修改屬性孙技,可以觸發(fā)視圖更新

this.array[0].show = true;
this.array.forEach(function(item){
    item.show = true;
});

4. splice方法修改數(shù)組秋泳,可以觸發(fā)視圖更新

this.array.splice(indexOfItem, 1, newElement)

5. 數(shù)組整體修改踱承,可以觸發(fā)視圖更新

var tempArray = this.array;
tempArray[0].show = true;
this.array = tempArray;

6. 用Object.assign或lodash.assign可以為對(duì)象添加響應(yīng)式屬性倡缠,可以觸發(fā)視圖更新

//Object.assign的單層的覆蓋前面的屬性,不會(huì)遞歸的合并屬性
this.obj = Object.assign({},this.obj,{a:1, b:2})

//assign與Object.assign一樣
this.obj = _.assign({},this.obj,{a:1, b:2})

//merge會(huì)遞歸的合并屬性
this.obj = _.merge({},this.obj,{a:1, b:2})

7. Vue包含一組觀察數(shù)組變異的方法茎活,使用它們改變數(shù)組也會(huì)觸發(fā)視圖更新

push()            向數(shù)組的末尾添加一個(gè)或多個(gè)元素昙沦,并返回新的長(zhǎng)度。
pop()             刪除最后一個(gè)元素载荔,把數(shù)組長(zhǎng)度減 1盾饮,并且返回它刪除的元素的值。
shift()           把數(shù)組的第一個(gè)元素從其中刪除懒熙,并返回第一個(gè)元素的值丘损。
unshift()         向數(shù)組的開(kāi)頭添加一個(gè)或更多元素,并返回新的長(zhǎng)度工扎。
splice()          向/從數(shù)組中添加/刪除項(xiàng)目徘钥,然后返回被刪除的項(xiàng)目。 該方法會(huì)改變?cè)紨?shù)組肢娘。
sort()            對(duì)數(shù)組的元素進(jìn)行排序呈础。
reverse()         顛倒數(shù)組中元素的順序。  

不變異的方法:

filter()
concat() 
slice()
他們返回的是一個(gè)新數(shù)組橱健,使用這些方法時(shí)而钞,可以用新數(shù)組來(lái)替換原始數(shù)組

原理:
-- Vue 在檢測(cè)到數(shù)組變化時(shí),并不是直接重新渲染整個(gè)列表拘荡,而是最大化復(fù)用DOM元素笨忌。替換的數(shù)組中,含有相同元素的項(xiàng)不會(huì)被重新渲染,
因此可以大膽的用新數(shù)組來(lái)替換舊數(shù)組官疲,不用擔(dān)心性能問(wèn)題袱结。
-- 值得注意的是:
以下變動(dòng)的數(shù)組中Vue是不能檢測(cè)到的,也不會(huì)觸發(fā)視圖更新途凫。
1.通過(guò)索引直接設(shè)置項(xiàng)垢夹, 比如this.books[3]={...}
2.修改數(shù)組長(zhǎng)度, 比如 this.books.length = 1;
兩個(gè)問(wèn)題都可以用splice來(lái)解決:
第一個(gè)問(wèn)題 還可以用 set方法 this.$set(this.books,3,{...})

- 4.2 解決非工程化項(xiàng)目初始化頁(yè)面閃動(dòng)問(wèn)題

vue頁(yè)面在加載的時(shí)候閃爍花括號(hào){}}维费,v-cloak指令和css規(guī)則如[v-cloak]{display:none}一起用時(shí)果元,這個(gè)指令可以隱藏未編譯的Mustache標(biāo)簽直到實(shí)例準(zhǔn)備完畢。


/*css樣式*/
[v-cloak] {
      display: none;
    }

<!--html代碼-->
<div id="app" v-cloak>
    <ul>
      <li v-for="item in tabs">{{item.text}}</li>
    </ul>
  </div>

- 4.3 v-for產(chǎn)生的列表犀盟,實(shí)現(xiàn)active的切換

<div v-for="(desc,tableIndex) in descriptions.firstface">
    <ul class="controller-checkboxs clearfix" >
        <li 
          @click="currentIndex=index,currentTable=tableIndex" 
          class="controller-checkbox-item"
          :class="{active:index===currentIndex&&tableIndex==currentTable}" 
          v-for="(ctrlValue,index) in desc.args">
        </li>
    </ul>
</div>

- 4.4 v-model語(yǔ)法糖的使用

<input type="text" v-model="mes">
此時(shí)mes值就與input的值進(jìn)行雙向綁定
實(shí)際上上面的代碼是下面代碼的語(yǔ)法糖而晒。
<input v-bind:value="mes" v-on:input="mes= $event.target.value"/>
要理解這行代碼,首先你要知道 input 元素本身有個(gè) oninput 事件阅畴,這是 HTML5 新增加的倡怎,類似 onchange ,每當(dāng)輸入框內(nèi)容發(fā)生變化贱枣,就會(huì)觸發(fā) oninput 监署,把最新的value傳遞給 mes。從而實(shí)現(xiàn)了v-model

v-model用在組件上的時(shí)候
我們知道v-model可以實(shí)現(xiàn)數(shù)據(jù)的雙向綁定纽哥,但是钠乏,如果說(shuō)這是一個(gè)復(fù)雜的輸入框,在項(xiàng)目中也經(jīng)常使用春塌。此時(shí)我們我們就把這個(gè)輸入框封裝成組件晓避,那怎么利用v-mode讓父組件的值與子組件input框里的值雙向綁定起來(lái)≈豢牵看下面的例子
1:父組件 <InputBox v-model="mes"></InputBox> 根據(jù)上面講的v-model語(yǔ)法糖俏拱,所以 InputBox那行代碼也可以寫(xiě)成 <InputBox v-bind:value="value" v-on:input="mes= $event.target.value"></InputBox>
2:子組件


所以說(shuō):1:接受一個(gè)value prop 2:在有新的值時(shí)觸發(fā)input事件并將新值作為參數(shù) 。這樣吕世,我們就可以看到子組件和父組件的值就可以聯(lián)動(dòng)起來(lái)彰触。但是我們看到v-model中的事件是input,如果碰到單選復(fù)選按鈕這種check事件梯投,那我們就需要去自定義v-model

v-model自定義
父組件
<InputCheckout v-model="foo"></InputCheckout>
<InputBox v-bind:value="value" v-on:input="mes= $event.target.value"></InputBox>
但是單選復(fù)選框不會(huì)觸發(fā)input事件命辖,只會(huì)觸發(fā)change事件。所以在子組件我們需要自定義v-model分蓖。我們來(lái)看看代碼哈

就這樣

- 4.5 v-slot使用

https://juejin.im/post/5c64e11151882562e4726d98這個(gè)介紹的不錯(cuò)
Vue 為具名和范圍插槽引入了一個(gè)全新的語(yǔ)法尔艇,即我們今天要講的主角:v-slot 指令。目的就是想統(tǒng)一 slot 和 scope-slot 語(yǔ)法么鹤,使代碼更加規(guī)范和清晰终娃。

//默認(rèn)插槽
<baz v-slot ="baz">
{{baz}}
</ baz >

//嵌套默認(rèn)插槽
//組件提供的范圍變量也在該組件本身上聲明
<foo v-slot="foo">
<bar v-slot="bar">
<baz v-slot="baz">
{{ foo }} {{ bar }} {{ baz }}
</baz>
</bar>
</foo>


//具名域槽
<my-name>
<template v-slot:one="{ msg }">
{{ msg }}
</template>
</my-name>

//混用插槽
<foo>
<template v-slot:one="one">
<bar v-slot="bar">
<div>{{ one }} {{ bar }}</div>
</bar>
</template>

<template v-slot:two="two">
<bar v-slot="bar">
<div>{{ two }} {{ bar }}</div>
</bar>
</template>
</foo>

插槽內(nèi)容的解構(gòu)賦值

在 Vue 代碼內(nèi)部,我們傳遞的 slotProps 其實(shí)就是函數(shù)的一個(gè)單一參數(shù):

function (slotProps) {
  // ... slot content ...
}

意味著 v-slot 的值只要滿足函數(shù)參數(shù)定義的 JavaScript 表達(dá)式的都可以接受蒸甜。

<current-user v-slot="{ user }">
  {{ user.firstName }}
</current-user>

以重命名解構(gòu)變量:

<current-user v-slot="{ user: person }">>
  {{ person.firstName }}
</current-user>

甚至可以自定義回退內(nèi)容棠耕,以便在未定義插值情況下使用:

<current-user v-slot="{ user = { firstName: 'Guest' } }">>
  {{ user.firstName }}
</current-user>

動(dòng)態(tài)插槽名稱

<base-layout>
  <template v-slot:[dynamicSlotName]>
    ...
  </template>
</base-layout>

命名插槽簡(jiǎn)寫(xiě)

可以使用 # 代替 v-slot余佛。例如, v-slot:header 簡(jiǎn)寫(xiě)成 #header:

base-layout>
  <template #header>
    <h1>Here might be a page title</h1>
  </template>

  <p>A paragraph for the main content.</p>
  <p>And another one.</p>

  <template #footer>
    <p>Here's some contact info</p>
  </template>
</base-layout>

和其他指令一樣窍荧,只有在提供參數(shù)時(shí)才能使用簡(jiǎn)寫(xiě)形式辉巡,下面的寫(xiě)法是無(wú)效的

<!-- 將會(huì)觸發(fā)一個(gè)控制臺(tái)警告 -->
<current-user #="{ user }">
  {{ user.firstName }}
</current-user>

也就是說(shuō),如果你想使用簡(jiǎn)寫(xiě)語(yǔ)法蕊退,則務(wù)必指定插值的名字:

<current-user #default="{ user }">
  {{ user.firstName }}
</current-user>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郊楣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瓤荔,更是在濱河造成了極大的恐慌净蚤,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件输硝,死亡現(xiàn)場(chǎng)離奇詭異今瀑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)腔丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門放椰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人愉粤,你說(shuō)我怎么就攤上這事砾医。” “怎么了衣厘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵如蚜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我影暴,道長(zhǎng)错邦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任型宙,我火速辦了婚禮撬呢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妆兑。我一直安慰自己魂拦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布搁嗓。 她就那樣靜靜地躺著芯勘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腺逛。 梳的紋絲不亂的頭發(fā)上荷愕,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼安疗。 笑死抛杨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荐类。 我是一名探鬼主播蝶桶,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掉冶!你這毒婦竟也來(lái)了真竖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厌小,失蹤者是張志新(化名)和其女友劉穎恢共,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體璧亚,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讨韭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了癣蟋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片透硝。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疯搅,靈堂內(nèi)的尸體忽然破棺而出濒生,到底是詐尸還是另有隱情,我是刑警寧澤幔欧,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布罪治,位于F島的核電站,受9級(jí)特大地震影響礁蔗,放射性物質(zhì)發(fā)生泄漏觉义。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一浴井、第九天 我趴在偏房一處隱蔽的房頂上張望晒骇。 院中可真熱鬧堰乔,春花似錦涂佃、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)箍鼓。三九已至崭参,卻和暖如春呵曹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工奄喂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铐殃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓跨新,卻偏偏與公主長(zhǎng)得像富腊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子域帐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 主要還是自己看的赘被,所有內(nèi)容來(lái)自官方文檔。 介紹 Vue.js 是什么 Vue (讀音 /vju?/肖揣,類似于 vie...
    Leonzai閱讀 3,350評(píng)論 0 25
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容民假,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,050評(píng)論 0 29
  • vue概述 在官方文檔中龙优,有一句話對(duì)Vue的定位說(shuō)的很明確:Vue.js 的核心是一個(gè)允許采用簡(jiǎn)潔的模板語(yǔ)法來(lái)聲明...
    li4065閱讀 7,216評(píng)論 0 25
  • 1.安裝 可以簡(jiǎn)單地在頁(yè)面引入Vue.js作為獨(dú)立版本羊异,Vue即被注冊(cè)為全局變量,可以在頁(yè)面使用了彤断。 如果希望搭建...
    Awey閱讀 11,023評(píng)論 4 129
  • # 傳智播客vue 學(xué)習(xí)## 1. 什么是 Vue.js* Vue 開(kāi)發(fā)手機(jī) APP 需要借助于 Weex* Vu...
    再見(jiàn)天才閱讀 3,540評(píng)論 0 6