欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2023年04月28日 08:37:15   作者:金色海洋(jyk)  
vue3提供了 mixins和extends,但是嘗試之后發(fā)現(xiàn)這兩種方法只支持純OptionAPI,設(shè)置的data會被識別,但是設(shè)置的setup里return 的 reactive,完全無效,setup也沒有被執(zhí)行,這篇文章主要介紹了Vue3實現(xiàn)組件級基類的幾種方法,需要的朋友可以參考下

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

  • 純Option API (不含setup)
  • option API + setup
  • 純 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
      }
    }
  }
}

有點像模板模式。

傳入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è)置子類,不過感覺有點繁瑣??傊?,反正可以實現(xiàn)就對了。

script setup怎么辦

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

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

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

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

到此這篇關(guān)于Vue3實現(xiàn)組件級基類的幾種方法的文章就介紹到這了,更多相關(guān)Vue3組件級基類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue打開子組件彈窗都刷新功能的實現(xiàn)

    vue打開子組件彈窗都刷新功能的實現(xiàn)

    這篇文章主要介紹了vue打開子組件彈窗都刷新功能的實現(xiàn),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Vue中 v-if/v-show/插值表達(dá)式導(dǎo)致閃現(xiàn)的原因及解決辦法

    Vue中 v-if/v-show/插值表達(dá)式導(dǎo)致閃現(xiàn)的原因及解決辦法

    在開發(fā)過程中經(jīng)常會發(fā)現(xiàn)當(dāng)頁面明明不應(yīng)該出現(xiàn)的元素或內(nèi)容會閃現(xiàn)一下然后消失,這篇文章給大家分享Vue中 v-if/v-show/插值表達(dá)式導(dǎo)致閃現(xiàn)的原因及解決辦法,一起看看吧
    2018-10-10
  • vue-quill-editor 自定義工具欄和自定義圖片上傳路徑操作

    vue-quill-editor 自定義工具欄和自定義圖片上傳路徑操作

    這篇文章主要介紹了vue-quill-editor 自定義工具欄和自定義圖片上傳路徑操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue3+TS+Vant3+Pinia(H5端)配置教程詳解

    Vue3+TS+Vant3+Pinia(H5端)配置教程詳解

    這篇文章主要介紹了Vue3+TS+Vant3+Pinia(H5端)配置教程詳解,需要的朋友可以參考下
    2023-01-01
  • 解決vue-cli webpack打包開啟Gzip 報錯問題

    解決vue-cli webpack打包開啟Gzip 報錯問題

    這篇文章主要介紹了vue-cli webpack打包開啟Gzip 報錯問題的解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • vue3+ts使用APlayer的示例代碼

    vue3+ts使用APlayer的示例代碼

    這篇文章主要介紹了vue3+ts使用APlayer的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 淺談vue中組件綁定事件時是否加.native

    淺談vue中組件綁定事件時是否加.native

    今天小編就為大家分享一篇淺談vue中組件綁定事件時是否加.native,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue element el-transfer增加拖拽功能

    vue element el-transfer增加拖拽功能

    這篇文章主要介紹了vue element el-transfer增加拖拽功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • vue項目引入百度地圖BMapGL鼠標(biāo)繪制和BMap輔助工具

    vue項目引入百度地圖BMapGL鼠標(biāo)繪制和BMap輔助工具

    這篇文章主要為大家介紹了vue項目引入百度地圖BMapGL鼠標(biāo)繪制和BMap輔助工具的踩坑分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • element-ui動態(tài)添加表單項并實現(xiàn)事件觸發(fā)驗證代碼示例

    element-ui動態(tài)添加表單項并實現(xiàn)事件觸發(fā)驗證代碼示例

    這篇文章主要給大家介紹了關(guān)于element-ui動態(tài)添加表單項并實現(xiàn)事件觸發(fā)驗證的相關(guān)資料,其實就是利用了vue的v-for循環(huán)渲染,通過添加數(shù)組實現(xiàn)動態(tài)添加表單項,需要的朋友可以參考下
    2023-12-12

最新評論