2021-06-29 Vue 第三方組件的二次封裝

封裝第三方組件

  1. 需要自定義組件MyInput, 透傳el-input的所有事件和方法

    <template>
      <div class="input-container">
        <my-input
          v-model="inputVal"
          style="width: 50%; margin-left: 200px;"
          size="mini"
          clearable
          maxlength="5"
          ref="myInput"
        >
          <template slot="prepend">Http://</template>
          <template slot="append">.com</template>
          <i slot="suffix" class="el-input__icon el-icon-date"></i>
          <i slot="prefix" class="el-input__icon el-icon-search"></i>
        </my-input>
      </div>
    </template>
    
    <script lang="ts">
    import { Component, Vue, Ref } from "vue-property-decorator";
    import MyInput from "./MyInput.vue";
    
    @Component({
      components: {
        MyInput,
      },
    })
    export default class NavFooterComponent extends Vue {
      private inputVal = "123";
    
      @Ref('myInput')
      myInput!: any;
    
      private mounted() {
        this.myInput?.elInput.focus();
      }
    }
    </script>
    
  2. 使用第三方組件的屬性: $sttrs

    $attrs: 包含了父作用域中不作為 prop 被識(shí)別 (且獲取) 的 attribute 綁定 (class 和 style 除外)弓候。

    當(dāng)一個(gè)組件沒有聲明任何prop 時(shí),這里會(huì)包含所有父作用域的綁定 (class 和 style 除外)踩萎,并且可以通過 v-bind="$attrs" 傳入內(nèi)部組件

    <!-- myInput.vue -->
    <template>
      <div>
        <el-input v-model="input" v-bind="$attrs"></el-input>
      </div>
    </template>
    
    <script lang="ts">
    import { Component, Vue, Model, Emit, Ref } from "vue-property-decorator";
    import { Input } from "element-ui";
    
    @Component({
      name: "MyInput",
      components: {
        ElInput: Input,
      },
      inheritAttrs: false,
    })
    export default class extends Vue {
     @Model("input")
      value!: any;
      
      set input(newVal: any) {
        this.$emit("input", newVal);
      }
    
      get input() {
        return this.value;
      }
    }
    

    這還不夠,還得把inheritAttrs選項(xiàng)設(shè)置為false,為什么呢帆锋,來看一下inheritAttrs選項(xiàng)的官方定義就明白了旁仿。

    默認(rèn)情況下父作用域的不被認(rèn)作 props 的 attribute 綁定 (attribute bindings) 將會(huì)“回退”且作為普通的 HTML attribute 應(yīng)用在子組件的根元素上踏枣。當(dāng)撰寫包裹一個(gè)目標(biāo)元素或另一個(gè)組件的組件時(shí)七兜,這可能不會(huì)總是符合預(yù)期行為壤靶。通過設(shè)置 inheritAttrsfalse,這些默認(rèn)行為將會(huì)被去掉惊搏。而通過 $attrs 可以讓這些 attribute 生效,且可以通過 v-bind 顯性的綁定到非根元素上忧换。注意:這個(gè)選項(xiàng)不影響 class 和 style 綁定恬惯。

    簡單來說,把inheritAttrs設(shè)置為false亚茬,避免給myInput組件設(shè)置的屬性被添加到myInput組件的根元素div上酪耳。

    這樣設(shè)置后,在myInput組件上就可以直接使用el-input組件的屬性,不管后續(xù)el-input組件再增加了多少個(gè)屬性碗暗。

  1. 使用第三方法組件的自定義事件: $listeners

    $listeners:包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監(jiān)聽器颈将。它可以通過 v-on="$listeners" 傳入內(nèi)部組件。

    <el-input v-model="input" v-bind="$attrs" v-on="$listeners"></el-input>
    
  2. 使用第三方付組件的插槽

    <el-input v-model="input" v-bind="$attrs" v-on="$listeners" ref="elInput">
      <!-- 普通插槽 -->
      <slot v-for="(_, name) in $slots" :name="name" :slot="name" />
    
      <!--
        作用域插槽
        <template v-for="(_, name) in $scopedSlots" #[name]="scope">
         <slot :name="name" v-bind="scope" />
        </template>
      -->
    </el-input>
    
  3. 使用第三方組件的Ref

    如上代碼, 在el-inpuit上掛載屬性 ref="elInput"

    @Component({
      name: "MyInput",
      components: {
        ElInput: Input,
      },
      inheritAttrs: false,
    })
    export default class extends Vue {
      
      @Ref("elInput")
     elInput!: any;
     
     // ...
    }
    
    <template>
      <div class="input-container">
        <my-input
          v-model="inputVal"
          ref="myInput"
        >
        </my-input>
      </div>
    </template>
    
    <script lang="ts">
    import { Component, Vue, Ref } from "vue-property-decorator";
    import MyInput from "./MyInput.vue";
    
    @Component({
      components: {
        MyInput,
      },
    })
    export default class NavFooterComponent extends Vue {
      private inputVal = "123";
    
      @Ref('myInput')
      myInput!: any;
    
      private mounted() {
        // <!-- 父組件中獲取elInput實(shí)例HTMLLInputElement -->
        this.myInput?.elInput.focus();
      }
    }
    </script>
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末言疗,一起剝皮案震驚了整個(gè)濱河市晴圾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌噪奄,老刑警劉巖死姚,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異勤篮,居然都是意外死亡都毒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門碰缔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來账劲,“玉大人,你說我怎么就攤上這事金抡∑俳梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵竟终,是天一觀的道長蝠猬。 經(jīng)常有香客問我,道長统捶,這世上最難降的妖魔是什么榆芦? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮喘鸟,結(jié)果婚禮上匆绣,老公的妹妹穿的比我還像新娘。我一直安慰自己什黑,他們只是感情好崎淳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愕把,像睡著了一般拣凹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恨豁,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天嚣镜,我揣著相機(jī)與錄音,去河邊找鬼橘蜜。 笑死菊匿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跌捆,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼徽职,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了佩厚?” 一聲冷哼從身側(cè)響起姆钉,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎可款,沒想到半個(gè)月后育韩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闺鲸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年筋讨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摸恍。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悉罕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出立镶,到底是詐尸還是另有隱情壁袄,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布媚媒,位于F島的核電站嗜逻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缭召。R本人自食惡果不足惜栈顷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嵌巷。 院中可真熱鬧萄凤,春花似錦、人聲如沸搪哪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晓折。三九已至惑朦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漓概,已是汗流浹背行嗤。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垛耳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像堂鲜,于是被迫代替她去往敵國和親栈雳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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