最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue自定義指令寫法與個人理解

 更新時間:2019年02月09日 14:11:57   投稿:wdc  
VUE指令是什么,VUE自定義指令又是什么,下面就和大家分享一下個人對它們的理解

什么是Vue指令?

指令是一種可以附加到DOM元素的微命令(tiny commands). 它們通常以"v-"作為前綴, 以方便Vue知道你在使用一種特殊的標記, 從而確保語法的一致性. 如果你需要對HTML元素的低級別(low-level)訪問來控制一些行為, 它們通常很有用.

如果你正在使用Vue(或者Angular), 你可能已經(jīng)很熟悉其中的一些指令, 如: v-if, v-else等等. 我們將從了解一些基礎開始, 但是如果你更愿意直接看例子, 請直接往下滾動. 這些例子也能很好的讓你理解這些概念.

以下是一些指令的使用方法, 以及對應的例子片段. 這些例子不是規(guī)定性的, 它們只是一些用例. 這里的"例子"實際上是"指令".

v-example: 這將實例化一個指令, 但不接受任何參數(shù). 雖然不帶參數(shù)的指令, 在使用的過程中并不是很靈活, 但是你仍然可以通過這種類型的指令對DOM元素做一些操作.

v-example="value": 這將傳遞一個值給指令, 并且該指令根據(jù)該值計算出要做的操作.

<div v-if="stateExample">I will show up if stateExample is true</div>

v-example="'string'": 這將讓你把'string'作為一個表達式.

<p v-html="'<strong>this is an example of a string in some text</strong>'"></p>

v-example:arg="value": 這允許我們傳入一個參數(shù)給指令. 下面的例子中, 我們綁定到一個類, 將其樣式化為一個對象, 單獨存儲.

<div v-bind:class="someClassObject"></div>

v-example:arg.modifier="value": 這允許我們使用修飾語. 下面的例子中, 允許我們在點擊事件時, 調用preventDefault().

<button v-on:submit.prevent="onSubmit"></button>

理解Vue自定義指令

既然我們已經(jīng)大致過了一遍所有的我們所用過的指令類型方法, 讓我們想一想我們如何通過自己編寫的自定義指令來實現(xiàn)它們? 使用自定義指令的一個很好的例子是滾動事件, 讓我們看看如何實現(xiàn)它.

首先, 最基本的是如何創(chuàng)建一個全局的指令. (是的, 它什么也不做.) 僅僅是創(chuàng)建了一個指令.

Vue.directive('tack');

HTML:

<p v-tack>This element has a directive on it</p>

我們有幾個可用的鉤子, 每個鉤子可以選擇一些參數(shù). 鉤子如下:

bind: 一旦指令附加到元素時觸發(fā)
inserted: 一旦元素被添加到父元素時觸發(fā)
update: 每當元素本身更新(但是子元素還未更新)時觸發(fā)
componentUpdate: 每單組件和子組件被更新時觸發(fā)
unbind: 一旦指令被移除時觸發(fā)

就個人而言, bind和update也許是這五個里面最有用的兩個鉤子了.
每個鉤子都有el, binding, 和vnode參數(shù)可用. update和componentUpdated鉤子還暴露了oldVnode, 以區(qū)分傳遞的舊值和較新的值.

el, 跟你所期待的一樣, 就是所綁定的元素. binding是一個保護傳入鉤子的參數(shù)的對象. 有很多可用的參數(shù), 包括name, value, oldValue, expression, arguments, arg及修飾語. vnode有一個更不尋常的用例, 它可用于你需要直接引用到虛擬DOM中的節(jié)點. binding和vnode都應該被視為只讀.

綁定一個自定義指令

既然我們已經(jīng)知道了這一點, 就可以開始研究如何在實際中使用一個自定義指令. 讓我們完善剛才所創(chuàng)建的第一個指令, 讓它變得有用:

Vue.directive('tack', {
  bind(el, binding, vnode) {
    el.style.position = 'fixed'
  }
});

在HTML元素中:

<p v-tack>I will now be tacked onto the page</p>

毫無疑問, 它完全可以按照我們所希望的工作. 但是它還不夠靈活, 如果我們可以傳入一個值, 然后直接更新或者重用這個指令就好了. 例如, 我們想為這個元素指定一個值, 表示這個元素離頂部多遠(多少個像素), 我們可以這樣寫(在CODEPEN上查看):


// JS
Vue.directive('tack', {
  bind(el, binding, vnode){
    el.style.position = 'fixed';
    el.style.top = binding.value + 'px';
  }
});

// HTML
<div id="app">
  <p>Scroll down the page</p>
  <p v-tack="70">Stick me 70px from the top of the page</p>
</div>

假設我們想要區(qū)分從頂部或者左側偏移70px, 我們可以通過傳遞一個參數(shù)來做到這一點(在CODEPEN上查看):


// JS
Vue.directive('tack', {
  bind(el, binding, vnode) {
    el.style.position = 'fixed';
    const s = (binding.arg === 'left' ? 'left' : 'top');
    el.style[s] = binding.value + 'px';
  }
});

// HTML
<p v-tack:left="70">I'll now be offset from the left instead of the top</p>

當然, 你可以同時傳入不止一個值. 你可以像使用標準指令一樣簡單的使用自定義指令(在CODEPEN上查看):

