Vue.js - 進(jìn)階語(yǔ)法

以下筆記皆基于 Vue 2

自定義指令


指令用于簡(jiǎn)化 DOM 操作慌烧,相當(dāng)于對(duì)基礎(chǔ) DOM 操作的一種封裝赦抖。當(dāng)我們希望使用一些內(nèi)置指令不具備的 DOM 功能時(shí)娄徊,可以進(jìn)行自定義指令設(shè)置柿汛。

自定義全局指令

自定義指令指的是可以被任意 Vue 實(shí)例或組件使用的指令趟据。以下是自定義指令的設(shè)置方式券犁,自定義指令內(nèi)鉤子函數(shù) inserted 函數(shù)可以接收當(dāng)前使用指令的元素 element ,在函數(shù)捏對(duì) element 參數(shù)進(jìn)行操作實(shí)現(xiàn)指令汹碱,也可以接收 binding 參數(shù)獲取元素綁定的相關(guān)信息粘衬,比如修飾符信息以及賦值信息。

<body>
  <div id="app">
    <input type="text" v-focus.a.b="100+1">
  </div>
  <script src="lib/vue.js"></script>
  <script>
    // 自定義全局指令咳促,'focus' 為指令名稱(chēng)
    Vue.directive('focus', {
      inserted (element, binding) {
        console.log(element);
        console.log(binding);
        el.focus();
      }
    });

    new Vue({
      el: '#app',
      data: { }
    });
  </script>
</body>

自定義局部指令

自定義局部指令指的是可以在當(dāng)前 Vue 實(shí)例或組件內(nèi)使用的指令稚新。

<body>
  <div id="app">
    <input type="text" v-focus>
  </div>
  <!-- app2 無(wú)法使用 v-focus -->
  <div id="app2">
    <input type="text" v-focus>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    // 自定義局部指令
    new Vue({
      el: '#app',
      data: {},
      directives: {
        focus: {
          inserted (el) {
            el.focus();
          }
        }
      }
    });

    new Vue({
      el: '#app2'
    });
  </script>
</body>

過(guò)濾器


過(guò)濾器用于進(jìn)行文本內(nèi)容格式化處理,通過(guò)管道符 |跪腹,在插值表達(dá)式和 v-bind 中使用褂删,過(guò)濾器內(nèi)返回的值就是最終結(jié)果,否則為空冲茸。

和自定義指令類(lèi)似屯阀,同樣分為全局過(guò)濾器局部過(guò)濾器,局部過(guò)濾器只能在當(dāng)前 Vue 實(shí)例中使用轴术。

<body>
  <div id="app">
    <p v-bind:title="value | filterA">這是標(biāo)簽</p>
    <p>{{ value2 | filterA }}</p>
  </div>

  <div id="app2">
    <p>{{ value | filterA }}</p>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    // 設(shè)置全局過(guò)濾器
    Vue.filter('filterA', function (value) {
      return value.split('-').join('');
    });

    new Vue({
      el: '#app',
      data: {
        value: 'a-b-c',
        value2: 'x-y-z'
      }
    });

    new Vue({
      el: '#app2',
      data: {
        value: 'q-w-e'
      },
      // 局部過(guò)濾器
      filters: {
        filterA: function (value) {
          return value.split('-').join('');
        }
      }
    })
  </script>
</body>

在使用過(guò)濾器時(shí)难衰,可以將一個(gè)數(shù)據(jù)傳入到多個(gè)過(guò)濾器中進(jìn)行處理,其處理順序是從左往右依次進(jìn)行逗栽,并且一個(gè)過(guò)濾器可以傳入多個(gè)參數(shù)盖袭,傳入的第一個(gè)形參固定為使用過(guò)濾器的值,后面的形參才是自定義傳入的的參數(shù)祭陷。

<body>
  <div id="app">
    <p>{{ value | filterA | filterB }}</p>

    <p>{{ value | filterC('lagou-', 200) }}</p>

  </div>
  <script src="lib/vue.js"></script>
  <script>
    // 去除 '-' 過(guò)濾器
    Vue.filter('filterA', function (value) {
      console.log(value, 'filterA');
      return value.split('-').join('');
    });
    // 首字母大寫(xiě)過(guò)濾器
    Vue.filter('filterB', function (value) {
      console.log(value, 'filterB');
      return value[0].toUpperCase() + value.slice(1);
    })
    // 傳入?yún)?shù)苍凛,去除 value 的 '-' 再拼接到第一個(gè)實(shí)參的末尾
    Vue.filter('filterC', function (par1, par2, par3) {
      return par2 + par1.split('-').join('');
    });

    new Vue({
      el: '#app',
      data: {
        value: 'a-b-c'
      }
    });
  </script>
