Vue3 复用代码

这篇具有很好参考价值的文章主要介绍了Vue3 复用代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在vue2中代码复用一般是 mixins 混入来实现但使用 mixins 进行代码复用会有一些问题

vue3虽然对 mixins 进行了保留但不再推荐使用。

mixins 问题

不清晰的数据来源:当使用了多个 mixin 时,实例上的数据属性来自哪个 mixin 变得不清晰,这使追溯实现和理解组件行为变得困难。

命名空间冲突:多个来自不同作者的 mixin 可能会注册相同的属性名,造成命名冲突。

隐式的跨 mixin 交流:多个 mixin 需要依赖共享的属性名来进行相互作用,这使得它们隐性地耦合在一起。

当然这些问题对于的程序员来说都是可以避免的,但最好的方法是换一种更好的方式。

在 vue3 中复用代码

目前作者的认知里写 sfc 进行代码复用依然需要使用 mixins 来实现。

所以这里说的是使用 Composition API 组织代码的情况下(vue2.7 也已经支持)

先了解下什么是组合式 API?

组合式 API (Composition API) 是一系列 API 的集合,使我们可以使用函数而不是声明选项的方式书写 Vue 组件。它是一个概括性的术语,涵盖了以下方面的 API:

  • 响应式 API:例如 ref() 和 reactive(),使我们可以直接创建响应式状态、计算属性和侦听器。

  • 生命周期钩子:例如 onMounted() 和 onUnmounted(),使我们可以在组件各个生命周期阶段添加逻辑。

  • 依赖注入:例如 provide() 和 inject(),使我们可以在使用响应式 API 时,利用 Vue 的依赖注入系统。

这段话完全来自官网 更多的内容还是需要看官网

为什么要有组合式 API?

这里官方文档列出了几点:更好的逻辑复用 、更灵活的代码组织 、更好的类型推导 、更小的生产包体积。这里已经出现了本文关注的重点即 更好的逻辑复用 我们来看下官方的说明

组合式 API 最基本的优势是它使我们能够通过组合函数来实现更加简洁高效的逻辑复用。在选项式 API 中我们主要的逻辑复用机制是 mixins,而组合式 API 解决了 mixins 的所有缺陷。

两个结论 1. 组合式 API 解决了mixins 的所有缺陷 2. 能够通过组合函数来实现更加简洁高效的逻辑复用。

什么是“组合式函数” ?

在 Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。

一般会以 use 开头进行函数命名,放到 composables 目录中,其他约定。

组合函数内部可以使用 组合式api,一个组合式函数可以调用一个或多个其他的组合式函数。

这使得我们可以像使用多个组件组合成整个应用一样,用多个较小且逻辑独立的单元来组合形成复杂的逻辑。

当时我看到这里时候其实有个疑问 为什么要强调是有状态逻辑的函数(有状态函数是指函数内部有自己的状态更改),这个问题先留着,看完代码示例自会理解。

一个例子

抽离后台管理列表共用的逻辑,示例只是列表相关逻辑封装,你甚至可以将增删改查的逻辑封装进去。

usePage.js

import { reactive, ref } from 'vue'
// 一个用于重置对象字段为原始值的函数
import { resetObjToPrimitiveType } from '@/utils/tool'

/**
 * @description usePage 接收一个 opts 参数,返回列表所需数据
 * @param {Object} opts.searchForm - 默认查询参数
 * @param {Function} opts.getListApi  - 获取列表数据的接口
 * @param {Function} opts.customQueryParameters  - 自定义查询参数
 * @param {Function} opts.getListFunc  - 执行完 getList 成功后执行的逻辑 有一个opts参数
 * @param {Function} opts.resetFunc  - 执行完 reset 后执行的逻辑
 * @param {Function} opts.sizeChangeFunc  - 执行完 sizeChange 后执行的逻辑
 * @param {Function} opts.currentChangeFunc  - 执行完 currentChange 后执行的逻辑
 */
export const usePage = (opts) => {
  // searchForm 由外部传入,内部传入导出的数据无法推导类型即无法知道对象里有什么也会失去代码提示
  const {
    searchForm = {},
    getListApi,
    customQueryParameters = () => {},
    getListFunc = (opts) => {},
    resetFunc = () => {},
    sizeChangeFunc = () => {},
    currentChangeFunc = () => {}
  } = opts

  const reset = () => {
    Object.assign(searchForm, resetObjToPrimitiveType(searchForm))
    resetFunc()
    handleCurrentChange(1)
  }

  const page = reactive({
    pageSize: 10,
    pageNo: 1,
    total: 0
  })

  const tableData = ref([])
  const getList = () => {
    const opts = {
      ...page,
      ...searchForm,
      ...customQueryParameters()
    }

    getListApi(opts).then((res) => {
      if (res.code === 0) {
        tableData.value = res.data?.rows || []
        page.total = res.data?.total || 0

        getListFunc(opts)
      }
    })
  }

  const handleSizeChange = (size) => {
    page.pageSize = size
    sizeChangeFunc()
    getList()
  }

  const handleCurrentChange = (cur) => {
    page.pageNo = cur
    currentChangeFunc()
    getList()
  }

  return {
    searchForm,
    reset,
    page,
    tableData,
    handleSizeChange,
    handleCurrentChange
  }
}

组件内使用

import { reactive, ref, computed } from 'vue'
import { usePage } from '@/composables/usePage'
import testModel from '@/model/test'

