vue3提供了mixins和extends,但是嘗試之後發現這兩種方法只支援純OptionAPI,設定的data會被識別,但是設定的setup裡return 的reactive,完全無效,setup也沒有被執行。
所以這種方式只能用在第一種方式。
既然官方沒有提供,那麼我們自己來想想辦法。我們先觀察一下元件的程式碼(第二種情況):
<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之後,還可以設定子類,但感覺有點繁瑣。總之,反正可以實現就對了。
上述這種方法應該也是可以支援純composition API的,但是有點小問題,defineProps 和defineEmits 並不是普通js 函數,而是一種「巨集」 。
引用官網的解釋:
defineProps 和 defineEmits 都是只能在
作者最新文章
2024-10-13 11:44:01 2024-10-13 09:56:31 2024-10-11 20:58:41 2024-10-11 16:53:11 2024-10-11 11:54:51 2024-10-10 16:21:01 2024-10-10 15:18:02 2024-10-10 13:34:01 2024-10-10 13:26:26 2024-10-10 11:38:42最新問題解決Vue3 webcomponents生產建置問題 我正在嘗試將我的vue2web元件遷移到vue3,儘管當我為生產建立建置時問題就出現了。我將vue-cli與--targetwc一起使用,它現在顯示一個錯誤,指出vue3Web元件...來自於 2024-04-06 12:43:3701473Vite / Vue 3:使用圖像來源作為道具時'未定義要求” 我從VueCLI切換到ViteCLI,從Vue3的CompositionAPI切換到SFCScriptsetupAPI。它以前對我來說是如何工作的當我使用官方VueCLI時,我可以...來自於 2024-04-06 09:50:2501353限制折疊手風琴段的高度 Bootstrap 5 Vue3 我正在使用Vue3和bootstrap5建立一個網頁應用程式。但我認為這個問題只涉及bootstrap。我想要做的是限制折疊的手風琴段的高度,這樣當其內容很長時,它不會將其他段踢得...來自於 2024-03-31 21:56:5401332Vue3.js )錯誤:找不到模組'firebase” 我第一次在vue.js中使用firebase。使用npm安裝firebase後,我將其添加到main.js中,如下所示。 //main.jsimport{createApp}fro...來自於 2024-03-31 19:01:3201304學習如何取得CSS.registerProperty()的屬性值 我透過CSS.registerProperty方法註冊了一個屬性。問題是,當我載入相同的元件時,會拋出DOMException異常,因為這樣的屬性已經存在。我正在尋找一種方法來判斷...來自於 2024-03-30 22:12:3301275