Vue3實(shí)現(xiàn)組件級基類的幾種方法

Vue3的組件有三種代碼組織方式

  1. 純Option API (不含setup)
  2. option API + setup
  3. 純 setup (即composition API)

對于這三種形式,設(shè)置基類的方法也略有不同工闺。

使用 mixins聊替、extends

vue3提供了 mixins和extends蕉毯,但是嘗試之后發(fā)現(xiàn)這兩種方法只支持純OptionAPI第煮,設(shè)置的data會被識別健爬,但是設(shè)置的setup里return 的 reactive佩耳,完全無效砂竖,setup也沒有被執(zhí)行真椿。
所以這種方式只能使用于第一種方式。

使用 hooks (function乎澄、class)

既然官方?jīng)]有提供突硝,那么我們自己來想想辦法。我們先觀察一下組件的代碼(第二種情況):

<template>
  <!--模板-->
  舉例
</template>

<script lang="ts">
  import { defineComponent } from 'vue'

  export default defineComponent({
    name: 'ui-core-',
    components: {
      // 注冊共用組件
    },
    props: {
      // 定義共用屬性
    },
    setup(props, context) {
      // 各種共用操作
      _logger()
      _setTitle()
      // 共用成員
      const foo = reactive ({})
      return {
        foo
      }
    }
  })
</script>

defineComponent 方法接收一個對象置济,對象需要有特定的幾個屬性解恰,比如name、components浙于、props护盈、setup等。
那么也就是說羞酗,我們可以做一個函數(shù)返回這樣的對象即可腐宋。
比如我們先建立一個js(或則ts)文件:

export function base (name, callback) {
  return {
    name: 'ui-' + name,
    components: {
      // 注冊共用組件
    },
    props: {
      // 定義共用屬性
    },
    setup(props, context) {
      // 各種共用操作
      _logger()
      _setTitle()
      // 共用成員
      const foo = reactive ({})

      // 執(zhí)行其他操作
      const re = callback(props, context)
      return {
        foo,
        ...re
      }
    }
  }
}

有點(diǎn)像模板模式。

傳入name和一個回調(diào)函數(shù),props, context作為參數(shù)進(jìn)行傳遞胸竞。內(nèi)部成員也可以作為參數(shù)傳遞欺嗤。
這樣一個簡單的基類就做成了,如果你覺得function不好看卫枝,那么可以換成class煎饼。

export default class BaseComponent {
  name: string
  components: any
  props: any
  setup: any

  constructor (name: string, callback: (props: any, context: any) => any) {
    this.name = name
    this.components = {}
    this.props = {}
    this.setup = (props: any, context: any) => {
      // 各種共用操作
      _logger()
      _setTitle()

      // 執(zhí)行其他操作
      const re = callback(props, context)

      return {
        ...re
      }
    }
    
  }
}

有了class之后,還可以設(shè)置子類校赤,不過感覺有點(diǎn)繁瑣吆玖。總之痒谴,反正可以實(shí)現(xiàn)就對了衰伯。

script setup怎么辦

上述這種方法應(yīng)該也是可以支持純composition API的铡羡,但是有點(diǎn)小問題积蔚,defineProps 和 defineEmits 并不是普通 js 函數(shù),而是一種“宏”烦周。
引用官網(wǎng)的解釋:

defineProps 和 defineEmits 都是只能在 <script setup> 中使用的編譯器宏尽爆。他們不需要導(dǎo)入,且會隨著 <script setup> 的處理過程一同被編譯掉读慎。
也就是說 defineXXX系列 只有在 <script setup> 標(biāo)簽內(nèi)部才會被識別漱贱,如果在單獨(dú)的js文件里面,不會被識別夭委。

這就導(dǎo)致 defineProps 和 defineEmits 無法做成基類的形式幅狮。
如果需要的基類不涉及 defineProps 和 defineEmits 的話,那么還是可以在單獨(dú)的js文件里面定義一個function或者class的株灸,(即做一個綜合的hooks)崇摄。

如果涉及 defineProps 和 defineEmits,那么慌烧,我也沒想出來辦法逐抑。(只能第二種方式)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屹蚊,隨后出現(xiàn)的幾起案子厕氨,更是在濱河造成了極大的恐慌,老刑警劉巖汹粤,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件命斧,死亡現(xiàn)場離奇詭異,居然都是意外死亡嘱兼,警方通過查閱死者的電腦和手機(jī)冯丙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胃惜,你說我怎么就攤上這事泞莉。” “怎么了船殉?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵鲫趁,是天一觀的道長。 經(jīng)常有香客問我利虫,道長挨厚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任糠惫,我火速辦了婚禮疫剃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘硼讽。我一直安慰自己巢价,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布固阁。 她就那樣靜靜地躺著壤躲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪备燃。 梳的紋絲不亂的頭發(fā)上碉克,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音并齐,去河邊找鬼漏麦。 笑死,一個胖子當(dāng)著我的面吹牛况褪,可吹牛的內(nèi)容都是我干的撕贞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼窝剖,長吁一口氣:“原來是場噩夢啊……” “哼麻掸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赐纱,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤脊奋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疙描,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诚隙,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年起胰,在試婚紗的時候發(fā)現(xiàn)自己被綠了久又。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巫延。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖地消,靈堂內(nèi)的尸體忽然破棺而出炉峰,到底是詐尸還是另有隱情,我是刑警寧澤脉执,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布疼阔,位于F島的核電站,受9級特大地震影響半夷,放射性物質(zhì)發(fā)生泄漏婆廊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一巫橄、第九天 我趴在偏房一處隱蔽的房頂上張望淘邻。 院中可真熱鬧,春花似錦湘换、人聲如沸宾舅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贴浙。三九已至砂吞,卻和暖如春署恍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜻直。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工盯质, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人概而。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓呼巷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赎瑰。 傳聞我的和親對象是個殘疾皇子王悍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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