// 查询参数
const searchForm = reactive({
  createEndTime: '',
  createStartTime: ''
})

// 接收 查询参数、获取列表的接口 返回 列表所需要的数据、分页参数、分页函数等
const { reset, page, tableData, handleSizeChange, handleCurrentChange } = usePage({
  searchForm,
  getListApi: testModel.getList
})

// 首次获取数据使用 reset方式即可 tableData 的数据自动更新
reset()

组合式函数其实就是一个函数接收一些参数返回一些东西,将逻辑进行封装、共用。

如果函数依赖 store、router 等

import {useStore} from 'vuex'
import {computed} from 'vue'

export const useTest = () => {
    // 获取store
  const store = useStore()
  
  const getOrgById = (id) => {
      // 使用
    const orgObj = computed(() => store.state.orgObj)
    return orgObj.value[id]
  }

  return {
    getOrgById
  }
}

总结

说明 vue2 使用 mixins 进行代码复用所带来的问题,引出了vue3如何进行代码复用。

介绍 组合式 API (Composition API) 以及为什么需要 组合式 API, 什么是 组合式函数 通过一个例子让大家了解了 组合式函数 的用法。

Composition API 与 组合式函数 用来解决 vue2 mixins 带来的问题只是附带,它可以做更多做的更好。文章来源地址https://www.toymoban.com/news/detail-469395.html

到了这里,关于Vue3 复用代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp开发中基于vue的混入(mixin) 实现微信小程序全局【发送给朋友】、【分享到朋友圈】、【复制链接】

    一、在开发微信小程序的时候,发现【发送给朋友】、【分享到朋友圈】、【复制链接】功能,灰色不可用。 很常见的功能,但是这几个功能,并不是你项目建起来了就有的。 1.【发送给朋友】使用 onShareAppMessage 这个方法 如果你的小程序,发现他的【转发给朋友】的按钮时

    2024年01月17日
    浏览(67)
  • Vue.js 中的 mixin 和混入有什么区别?

    在 Vue.js 中,mixin 和混入是两个常用的概念,它们可以帮助我们实现代码的复用和组件间的通信。虽然它们的名字很相似,但它们的作用和用法有所不同。本文将介绍 mixin 和混入的区别,并通过代码示例来说明它们的用法。 mixin 是一种在 Vue.js 中实现代码复用的方式。它类似

    2024年02月09日
    浏览(41)
  • Vue(标签属性:ref、配置项:props、混入mixin、插件、样式属性:scroped)

    前面提及到了标签属性:keys 这里将了解ref:打标识 正常布置脚手架并创建入口文件main.js引入组件 给一个按钮获取上方的dom的方法,方法中使用什么进行获取dom元素 是使用获取id方法给标签设置id,直接操作dom?  错误❌ 既然原生js可以给dom添加id,那么Vue也有类似的标识方

    2024年02月02日
    浏览(35)
  • Vue入门六(前端路由的概念与原理|Vue-router简单使用|登录跳转案例|scoped样式|混入(mixin)|插件)

    路由(英文:router)就是对应关系 SPA指的是一个web网站只有一个唯一的一个HTML页面, 所有组件的展示与切换 都在唯一的一个页面内完成。 此时, 不同组件之间的切换 需要通过 前端路由 来实现 总结:在SPA项目中, 不同功能之间的切换 ,要 依赖于前端路由 来完成 通俗移动

    2024年01月22日
    浏览(46)
  • Vue3 复用代码

    在vue2中代码复用一般是 mixins 混入来实现但使用  mixins  进行代码复用会有一些问题 vue3虽然对  mixins  进行了保留但不再推荐使用。 不清晰的数据来源 :当使用了多个 mixin 时,实例上的数据属性来自哪个 mixin 变得不清晰,这使追溯实现和理解组件行为变得困难。 命名空间

    2024年02月07日
    浏览(32)
  • vue3使用钩子代替mixins

    自用笔记 在vue2中,mixins可以用来混入一些复用的函数,变量等等,在vue3版本中,特别是组合式的写法之中可以用钩子的方式来代替这一功能。 写一个复用的控制盒子展示或者隐藏的钩子useOpen 钩子中创建了一个ref变量,并创建了一个改变该变量的方法,然后return了出来 下面

    2024年02月14日
    浏览(41)
  • Vue Mixin 代码重用与逻辑共享

    在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使我们能够更轻松地构建出优雅而高效的Web应用程序。

    2024年01月17日
    浏览(49)
  • vue3+elementPlus:el-drawer新增修改弹窗复用

    在el-drawer的属性里设置:title属性,和重置函数 上一篇文章,  uniapp踩坑之项目:使用过滤器将时间格式化为特定格式_uniapp过滤器-CSDN博客 文章浏览阅读446次。uniapp踩坑之项目:使用过滤器将时间格式化为特定格式,利用filters过滤器对数据直接进行格式化,注意:与method、

    2024年02月03日
    浏览(46)
  • uniapp-vue3语法实现小程序全局分享(setup,mixin)

    随着vue3的普及uniapp官方也支持了vue3语法的编写 相信大家在开发过程中肯定碰到过小程序所有页面都要开启分享功能的需求;指定的页面(如:文章详情页)有单独的配置,而非单独配置的页面(如:付费的订单详情页)都是统一跳转到首页 我的做法如下: 此时小程序所有页的分

    2024年01月21日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包