</body>

注意:如果局部過(guò)濾器與全局過(guò)濾器重名,則會(huì)使用局部過(guò)濾器兵志,類(lèi)似于全局變量與局部變量的關(guān)系醇蝴。

計(jì)算屬性


Vue.js 的視圖不建議書(shū)寫(xiě)復(fù)雜邏輯,這樣不利于維護(hù)想罕。比如:

<div id="app">
  <p>{{ Math.max.apply(null, arr) }}</p>
  <p>{{ Math.max.apply(null, arr) }}</p>
  <p>{{ Math.max.apply(null, arr) }}</p>
</div>

封裝函數(shù)是很好的方式悠栓,但有時(shí)重復(fù)的計(jì)算會(huì)消耗不必要的性能霉涨,而計(jì)算屬性使用時(shí)為屬性形式,訪問(wèn)時(shí)會(huì)自動(dòng)執(zhí)行對(duì)應(yīng)函數(shù)惭适,且在視圖使用時(shí)只會(huì)計(jì)算一次結(jié)果笙瑟,計(jì)算結(jié)果放入緩存中,下次調(diào)用同樣的計(jì)算函數(shù)會(huì)直接在緩存中讀取結(jié)果癞志。

測(cè)試代碼
<body>
  <div id="app">
    <p>{{ getSum() }}</p>
    <p>{{ getSum() }}</p>
    <p>{{ getSum() }}</p>

    <p>{{ getResult }}</p>
    <p>{{ getResult }}</p>
    <p>{{ getResult }}</p>
    <p>{{ getResult }}</p>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        arr: [1, 2, 3, 4, 5]
      },
      methods: {
        getSum () {
          console.log('執(zhí)行了函數(shù)功能');
          var arr = this.arr;
          var sum = 0;
          for (var i = 0; i < arr.length; i++) {
            sum += arr[i];
          }
          return sum;
        }
      },
      computed: {
        getResult () {
          console.log('執(zhí)行了計(jì)算屬性');
          var arr = this.arr;
          var sum = 0;
          for (var i = 0; i < arr.length; i++) {
            sum += arr[i];
          }
          return sum;
        }
      }
    })
  </script>
</body>

methods 與 computed 區(qū)別

  • computed 具有緩存型往枷,methods 沒(méi)有。
  • computed 通過(guò)屬性名訪問(wèn)凄杯,methods 需要調(diào)用错洁。
  • computed 僅適用于計(jì)算操作。

計(jì)算屬性的 setter

計(jì)算屬性默認(rèn)只有 getter戒突,即被訪問(wèn)時(shí)要執(zhí)行的操作屯碴,Vue.js 也允許給計(jì)算屬性設(shè)置 setter ,即賦值時(shí)要執(zhí)行的操作膊存。

var vm = new Vue({
  computed: {
    getResult: {
      // getter
      get: function () {
        // 邏輯代碼
      }
      // setter
      set: function () {
        // 邏輯代碼
      }
    }
  }
});

偵聽(tīng)器


偵聽(tīng)器 watch 用于監(jiān)聽(tīng)數(shù)據(jù)變化并執(zhí)行指定操作导而。

new Vue({
  el: '#app'
  data: {
    value: ''
  },
  watch: {
    value (newValue, oldValue) {
      // 邏輯代碼
    }
  }
});

為了監(jiān)聽(tīng)對(duì)象內(nèi)部值的變化,需要將 watch 書(shū)寫(xiě)為對(duì)象隔崎,并設(shè)置選項(xiàng) deep: true今艺,這時(shí)通過(guò) handler 設(shè)置處理函數(shù)。

new Vue({
  el: '#app',
  data: {
    obj: {
      content1: '內(nèi)容1',
      content2: '內(nèi)容2'
    }
  },
  watch: {
    obj: {
      deep: true,
      handler (val, oldval) {
        console.log(val, oldVal);
      }
    }
  }
});

注意:

  • 當(dāng)更改(非替換)數(shù)組或?qū)ο髸r(shí)仍稀,回調(diào)函數(shù)中的新值與舊值相同洼滚,因?yàn)樗鼈兊囊枚贾赶蛲粋€(gè)數(shù)組 、對(duì)象技潘。
  • 數(shù)組操作不要使用索引與length遥巴,無(wú)法觸發(fā)偵聽(tīng)器函數(shù)。

