vue模塊化開發(fā)以及組件封裝思想

js模塊化開發(fā)

為什么會有模塊化開發(fā)涣雕?

  1. 代碼重用時,引入js文件的數目可能少了装处,避免來代碼的累贅误债。
  2. 代碼復用高,開發(fā)效率也會提高妄迁。
  3. 方便后期的維護寝蹈。
    模塊化開發(fā)

模塊化封裝(組件封裝)思想

  1. 智能組件
  • 和一切數據打交道,發(fā)生各種請求登淘。
  • 只接受父組件的參數箫老。返回給父組件需要的值。
  1. 木偶組件
  • 不依賴父組件的實例形帮,不受父組件影響(css)槽惫。
  • 接受父組件的一切,不返回任何值辩撑。
  • 渲染確定的結果界斜。
    頁面渲染通過智能組件。它們專門做數據相關的應用邏輯合冀,和各種數據打交道各薇、和 Ajax 打交道,然后把數據通過 props 傳遞給木偶組件,它們帶領著 木偶組件組件完成了復雜的應用程序邏輯
    組件封裝一個react-redux組件封裝介紹使用峭判;

vue組件封裝實例

需要對vue的指令有更生的理解:

extend:組件構造器开缎;
directive:指令生成器;
slot:組件插槽林螃;
style,class綁定奕删;

組件封裝思想:model層,view層疗认,control層

1. vue組件封裝: message封裝完残。

已經實現(xiàn):自定義樣式,自定義內容横漏,以方法調用

model層實現(xiàn)

<template>
  <transition name="mei-message-fade">
    <div v-if="show" :class="[
        'mei-message',
        type? `mei-message-${ type }` : '']">
      <span class="mei-message-con">{{text}}</span>
    </div>
  </transition>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';

@Component
export default class MessageBox extends Vue {
  show: boolean = false;
  text: string = '';
  type: string = '';
}
</script>
<style>
  .mei-message {
  }

  .mei-message-success {
  }

  .mei-message-error {
  }

  .mei-message-warning {
  }

  .mei-message-icon {
  }

  .mei-message-con {
    line-height: 40px;
    height: 40px;
    display: inline-block;
    margin-left: 10px;
  }

  .mei-message-fade-enter-active {
    transition: all 0.3s linear;
  }

  .mei-message-fade-leave-active {
    transition: all 0.3s linear;
  }

  .mei-message-fade-enter, .mei-message-fade-leave-to
    /* .slide-fade-leave-active for below version 2.1.8 */
  {
    opacity: 0;
  }
</style>

show: boolean = false; 控制組件的顯示隱藏
text: string = ''; 組件的顯示文字
type: string = '';組件顯示類型
這是個典型的木偶組件谨设,依賴三個參數;它只負責頁面的渲染缎浇;給什么渲染什么扎拣。

control層實現(xiàn):

import Vue from 'vue';
import messageVue from '@/components/MessageBox.vue'; // 組件引入

interface Star {  ts接口聲明
  show?: boolean;
  text?: string;
  duration?: string;
  type?: string;
}

export const messageBox = (options: Star) => {
  const defaults = {
    show: false,
    text: '',
    duration: '2000',
    type: ''
  };
  const messageVueConstructor = Vue.extend(messageVue);//  實現(xiàn)組件構造
  if (Vue.prototype.$isServer) {
    return;
  }
  options = Object.assign({}, defaults, options); // 配置參數
  const parent = document.body;
  const instance = new messageVueConstructor({ // 組件的實例
    el: document.createElement('div'),
    data: options
  });
  parent.appendChild(instance.$el);// 插入頁面
  Vue.nextTick(() => {
    instance.show = true; // 修改顯示和隱藏
    setTimeout(function () {
      // (<any>instance).show=false;
      instance.show = false;
    }, options.duration);
  });
  return instance;
};

export default {
  install: vue => {
    vue.prototype.$message = messageBox; // 將message組件暴露出去,并掛載在Vue的prototype上
  }
};

首先需要我們引入組件素跺,然后通過構造實例來形成組件二蓝,通過組件的實例來控制組件的顯示和隱藏。
最后我們把實例的方法導出去亡笑;同時掛載導vue的原型侣夷;的在main.ts里面引入,通過use使用横朋。這樣我們就封裝好來一個屬于我們自己的$message

import message from './util/message';
Vue.use(message);

最后我們通過vm.$message()就可以使用了仑乌;

view層實現(xiàn)

vm.$message({type:'success',text:'xxx',duration:3333})

