Vue文檔筆記系列——可復用性&組合

可復用性&組合

mixins混入

用我的話來解釋就是包含了一些組件選項的對象,然后可以在不同的組件中引用刑巧。一個例子來演示:

    Vue.component('tooltip', {
      template: `
        <div>
            <button @mouseenter="show" @mouseout="hide">鼠標滑過</button>
            <div v-if="visible">我是內(nèi)容1</div>
        </div>
      `,
      methods: {
        show: function () {
          this.visible = true
        },
        hide: function () {
          this.visible = false
        }
      },
      data: function () {
        return {
          visible: false
        }
      }
    })

    Vue.component('popup', {
      template: `
      <div>
        <button @click="toggle">點擊切換</button>
        <button @click="hide">關閉</button>
        <div v-if="visible">我是內(nèi)容2</div>
      </div>`,
      data: function () {
        return {
          visible: false
        }
      },
      methods: {
        toggle: function () {
          this.visible = !this.visible
        },
        hide: function () {
          this.visible = false
        }
      }
    })
    new Vue({
      el: '#app'
    })
  <div id="app">
    <tooltip></tooltip>
    <popup></popup>
  </div>

例子中兩個組件,重復的功能太多,比如data中的visible,methods中的hide方法哈恰。此時我們要讓代碼變得簡約只估,就用到了mixins,定義一個對象着绷,然后在組件中用數(shù)組來引入蛔钙。代碼改進如下:

    var myMix = {
      methods: {
        show: function () {
          this.visible = true
        },
        hide: function () {
          this.visible = false
        },
        toggle: function () {
          this.visible = !this.visible
        }
      },
      data: function () {
        return {
          visible: false
        }
      }
    };

    Vue.component('tooltip', {
      template: `
        <div>
            <button @mouseenter="show" @mouseout="hide">鼠標滑過</button>
            <div v-if="visible">我是內(nèi)容1</div>
        </div>
      `,
      mixins: [myMix]
    })

    Vue.component('popup', {
      template: `
      <div>
        <button @click="toggle">點擊切換</button>
        <button @click="hide">關閉</button>
        <div v-if="visible">我是內(nèi)容2</div>
      </div>`,
      mixins: [myMix]
    })

值得注意的是,在組件中定義和mixins相同的選項時荠医,會覆蓋mixins中的選項吁脱。比如我在popul組件中定義data,默認visible:ture彬向,則會覆蓋掉mixins中默認的visible:false.

自定義指令

跟自定義組件類似兼贡,還是用一個例子來看比較明白:

  <div id="app">
    <div v-pin="pinned" class="card">
      <button @click="pinned = !pinned">切換</button>
      我是相片
    </div>
    Lorem ipsum dolor sit amet consectetur, adipisicing elit. Dolor suscipit ad consequuntur quia ipsam eius consequatur eum
    sint, minima adipisci nemo error, delectus quaerat sit magni non praesentium maiores? Voluptas. Lorem ipsum dolor sit
    amet consectetur adipisicing elit. Ipsa, molestias, a dicta commodi harum, ducimus iusto quo natus eos reprehenderit
    est ipsam nemo error tempora? Reprehenderit iure ipsum at similique! Lorem, ipsum dolor sit amet consectetur adipisicing
    elit. Asperiores saepe iusto dolore, magnam ex earum illo. Non, necessitatibus dignissimos libero sed dolorem ipsa ea
    sunt quo optio omnis praesentium atque. Lorem ipsum dolor sit amet consectetur adipisicing elit. Iste quibusdam ratione,
    quisquam dolorem doloribus delectus deserunt ab sit error placeat explicabo, ea, animi magnam. Ad, aperiam temporibus.
    Eos, exercitationem laborum. Lorem ipsum dolor, sit amet consectetur adipisicing elit. Accusamus fugiat incidunt sit
    deserunt consequatur molestias dicta praesentium corrupti autem nostrum dolorum facilis, quidem ipsa obcaecati ipsum
    saepe? Aliquid, inventore suscipit. Lorem, ipsum dolor sit amet consectetur adipisicing elit. Suscipit voluptatem debitis
    delectus veritatis, laboriosam repudiandae, ea non minima ipsam eligendi nam tempora porro id quae maxime doloribus nulla,
    accusantium animi. Lorem ipsum dolor sit amet consectetur, adipisicing elit. Iste temporibus molestias ratione. Porro
    itaque aperiam vero, voluptatum natus animi adipisci necessitatibus, quidem ipsam possimus molestias officiis, fugit
    velit quibusdam soluta! Lorem ipsum dolor sit amet consectetur adipisicing elit. Perferendis minus commodi architecto
    consectetur nesciunt totam sit aspernatur quas placeat fugit aut esse dolorum sed doloribus fugiat, nihil hic possimus
    rerum.
  </div>
.card {
      background: #ccc;
      padding: 15px;
      margin: 15px;
      width: 80px;
      height: 80px;
      text-align: center;
    }
    Vue.directive('pin', function (el, binding) {
      var val = binding.value;
      if (val) {
        el.style.position = 'fixed';
      } else {
        el.style.position = 'static'
      }
    })
    new Vue({
      el: '#app',
      data: {
        pinned: false
      }
    })