Vue DevTools


Vue DevTools 是 Vue.js 官方提供的用來(lái)調(diào)試 Vue 應(yīng)用的工具享幽,為 Chrome 瀏覽器插件铲掐。

Chrome 網(wǎng)上應(yīng)用店 - 擴(kuò)展程序,沒(méi)法打開(kāi)可以先安裝【iGG谷歌訪問(wèn)助手】插件值桩。

注意:Edge 瀏覽器的插件商城是沒(méi)有 Vue DevTools 插件的摆霉,但是 Edge 也是 Chrome 內(nèi)核,所以 Edge 也可以安裝 Chrome 插件奔坟,因此可以在 Edge 上進(jìn)入 Chrome 網(wǎng)上應(yīng)用店安裝 Vue DevTools 携栋。

注意事項(xiàng):

  • 網(wǎng)頁(yè)必須應(yīng)用了 Vue.js 功能才能看到 Vue DevTools
  • 網(wǎng)頁(yè)必須使用 Vue.js 而不是 Vue.min.js
  • 網(wǎng)頁(yè)需要在 http 協(xié)議下打開(kāi),而不是使用 file 協(xié)議本地打開(kāi)咳秉。

Vue.js 生命周期


Vue.js 生命周期指的是 Vue 實(shí)例的生命周期婉支,即實(shí)例從創(chuàng)建到運(yùn)行,再到銷(xiāo)毀的過(guò)程澜建,通過(guò)設(shè)置生命周期函數(shù)向挖,可以在生命周期的特定階段執(zhí)行功能蝌以,而生命周期函數(shù)也稱(chēng)為生命周期鉤子。

Vue 實(shí)例 — Vue.js (vuejs.org)

  • 創(chuàng)建階段(特點(diǎn):每個(gè)實(shí)例只能執(zhí)行一次)

    • beforeCreate:實(shí)例初始化之前調(diào)用何之。
    • created: 實(shí)例創(chuàng)建后調(diào)用跟畅。
    • beforeMount:實(shí)例掛載之前調(diào)用。
    • mounted: 實(shí)例掛載完畢溶推。
  • 運(yùn)行階段(特點(diǎn):按需調(diào)用)

    • beforeUpdate:數(shù)據(jù)更新后徊件,視圖更新前調(diào)用。
    • updated: 視圖更新后調(diào)用悼潭。
  • 銷(xiāo)毀階段(特點(diǎn):每個(gè)實(shí)例只能執(zhí)行一次)

    • beforeDestroy:實(shí)例銷(xiāo)毀之前調(diào)用庇忌。
    • destroyed: 實(shí)例銷(xiāo)毀后調(diào)用。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舰褪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疏橄,更是在濱河造成了極大的恐慌占拍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捎迫,死亡現(xiàn)場(chǎng)離奇詭異晃酒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)窄绒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)贝次,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人彰导,你說(shuō)我怎么就攤上這事蛔翅。” “怎么了位谋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵山析,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我掏父,道長(zhǎng)笋轨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任赊淑,我火速辦了婚禮爵政,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陶缺。我一直安慰自己钾挟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布组哩。 她就那樣靜靜地躺著等龙,像睡著了一般处渣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛛砰,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天罐栈,我揣著相機(jī)與錄音,去河邊找鬼泥畅。 笑死荠诬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的位仁。 我是一名探鬼主播柑贞,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼聂抢!你這毒婦竟也來(lái)了钧嘶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤琳疏,失蹤者是張志新(化名)和其女友劉穎有决,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體空盼,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宋欺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年晦溪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慰枕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亭姥。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖篱瞎,靈堂內(nèi)的尸體忽然破棺而出苟呐,到底是詐尸還是另有隱情,我是刑警寧澤奔缠,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布掠抬,位于F島的核電站,受9級(jí)特大地震影響校哎,放射性物質(zhì)發(fā)生泄漏两波。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一闷哆、第九天 我趴在偏房一處隱蔽的房頂上張望腰奋。 院中可真熱鬧,春花似錦抱怔、人聲如沸劣坊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)局冰。三九已至测蘑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間康二,已是汗流浹背碳胳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沫勿,地道東北人挨约。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像产雹,于是被迫代替她去往敵國(guó)和親诫惭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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