中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue3怎么實現組件級基類

發布時間:2023-04-28 10:42:16 來源:億速云 閱讀:119 作者:iii 欄目:開發技術

這篇“Vue3怎么實現組件級基類”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Vue3怎么實現組件級基類”文章吧。

使用 mixins、extends

vue3提供了 mixins和extends,但是嘗試之后發現這兩種方法只支持純OptionAPI,設置的data會被識別,但是設置的setup里return 的 reactive,完全無效,setup也沒有被執行。
所以這種方式只能使用于第一種方式。

使用 hooks (function、class)

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

<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等。
那么也就是說,我們可以做一個函數返回這樣的對象即可。
比如我們先建立一個js(或則ts)文件:

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

有點像模板模式。

傳入name和一個回調函數,props, context作為參數進行傳遞。內部成員也可以作為參數傳遞。
這樣一個簡單的基類就做成了,如果你覺得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()
      // 執行其他操作
      const re = callback(props, context)
      return {
        ...re
      }
    }
  }
}

有了class之后,還可以設置子類,不過感覺有點繁瑣。總之,反正可以實現就對了。

script setup怎么辦

上述這種方法應該也是可以支持純composition API的,但是有點小問題,defineProps 和 defineEmits 并不是普通 js 函數,而是一種“宏”。
引用官網的解釋:

defineProps 和 defineEmits 都是只能在 <script setup> 中使用的編譯器宏。他們不需要導入,且會隨著 <script setup> 的處理過程一同被編譯掉。
也就是說 defineXXX系列 只有在 <script setup> 標簽內部才會被識別,如果在單獨的js文件里面,不會被識別。

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

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

以上就是關于“Vue3怎么實現組件級基類”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平阴县| 紫云| 武宁县| 保德县| 黄大仙区| 卓尼县| 射洪县| 拉孜县| 中方县| 扶绥县| 杭锦旗| 淮滨县| 若尔盖县| 房山区| 偃师市| 勐海县| 贺兰县| 开原市| 临清市| 略阳县| 宁强县| 南岸区| 岳阳市| 广昌县| 江阴市| 页游| 日喀则市| 昭通市| 珠海市| 清徐县| 英吉沙县| 沾益县| 甘南县| 荃湾区| 确山县| 方正县| 通渭县| 诏安县| 镇原县| 涡阳县| 湄潭县|