2. vue指令封裝 v-loading

可以實現(xiàn):添加修飾符,樣式修改琴锭,內容添加

model層

<template>
  <div v-show="visible" class="zh-loading-box" v-bind:class="{full:body}">
    <div class="flex-center">
      <div>
        <h1>加載</h1>
      </div>
      <p>{{ text }}</p>
    </div>
  </div>
</template>

<script lang='ts'>
import { Component, Vue } from 'vue-property-decorator';

@Component
export default class Load extends Vue {
  text: string = '';
  body: boolean = true;
  visible: boolean = false;
}
</script>

<style scoped>
  .zh-loading-box {
    position: absolute;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.8);
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
  }
</style>

這也是個木偶組件;對傳入的參數進行顯示晰甚;

control層

import Load from '@/components/Load.vue';

const toggleLoading = (el, binding) => {
  if (binding.modifiers.body) {
    el.instance.body = true;
  } else {
    el.instance.body = false;
  }
  if (binding.value) {
    el.instance.visible = true;
  } else {
    el.instance.visible = false;
  }
};

export default {
  install: vue => {
    vue.directive('loading', {
      bind: (el, binding) => {
        const defaults = {
          visible: false,
          body: false,
          text: el.getAttribute('loading-text')
        };
        const options = Object.assign({}, defaults);
        const LoadingCounstruct = vue.extend(Load);
        const loading = new LoadingCounstruct({
          el: document.createElement('div'),
          data: options
        });
        el.style.position = 'relative';
        el.appendChild(loading.$el);
        el.instance = loading; // el.instance是個Vue實例
        toggleLoading(el, binding);
      },
      update: (el, binding) => {
        // el.instance.setText(el.getAttribute('loading-text'));
        if (binding.oldValue !== binding.value) {
          toggleLoading(el, binding);
        }
      }
    });
  }
};

指令的實現(xiàn)是通過 vue.directive來實現(xiàn)的

Vue.directive('my-directive', {
  bind: function () {},
  inserted: function () {},
  update: function () {},
  componentUpdated: function () {},
  unbind: function () {}
})

這個是它的生命周期;鉤子函數的參數 ( el决帖、binding厕九、vnode 和 oldVnode)。

bind只調用一次地回,指令第一次綁定到元素時調用扁远。
update在指令的傳入值更新的時候實現(xiàn)。

在bind的時候通過調用組件的實例讓組件顯示刻像,同時獲取綁定標簽屬性來設置顯示的文字畅买;和設置標簽的樣式讓組件合理顯示,在處理loading顯示的時候通過獲取修飾符binding.modifiers.body细睡,來對顯示元素實現(xiàn)不通的顯示效果谷羞,

通過對update市設置,讓loading隱藏

if (binding.value) {
el.instance.visible = true;
} else {
el.instance.visible = false;
}

最后export default 出去溜徙;
在main.ts里面

import loading from './util/loading';
Vue.use(loading);

view層

<div v-loading='true'></div>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末湃缎,一起剝皮案震驚了整個濱河市犀填,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗓违,老刑警劉巖九巡,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹂季,居然都是意外死亡比庄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門乏盐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佳窑,“玉大人,你說我怎么就攤上這事父能∩翊眨” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵何吝,是天一觀的道長溉委。 經常有香客問我,道長爱榕,這世上最難降的妖魔是什么瓣喊? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮黔酥,結果婚禮上藻三,老公的妹妹穿的比我還像新娘。我一直安慰自己跪者,他們只是感情好棵帽,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渣玲,像睡著了一般逗概。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忘衍,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天逾苫,我揣著相機與錄音,去河邊找鬼枚钓。 笑死铅搓,一個胖子當著我的面吹牛,可吹牛的內容都是我干的秘噪。 我是一名探鬼主播狸吞,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蹋偏?” 一聲冷哼從身側響起便斥,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎威始,沒想到半個月后枢纠,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡黎棠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年晋渺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脓斩。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡木西,死狀恐怖,靈堂內的尸體忽然破棺而出随静,到底是詐尸還是另有隱情八千,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布燎猛,位于F島的核電站恋捆,受9級特大地震影響,放射性物質發(fā)生泄漏重绷。R本人自食惡果不足惜沸停,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昭卓。 院中可真熱鬧愤钾,春花似錦、人聲如沸葬凳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽火焰。三九已至,卻和暖如春胧沫,著一層夾襖步出監(jiān)牢的瞬間昌简,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工绒怨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纯赎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓南蹂,卻偏偏與公主長得像犬金,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容