经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
Vue3实现组件级基类的几种方法
来源:cnblogs  作者:金色海洋(jyk)  时间:2023/4/28 9:26:51  对本文有异议

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

  1. 纯Option API (不含setup)
  2. option API + setup
  3. 纯 setup (即composition API)

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

使用 mixins、extends

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

使用 hooks (function、class)

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

  1. <template>
  2. <!--模板-->
  3. 举例
  4. </template>
  5. <script lang="ts">
  6. import { defineComponent } from 'vue'
  7. export default defineComponent({
  8. name: 'ui-core-',
  9. components: {
  10. // 注册共用组件
  11. },
  12. props: {
  13. // 定义共用属性
  14. },
  15. setup(props, context) {
  16. // 各种共用操作
  17. _logger()
  18. _setTitle()
  19. // 共用成员
  20. const foo = reactive ({})
  21. return {
  22. foo
  23. }
  24. }
  25. })
  26. </script>

defineComponent 方法接收一个对象,对象需要有特定的几个属性,比如name、components、props、setup等。
那么也就是说,我们可以做一个函数返回这样的对象即可。
比如我们先建立一个js(或则ts)文件:

  1. export function base (name, callback) {
  2. return {
  3. name: 'ui-' + name,
  4. components: {
  5. // 注册共用组件
  6. },
  7. props: {
  8. // 定义共用属性
  9. },
  10. setup(props, context) {
  11. // 各种共用操作
  12. _logger()
  13. _setTitle()
  14. // 共用成员
  15. const foo = reactive ({})
  16. // 执行其他操作
  17. const re = callback(props, context)
  18. return {
  19. foo,
  20. ...re
  21. }
  22. }
  23. }
  24. }

有点像模板模式。

传入name和一个回调函数,props, context作为参数进行传递。内部成员也可以作为参数传递。
这样一个简单的基类就做成了,如果你觉得function不好看,那么可以换成class。

  1. export default class BaseComponent {
  2. name: string
  3. components: any
  4. props: any
  5. setup: any
  6. constructor (name: string, callback: (props: any, context: any) => any) {
  7. this.name = name
  8. this.components = {}
  9. this.props = {}
  10. this.setup = (props: any, context: any) => {
  11. // 各种共用操作
  12. _logger()
  13. _setTitle()
  14. // 执行其他操作
  15. const re = callback(props, context)
  16. return {
  17. ...re
  18. }
  19. }
  20. }
  21. }

有了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,那么,我也没想出来办法。(只能第二种方式)

原文链接:https://www.cnblogs.com/jyk/p/17360859.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号