// JS
Vue.directive('tack', {
  bind(el, binding, vnode) {
    el.style.position = 'fixed';
    el.style.top = binding.value.top + 'px';
    el.style.left = binding.value.left + 'px';
  }
});

// HTML
<p v-tack="{top: '40', left: '100'}">Stick me 40px from the top of the page and 100px from the left of the page</p>

基于我們的自定義指令, 我們可以創(chuàng)建和修改方法, 從而創(chuàng)建更為復雜的自定義指令. 這里, 我們將做一個waypoints-like例子, 用少量的代碼實現(xiàn)特定滾動事件觸發(fā)的動畫效果(在CODEPEN上查看):

// JS
Vue.directive('scroll', {
  inserted: function(el, binding) {
    let f = function(evt) {
      if(binding.value(evt, el)) {
        window.removeEventListener('scroll', f);
      }
    };
    window.addEventListener('scroll', f);
  }
});

// main app
new Vue({
  el: "#app",
  methods: {
    handleScroll: function(evt, el) {
      if(window.scrollY > 50) {
        TweenMax.to(el, 1.5, {
          y: -10,
          opacity: 1,
          ease: Sine.easeOut
        });
      }
      
      return window.scrollY > 100;
    }
  }
});

// HTML
<div class="box" v-scroll="handleScroll">
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. A atque amet harum aut ab veritatis earum porro praesentium ut corporis. Quasi provident dolorem officia iure fugiat, eius mollitia sequi quisquam.</p>
</div>

為了讓大家看得更清楚, 在這個代碼片段中, 我們盡可能的保證它的簡單易讀. 在實際的APP中, 你可以構建非常友好的, 并且非常靈活的, 適合整個團隊使用的自定義指令.

在實際的構建中, 我會將指令代碼放在"main.js"文件中, 該文件位于"src"目錄的根目錄下(如果你使用的是Vue-cli構建工具), 那么"App.vue"以及組件目錄中的所有的.vue文件都可以訪問它. 當然, 還要其他方法可以使用它, 但是我發(fā)現(xiàn)對于整個應用程序來說, 這是最靈活的實現(xiàn)方式.

以上就是個人對Vue自定義指令的理解,希望對大家有所幫助

相關文章

  • 如何在vue3+ts項目中使用query和params傳參

    如何在vue3+ts項目中使用query和params傳參

    Vue3中的路由傳參有兩種方式:query和params,下面這篇文章主要給大家介紹了關于如何在vue3+ts項目中使用query和params傳參的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • 7個很棒的Vue開發(fā)技巧分享

    7個很棒的Vue開發(fā)技巧分享

    這篇文章主要為大家整理了7個很棒的Vue開發(fā)技巧,可以幫助大家更好的理解和使用vue框架。文中的示例代碼講解詳細,感興趣的可以了解一下
    2023-02-02
  • 詳解vue-loader在項目中是如何配置的

    詳解vue-loader在項目中是如何配置的

    這篇文章主要介紹了詳解vue-loader在項目中是如何配置的,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 詳解vue-cli 快速搭建單頁應用之遇到的問題及解決辦法

    詳解vue-cli 快速搭建單頁應用之遇到的問題及解決辦法

    這篇文章主要介紹了詳解vue-cli 快速搭建單頁應用之遇到的問題及解決辦法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • vue實現(xiàn)打地鼠小游戲

    vue實現(xiàn)打地鼠小游戲

    這篇文章主要為大家詳細介紹了vue實現(xiàn)打地鼠小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 加速vue組件渲染之性能優(yōu)化

    加速vue組件渲染之性能優(yōu)化

    這篇文章主要介紹了加速vue組件渲染之性能優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Vue中使用stylus報錯的解決

    Vue中使用stylus報錯的解決

    如果你也和我一樣,按照正常的流程下載并且配置了stylus,但是依舊報錯,也許這篇文章就是你的菜,一起來看看吧
    2022-08-08
  • vue中transition組件在項目中運用小結

    vue中transition組件在項目中運用小結

    這篇文章主要介紹了vue中transition組件在項目中運用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • vue-cli隨機生成port源碼的方法

    vue-cli隨機生成port源碼的方法

    這篇文章主要介紹了vue-cli隨機生成port源碼的方法,文中給大家介紹了vue 隨機色生成方法,需要的朋友可以參考下
    2019-09-09
  • Vue路由跳轉與接收參數(shù)的實現(xiàn)方式

    Vue路由跳轉與接收參數(shù)的實現(xiàn)方式

    這篇文章主要介紹了Vue路由跳轉與接收參數(shù)的實現(xiàn)方式,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04

最新評論

宜章县| 阿坝县| 福鼎市| 凉山| 白山市| 萍乡市| 北票市| 章丘市| 永川市| 富顺县| 哈巴河县| 梁河县| 田阳县| 湛江市| 东明县| 伊金霍洛旗| 南涧| 沧源| 贡嘎县| 蕉岭县| 丰原市| 墨江| 雷山县| 高青县| 牟定县| 巴彦淖尔市| 鄂托克前旗| 巧家县| 福鼎市| 石棉县| 石林| 颍上县| 潼关县| 杨浦区| 湖北省| 府谷县| 通道| 乌海市| 怀宁县| 辽中县| 上杭县|