2.過(guò)濾器、按鍵修飾符、自定義指令怨绣、生命周期

1. 過(guò)濾器


  • 一般用于將后端傳給前端的數(shù)據(jù)中滿足用戶條件的內(nèi)容進(jìn)行過(guò)濾的功能
  • 我們可以手動(dòng)實(shí)現(xiàn)自己的過(guò)濾器角溃,也可以使用 Vue 提供的局部跟全局過(guò)濾器
  • 實(shí)現(xiàn)的時(shí)候我們需要將要過(guò)濾的條件作為參數(shù)傳入過(guò)濾函數(shù)中,過(guò)濾函數(shù)中用迭代器將每個(gè)元素與傳入的關(guān)鍵詞進(jìn)行匹配
  • 如果匹配成功就將其傳入我們定義的一個(gè)臨時(shí)變量篮撑,最后將這一臨時(shí)變量返回即可
  • 也就是說(shuō)我們的 v-for 接受的不再是一個(gè)數(shù)組减细,而是一個(gè)函數(shù),這個(gè)函數(shù)會(huì)接受一個(gè)參數(shù)
  • 在函數(shù)內(nèi)部我們?cè)賹⑽覀円故镜臄?shù)組進(jìn)行處理即可

html

<input type="text" name="" v-model:value="keyWords" />
<div v-for="item in search(keyWords)">
  <li>{{item}}</li>
</div>
  • 其中 input 標(biāo)簽是用來(lái)接受并修改我們的條件關(guān)鍵詞的
  • search 函數(shù)是用于返回滿足條件的數(shù)組的

javascript

//根據(jù)關(guān)鍵詞進(jìn)行數(shù)據(jù)的展示
search: function (keyWords) {
    //用于返回滿足條件的數(shù)組
    let newList = []
    this.itemList.forEach(element => {
        //判斷關(guān)鍵詞是否在對(duì)象中name屬性中出現(xiàn)
        if (element.name.indexOf(keyWords) != -1) {
            newList.push(element)
        }
    });
            //給用戶返回滿足條件的對(duì)象組成的數(shù)組
            return newList
        }
  • 我們也可以使用 ES6 里面的 includes 方法來(lái)代替 indexOf

2. Vue 中的過(guò)濾器


  • Vue 給我們提供了一些全局過(guò)濾器跟私有過(guò)濾器赢笨,用于將一些數(shù)據(jù)進(jìn)行格式化或者進(jìn)行過(guò)濾

  • 過(guò)濾器可以用于兩個(gè)地方未蝌,一個(gè)是插值表達(dá)式:{{}} 第二個(gè)是 v-bind::xxx

  • 下面是一段對(duì)v-bind使用過(guò)濾器的例子

  • v-bind:href="info.id|getTitleHref"
    
  • 過(guò)濾器應(yīng)該被用在 JavaScript 表達(dá)式的尾部,用管道符:|來(lái)與被過(guò)濾的對(duì)象隔開(kāi)

  • 這一思想與 Linux 內(nèi)部的用法如出一轍

  • 過(guò)濾器說(shuō)到底也是一個(gè)函數(shù)茧妒,在調(diào)用時(shí)候的格式就要遵循管道符的用法萧吠,也就是在展示被展示的變量之前會(huì)先調(diào)用過(guò)濾器對(duì)內(nèi)容進(jìn)行過(guò)濾

  • 在過(guò)濾完成之后將過(guò)濾后的內(nèi)容展示出來(lái)

  • 過(guò)濾器有全局過(guò)濾器,私有過(guò)濾器之分

  • 全局過(guò)濾器用Vue.filter('過(guò)濾器名稱(chēng)',function(){})來(lái)定義桐筏,也就是第一個(gè)參數(shù)傳入過(guò)濾器的名稱(chēng)纸型,第二個(gè)參數(shù)是一個(gè)用于處理被傳入的數(shù)據(jù)的回調(diào)函數(shù)

  • 過(guò)濾器第二個(gè)參數(shù)接受的第一個(gè)參數(shù)就是要通過(guò)過(guò)濾器的數(shù)據(jù),處理完每個(gè)數(shù)據(jù)之后再返回出去即可

全局過(guò)濾器

<div v-for="item in itemList">
  <p>{{item.number | dollarFilter}}</p>
</div>
Vue.filter("dollarFilter", function(data) {
  return data + "$";
});
  • 這樣一操作之后我們輸出的內(nèi)容后面都會(huì)加上一個(gè)$符號(hào)
  • 過(guò)濾器還可以接受參數(shù),也就是說(shuō)我們第一個(gè)參數(shù)會(huì)是我們要處理的數(shù)據(jù)九昧,之后的參數(shù)就可以用來(lái)接受調(diào)用的地方給我們傳回的參數(shù)绊袋,我們只需要在過(guò)濾器內(nèi)部定義這些行為就可以了,在調(diào)用的時(shí)候也需要將內(nèi)容傳過(guò)去
  • 同樣铸鹰,我們也可以傳入更多的參數(shù)癌别,只要我們后期處理就可以了,下面只會(huì)給出兩個(gè)參數(shù)的情況
