使用class的方式创建Vue的组件,解决代码复用的问题

简介: 在Vue的项目里,创建组件是一个基本技能,Vue也提供了多种方法,比如 option API、 setup、script setup等。

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情


在Vue的项目里,创建组件是一个基本技能,Vue也提供了多种方法,比如 option API、 setup、script setup等。


如果组件里需要使用一些共用方法的话,那么可以使用 mixin、hook等方式,那么还有没有其他的方法呢?


当然可以有,这里介绍一种使用 class 解决共用代码的方法。


建立基类



我们先建立一个基类:


baseComp.js


import { ref } from 'vue'
import { store } from '@naturefw/nf-state'
export default class BaseComp {
  constructor () {
    this.name = 'baseName'
    this.inheritAttrs = false
    this.components = {} // 可以在这里注册共用组件
    this.props = { // 可以在这里设置共用属性
      baseProps: {
        type: String,
        default: '基类定义的 props'
      }
    }
    this.store = store // 设置状态,这样就不用每次都 import 了。
  }
  _setup (props, ctx) {
     // 可以设置共用成员
    const baseRef = ref('基类setup定义的')
    // 可以设置生命周期的钩子
    // 其他共用代码
    return {
      store, // 返回状态
      baseRef // 返回成员
    }
  }
}
复制代码


按照 composition API 的方式设置对象的属性,然后我们可以设置组件共用的部分:属性、组件、状态、生命周期的钩子等,还有权限验证等流程。


建立函数



然后要做一个语法糖,简化获得基类的实例的代码,以及附加组件的个性设置。


其实这里可以设置一个子类,只是想想,似乎可以直接用实例。


childComp.js


import { ref, defineComponent } from 'vue'
import BaseComp from './baseComp.js'
/**
 * 返回组件需要的属性
 * @param {*} info 
 * * name = 'baseName'
 * * inheritAttrs = false
 * * components = {}
 * * props = {}
 * * setup = () => {}
 */
const myComp = (info) => {
  // 获取基类的实例
  const comp = new BaseComp({})
  // 设置组件的 name
  if (info.name) {
    comp.name = info.name
  } else {
    comp.name += new Date().valueOf()
  }
  // 附加组件内使用的组件,可以按照不同的小分类设置
  if (info.components) {
    Object.assign(comp.components, info.components)
  }
  // 合并属性
  if (info.props) {
    Object.assign(comp.props, info.props)
  }
  // 获取父类的 setup
  const _setup = comp._setup
  // 设置 setup
  comp.setup = (props, ctx) => {
    // 执行父类的 setup
    const _re = _setup(props, ctx)
    // 可以制定子类的共用成员
    const childRef = ref('子类setup定义的')
    const _this = {
      props,
      ctx,
      store: _re.store
    }
    // 执行 组件定义的 setup,可以使用 this,也可以设置参数。
    const _re2 = (info.setup) ? info.setup.call(_this): {}
    const _re3 = _re2 ?? {}
    // 返回给 template 
    return {
      childRef,
      ..._re,
      ..._re3
    }
  }
  // 返回组件需要的各种属性
  return defineComponent(comp)
}
复制代码


在组件里的使用方式



在组件里引入上面的函数,设置 setup 即可,当然也可以设置props等。


import childComp from './childComp.js'
export default childComp({
  setup: (props, ctx, store) => {
    // 可以有 this,也可以使用参数,看个人喜欢。
    this.store.user.name = '修改一下用户名称'
    return {}
  }
})
复制代码


props, ctx 是默认属性,后面的是基类里提供的共用数据、方法等。


可以用参数传递,也可以用 this 的方式传递。


根据不同的需求,设置不同的子类



面向对象嘛,父类、子类、子子类,为啥要设置这么多呢?当然是为了灵活,如果一个基类就可以搞定的话,那么肯定不需要设置各种子类的。


所以,我们可以根据项目的需求,设置不同的子类,存放不同的共用函数。


小结



基本就是这样了,目前还只是一个基础的想法,至于有多大的实际意义嘛,等以后慢慢验证。


好吧,其实我还是喜欢组合的方式。然后对“页面”进行一下抽象,其实雷同的组件也就不多了。


相关文章
|
2月前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
147 1
|
6天前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
10天前
|
监控 JavaScript 前端开发
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
60 12
|
6天前
|
JavaScript 前端开发 开发者
Vue中的class和style绑定
在 Vue 中,class 和 style 绑定是基于数据驱动视图的强大功能。通过 class 绑定,可以动态更新元素的 class 属性,支持对象和数组语法,适用于普通元素和组件。style 绑定则允许以对象或数组形式动态设置内联样式,Vue 会根据数据变化自动更新 DOM。
|
6天前
|
JavaScript 前端开发 数据安全/隐私保护
Vue Router 简介
Vue Router 是 Vue.js 官方的路由管理库,用于构建单页面应用(SPA)。它将不同页面映射到对应组件,支持嵌套路由、路由参数和导航守卫等功能,简化复杂前端应用的开发。主要特性包括路由映射、嵌套路由、路由参数、导航守卫和路由懒加载,提升性能和开发效率。安装命令:`npm install vue-router`。
|
27天前
|
JavaScript 安全 API
iframe嵌入页面实现免登录思路(以vue为例)
通过上述步骤,可以在Vue.js项目中通过 `iframe`实现不同应用间的免登录功能。利用Token传递和消息传递机制,可以确保安全、高效地在主应用和子应用间共享登录状态。这种方法在实际项目中具有广泛的应用前景,能够显著提升用户体验。
54 8
|
28天前
|
存储 设计模式 JavaScript
Vue 组件化开发:构建高质量应用的核心
本文深入探讨了 Vue.js 组件化开发的核心概念与最佳实践。
74 1
|
2月前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
3月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
73 8
|
存储 前端开发 JavaScript
为什么我不再用Vue,改用React?
当我走进现代前端开发行业的时候,我做了一个每位开发人员都要做的决策:选择一个合适的框架。当时正逢 jQuery 被淘汰,前端开发者们不再用它编写难看的、非结构化的老式 JavaScript 程序了。

热门文章

最新文章