在本例子中,點擊按鈕就可以切換相片的position屬性娃胆。
解釋一下遍希,例子中pin是自定義指令的名字,在全局中用v-pin來表示里烦。函數(shù)中el代表指令所在的DOM元素凿蒜,binding是指令的值的一些屬性,這里直接從官網(wǎng)上copy了:

  • name:指令名胁黑,不包括 v- 前綴废封。
  • value:指令的綁定值,例如:v-my-directive="1 + 1" 中丧蘸,綁定值為 2漂洋。
  • oldValue:指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用力喷。無論值是否改變都可用刽漂。
  • expression:字符串形式的指令表達式。例如 v-my-directive="1 + 1" 中冗懦,表達式為 "1 + 1"爽冕。
  • arg:傳給指令的參數(shù),可選披蕉。例如 v-my-directive:foo 中颈畸,參數(shù)為 "foo"。
  • modifiers:一個包含修飾符的對象没讲。例如:v-my-directive.foo.bar 中眯娱,修飾符對象為 { foo: true, bar: true }。

好爬凑,比如我們在指令上添加一些修飾符:

  <div v-pin:true.bottom.right="pinned" class="card">
 Vue.directive('pin', function (el, binding) {
      var val = binding.value;
      var position = binding.modifiers;
      var warning = binding.arg;
      if (val) {
        el.style.position = 'fixed';

        for(var key in position) {
          if(position[key]){
            el.style[key] = '20px'
          }
        }
        if (warning === 'true') {
          el.style.background = 'red'
        }
      } else {
        el.style.position = 'static';
        el.style.background = '#ccc'
      }
    })

這樣點擊按鈕徙缴,相片就變?yōu)榧t色,位置移到了右下方。

過濾器filter

過濾器其實就是作一個優(yōu)化的作用于样。它可以用在雙花括號插值和 v-bind 表達式疏叨。來個例子吧:

  <div id="app">
    <input type="text" v-model="length">毫米   {{length | meter}}
    <br>
    <input type="text" v-model="price"> {{price | current}}
  </div>
    Vue.filter('meter', function (val, unit) {
      var val = val || 0;
      var unit = unit || '米';
      return (val / 1000).toFixed(3) + unit
    })
    Vue.filter('current', function (val, unit) {
      var val = val || 0;
      var unit = unit || '元';
      return val + unit
    })
    new Vue({
      el: '#app',
      data: {
        price: 10,
        length: 10
      }
    })

第二個小例子中,默認的單位就是元穿剖,如果我們把過濾器后面加個括號蚤蔓,加了美元符號。就可以變更視圖糊余。

 <input type="text" v-model="price"> {{price | current('$')}}

簡單的一些單位換算可以用過濾器秀又,如果比較復雜, 最好還是用計算屬性computed

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贬芥,一起剝皮案震驚了整個濱河市吐辙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蘸劈,老刑警劉巖昏苏,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昵时,居然都是意外死亡捷雕,警方通過查閱死者的電腦和手機椒丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門壹甥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人壶熏,你說我怎么就攤上這事句柠。” “怎么了棒假?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵溯职,是天一觀的道長。 經(jīng)常有香客問我帽哑,道長谜酒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任视哑,我火速辦了婚禮形病,結(jié)果婚禮上婚惫,老公的妹妹穿的比我還像新娘。我一直安慰自己述么,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布愕掏。 她就那樣靜靜地躺著度秘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饵撑。 梳的紋絲不亂的頭發(fā)上剑梳,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天唆貌,我揣著相機與錄音,去河邊找鬼垢乙。 笑死挠锥,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的侨赡。 我是一名探鬼主播蓖租,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羊壹!你這毒婦竟也來了蓖宦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤油猫,失蹤者是張志新(化名)和其女友劉穎稠茂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體情妖,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡睬关,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了毡证。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片电爹。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖料睛,靈堂內(nèi)的尸體忽然破棺而出丐箩,到底是詐尸還是另有隱情,我是刑警寧澤恤煞,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布屎勘,位于F島的核電站,受9級特大地震影響居扒,放射性物質(zhì)發(fā)生泄漏概漱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一喜喂、第九天 我趴在偏房一處隱蔽的房頂上張望瓤摧。 院中可真熱鬧,春花似錦夜惭、人聲如沸姻灶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽产喉。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曾沈,已是汗流浹背这嚣。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塞俱,地道東北人姐帚。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像障涯,于是被迫代替她去往敵國和親罐旗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

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

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容唯蝶,還有我對于 Vue 1.0 印象不深的內(nèi)容九秀。關于...
    云之外閱讀 5,048評論 0 29
  • Vue 實例 屬性和方法 每個 Vue 實例都會代理其 data 對象里所有的屬性:var data = { a:...
    云之外閱讀 2,207評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)粘我,斷路器鼓蜒,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 1.安裝 可以簡單地在頁面引入Vue.js作為獨立版本,Vue即被注冊為全局變量征字,可以在頁面使用了都弹。 如果希望搭建...
    Awey閱讀 11,015評論 4 129
  • 不管你的微信公共號到底是什么類型,你必須明確以下幾點:運營目標匙姜、運營規(guī)劃畅厢、運營指標和用戶維護。 1搁料、運營目標 首先...
    一只正經(jīng)的運營狗閱讀 25,537評論 2 29