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}from...来自于 2024-03-31 19:01:3201304学习如何获取CSS.registerProperty()的属性值 我通过CSS.registerProperty方法注册了一个属性。问题是,当我加载相同的组件时,会抛出DOMException异常,因为这样的属性已经存在。我正在寻找一种方法来判断...来自于 2024-03-30 22:12:3301275