环球信息:Vue3实现组件级基类的几种方法

2023-04-28 08:47:32 | 来源:博客园

Vue3的组件有三种代码组织方式

纯Option API (不含setup)option API + setup纯 setup (即composition API)

对于这三种形式,设置基类的方法也略有不同。


(资料图片仅供参考)

使用 mixins、extends

vue3提供了 mixins和extends,但是尝试之后发现这两种方法只支持纯OptionAPI,设置的data会被识别,但是设置的setup里return 的 reactive,完全无效,setup也没有被执行。所以这种方式只能使用于第一种方式。

使用 hooks (function、class)

既然官方没有提供,那么我们自己来想想办法。我们先观察一下组件的代码(第二种情况):

<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实现组件级基类的几种方法

环球快讯:国防部:美方行径严重影响多边军控、防扩散与裁军进程

Adobe Illustrator cs5怎样制作文字长投影?Adobe Illustrator cs5制作文字长投影的方法_焦点热闻

全球微头条丨一期计划今年下半年通车!从埔高速顺利完成标准路段建设

【环球报资讯】联赢激光(688518):4月27日北向资金增持5.83万股

今日zn相对原子质量等于_zn相对原子质量|全球热议

【当前独家】《如龙7外传 无名之龙》夜店女郎出演者发表:5位女郎美艳无比

满足消费者新家装需求,京东家电家居携手海尔智家在AWE推出数款趋势新品

环球要闻:快讯 | 歌力思2023年一季度净利润增长0.39%,营收增长5.99%

天天视点!河南省2023年高级经济师考试费用及缴费时间

中国卫通2022年净利润增长61% 经营指标再创新高

【全球快播报】汪玉琼任甘孜州人民政府副州长

影响增溶的因素有_影响边坡稳定的因素有哪些

广州市白云区金沙街举办“化妆实战技巧”公益培训班

【环球热闻】中国人寿(02628.HK)拟9.99亿元认购国寿投资设立的股权投资计划

最新新闻

环球信息:Vue3实现组件级基类的几种方法

环球快讯:国防部:美方行径严重影响多边军控、防扩散与裁军进程

Adobe Illustrator cs5怎样制作文字长投影?Adobe Illustrator cs5制作文字长投影的方法_焦点热闻

全球微头条丨一期计划今年下半年通车!从埔高速顺利完成标准路段建设

【环球报资讯】联赢激光(688518):4月27日北向资金增持5.83万股

今日zn相对原子质量等于_zn相对原子质量|全球热议

【当前独家】《如龙7外传 无名之龙》夜店女郎出演者发表:5位女郎美艳无比

满足消费者新家装需求,京东家电家居携手海尔智家在AWE推出数款趋势新品

环球要闻:快讯 | 歌力思2023年一季度净利润增长0.39%,营收增长5.99%

天天视点!河南省2023年高级经济师考试费用及缴费时间

中国卫通2022年净利润增长61% 经营指标再创新高

【全球快播报】汪玉琼任甘孜州人民政府副州长

影响增溶的因素有_影响边坡稳定的因素有哪些

广州市白云区金沙街举办“化妆实战技巧”公益培训班

【环球热闻】中国人寿(02628.HK)拟9.99亿元认购国寿投资设立的股权投资计划

期货空单是什么意思

【全球新要闻】揭秘史上五大美艳且贤慧的皇后,娶妻当如此也

今年吐鲁番市第四期“火洲大讲堂”开讲_全球看点

失败的赛季?布登:失望、沮丧、受伤 但我不会用失败这个词

电投能源:一季度归母净利润16.17亿元,同比增长6.96%

科信技术董秘回复:2022年度公司业绩变动原因为:1、第四季度海外客户项目建设趋缓导致提货延迟_环球新消息

毛孔收缩水的正确用法_毛孔收缩水怎么用 天天头条

全球新资讯:大美重庆·就在家门口丨这个“五一”,总要来看熊猫天团“四喜丸子”吧

表示生气的成语100个图片_表示生气的成语 环球热讯

【世界时快讯】紧盯各类施工现场,全力消除火灾隐患

方剂的配伍方法_关于方剂的配伍方法介绍|热推荐

像素是什么意思分辨率是什么意思 像素是什么意思-世界微头条

群众“堵心事”成为代表“操心事”——王益区王家河街道南雷村人大代表联络站解决群众提出排水渠改造的建议

环球即时看!如何避免汽车抵押套路?从签订合同、选择平台、提前还款深入分析

厨房的台面用什么材料好(厨房天然台面如何保养)-全球微动态