<div v-for="item in itemList">
  <p>{{item.number | dollarFilter('$$$') }}</p>
</div>
Vue.filter("dollarFilter", function(data, arg) {
  return data + arg;
});
  • 過(guò)濾器也可以被多次調(diào)用
  • 也可以在一個(gè)內(nèi)容身上使用多個(gè)過(guò)濾器
<div id="app">
  <input type="text" name="" v-model:value="keyWords" />
  <div v-for="item in search(keyWords)">
    <li>{{item}}</li>
  </div>
  <div v-for="item in itemList">
    <p>{{item.number | dollarFilter('$$$$') | otherFilter}}</p>
  </div>
  <p>{{ itemList[1].number | dollarFilter('xxxx') }}</p>
</div>
Vue.filter("otherFilter", function(data) {
  return data + "-----------";
});

Vue.filter("dollarFilter", function(data, arg) {
  return data + arg;
});
  • 出來(lái)的結(jié)果就是在$$$$ 后面加了一堆-----

3. 定義私有過(guò)濾器


  • 私有過(guò)濾器屬于 Vue 實(shí)例中所在的實(shí)例
  • 使用 filters 屬性在 Vue 實(shí)例中定義自己的私有過(guò)濾器
  • 定義方式與 methods 中的方法的定義方式相同

html

<div v-for="item in itemList">
  <li>{{ item.number | xxx }}</li>
</div>
filters: {
        xxx: function (data) {
            if (data % 2 === 0) {
                return data
            } else {
                return 'this is not double'
            }
        }
    }

4. 自定義按鍵修飾符


  • 有些時(shí)候我們需要滿足當(dāng)按下某些按鍵的時(shí)候觸發(fā)某個(gè)方法
  • 這時(shí)候我們就需要用到按鍵修飾符了
  • 也就是作用在鍵盤(pán)事件上面的各種修飾符
  • 按鍵修飾符的用法是在綁定按鍵事件監(jiān)聽(tīng)的時(shí)候用點(diǎn)修飾符在被綁定的事件上面進(jìn)行修飾
  • Vue 中默認(rèn)定義的一些按鍵修飾符有:.enter .tab .space .up .left .right .down ....
  • 有些我們想要綁定的按鍵修飾符可能沒(méi)有在這些里面出現(xiàn)蹋笼,這時(shí)候我們可以先在網(wǎng)上找到每個(gè)鍵盤(pán)的鍵盤(pán)碼
  • 并且在Vue.config.keyCodes.f1 = 112里面定義自己的鍵盤(pán)碼展姐,之后的鍵盤(pán)修飾符就可以使用自己定義的鍵盤(pán)碼

html

<div>{{ inputText }}</div>
<input type="text" name="" id="" @keyup.enter="setText" />
setText: function (el) {
            this.inputText = el.target.value
        }

5. 自定義全局指令


  • 指令有很多優(yōu)點(diǎn),我們可以直接用到元素上面
  • 但是我們到目前為止接觸到的全是 Vue 中默認(rèn)的指令剖毯,實(shí)際上我們可以定義自己的全局或者局部指令
  • 指令其實(shí)是有生命周期的圾笨,因此我們可以使用指令的生命周期給其定義一些特殊的行為
  • 指令的生命周期有:
  • bind:只調(diào)用一次,在元素被第一次調(diào)用的時(shí)候進(jìn)行調(diào)用逊谋,可以用于初始化設(shè)置擂达,也就是在內(nèi)存中就執(zhí)行了,一般將一些樣式相關(guān)的處理函數(shù)綁定到這個(gè)生命周期上面
  • inserted:被綁定的元素插入父節(jié)點(diǎn)時(shí)調(diào)用胶滋,一般將一些 javascript 行為相關(guān)的操作綁定的到這個(gè)鉤子函數(shù)上面
  • update:所在組件的 VNode 更新時(shí)調(diào)用板鬓,但是可能發(fā)生在其子 VNode 更新之前。指令的值可能發(fā)生了改變究恤,也可能沒(méi)有俭令。但是你可以通過(guò)比較更新前后的值來(lái)忽略不必要的模板更新
  • componentUpdated:指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用。
  • unbind:只調(diào)用一次部宿,指令與元素解綁時(shí)調(diào)用抄腔。
  • 這些中一般常用的生命周期就是 bind 跟 inserted 這兩個(gè)生命周期
  • 當(dāng)我們定義一些自定義指令的時(shí)候若只用到了這兩個(gè)生命周期的話我們可以進(jìn)行簡(jiǎn)寫(xiě)
  • 指令也有一些默認(rèn)參數(shù),分別為:el,binding,vnode,oldnode
  • el:指向被綁定的元素,可以用來(lái)直接操作 dom
  • binding:一個(gè)對(duì)象赫蛇,其中包括:
    -- name:指令名绵患,不包括 v- 前綴。
    -- value:指令的綁定值棍掐,例如:v-my-directive="1 + 1" 中藏雏,綁定值為 2拷况。
    -- oldValue:指令綁定的前一個(gè)值作煌,僅在 update 和 componentUpdated 鉤子中可用。無(wú)論值是否改變都可用赚瘦。
    -- expression:字符串形式的指令表達(dá)式粟誓。例如 v-my-directive="1 + 1" 中,表達(dá)式為 "1 + 1"起意。
    -- arg:傳給指令的參數(shù)鹰服,可選。例如 v-my-directive:foo 中揽咕,參數(shù)為 "foo"悲酷。
    -- modifiers:一個(gè)包含修飾符的對(duì)象。例如:v-my-directive.foo.bar 中亲善,修飾符對(duì)象為 { foo: true, bar: true }设易。
  • 其中 value 跟 expression 兩個(gè)參數(shù)較為重要
  • vnode:Vue 編譯生成的虛擬節(jié)點(diǎn)。移步 VNode API 來(lái)了解更多詳情蛹头。
  • oldVnode:上一個(gè)虛擬節(jié)點(diǎn)顿肺,僅在 update 和 componentUpdated 鉤子中可用

html

<input type="text" name="" id="" v-focus="'red'">

javascript

//全局指令的定義
Vue.directive('focus', {
    //Vue實(shí)例初始化的時(shí)候的鉤子函數(shù),這一段的作用是可以將輸入的內(nèi)容變成顏色為紅色的內(nèi)容
    bind: function (el, binding) {
        el.style.color = binding.value
    },
    //Vue實(shí)例在被裝載到dom樹(shù)之后要觸發(fā)的鉤子函數(shù)
    inserted: function (el) {
        el.focus()
    },
    //之后的一次些鉤子函數(shù)都不是常用的鉤子函數(shù)
    //有數(shù)據(jù)更新的時(shí)候觸發(fā)的鉤子函數(shù)
    update: function () {

    },
    //組件被更新,也就是組件中數(shù)據(jù)更新的時(shí)候觸發(fā)的鉤子函數(shù)
    componentUpdated: function () {

    },
    //解除綁定的時(shí)候觸發(fā)的鉤子函數(shù)
    unbind: function () {

    }
})

自定義局部指令

  • 自定義局部指令可以被用于一個(gè)實(shí)例身上
  • 下面直接給出例子

html

<p v-font-size="90">yerts</p>
 directives: {
        fontSize: {
            //這一段代碼可以將被使用的元素中字體大小調(diào)節(jié)為輸入的大小
            bind: function (el, binding) {
                el.style.fontSize = binding.value.toString() + 'px'
            },
            inserted: function () {

            },
            update: function () {

            },
            componentUpdated: function () {

            },
            unbind: function () {

            }
        }
    }

簡(jiǎn)寫(xiě)指令的方式定義

  • 當(dāng)我們不關(guān)心指令的生命周期的時(shí)候我們可以通過(guò)以下這種方式來(lái)簡(jiǎn)寫(xiě)指令
fontWeight: function (el, binding) {
            el.style.fontWeight = Number(binding.value)
        }
<p v-font-size="90" v-font-weight="900">yerts</p>

6. 組件的生命周期


  • 從Vue實(shí)例被掛載到dom樹(shù)到銷(xiāo)毀這個(gè)dom樹(shù)的過(guò)程中其實(shí)伴隨著很多鉤子函數(shù)
  • 通過(guò)對(duì)其鉤子函數(shù)加一些特定的處理方法渣蜗,我們可以更系統(tǒng)地控制我們實(shí)例的生命周期
  • Vue中的生命周期有以下幾個(gè),我們直接給出官網(wǎng)中給出的生命周期函數(shù)的圖片做演示


    lifecycle.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屠尊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子耕拷,更是在濱河造成了極大的恐慌讼昆,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骚烧,死亡現(xiàn)場(chǎng)離奇詭異浸赫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)止潘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)掺炭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人凭戴,你說(shuō)我怎么就攤上這事涧狮。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵者冤,是天一觀的道長(zhǎng)肤视。 經(jīng)常有香客問(wèn)我,道長(zhǎng)涉枫,這世上最難降的妖魔是什么邢滑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮愿汰,結(jié)果婚禮上困后,老公的妹妹穿的比我還像新娘。我一直安慰自己衬廷,他們只是感情好摇予,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吗跋,像睡著了一般侧戴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跌宛,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天酗宋,我揣著相機(jī)與錄音,去河邊找鬼疆拘。 笑死蜕猫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的入问。 我是一名探鬼主播丹锹,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芬失!你這毒婦竟也來(lái)了楣黍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤棱烂,失蹤者是張志新(化名)和其女友劉穎租漂,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體颊糜,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哩治,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衬鱼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片业筏。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鸟赫,靈堂內(nèi)的尸體忽然破棺而出蒜胖,到底是詐尸還是另有隱情消别,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布台谢,位于F島的核電站寻狂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏朋沮。R本人自食惡果不足惜蛇券,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望樊拓。 院中可真熱鬧纠亚,春花似錦、人聲如沸骑脱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叁丧。三九已至,卻和暖如春岳瞭,著一層夾襖步出監(jiān)牢的瞬間拥娄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工瞳筏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稚瘾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓姚炕,卻偏偏與公主長(zhǎng)得像摊欠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柱宦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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