当前位置: 首页 > news >正文

封装hook函数【便于复用】

目录

  • 一般函数封装
  • 封装hook函数

一般函数封装

普通的删除逻辑封装函数—子组件点击删除-通过 defineEmits 通知父组件(自定义事件)进行删除

const deleteLoading = ref(false)
const emits = defineEmits<{(e: 'click-delete', id: string): void
}>()
const deleteConsultOrder = async (item: ConsultOrderItem) => {try {deleteLoading.value = trueawait deleteOrder(item.id)showSuccessToast('删除成功')emits('click-delete', item.id)} catch (error) {showFailToast('删除失败')} finally {deleteLoading.value = false}
}

父组件ConsultItem.vue

<div class="foot" v-if="item.status === OrderType.ConsultComplete"><consult-more :disabled="!item.prescriptionId" @on-delete="deleteConsultOrder(item)"@on-preview="onShowPrescription(item.prescriptionId)"></consult-more>
</div>

子组件ConsultMore.vue

<template><div class="more"><van-popover placement="top-start" v-model:show="showPopover" :actions="actions" @select="onSelect"><template #reference> 更多 </template> </van-popover></div>
</template><script setup lang="ts">
import { computed, ref } from 'vue'
import { showConfirmDialog } from 'vant'const props = defineProps<{disabled: boolean
}>()
const showPopover = ref(false)
const actions = computed(() => [{ text: '查看处方', disabled: props.disabled },{ text: '删除订单' },
])const emit = defineEmits<{(e: 'on-delete'): void(e: 'on-preview'): void
}>()const onSelect = (actions: { text: string }, index: number) => {console.log(index, 9090);if (index === 0) {emit('on-preview')}if (index === 1) {emit('on-delete')}
};
</script>

封装hook函数

src/composable/index.ts

①封装hook函数
模板:

// 封装逻辑,规范 useXxx,表示使用某功能
export const useFollow = (cb: () => void) => {
const xxx = () => {}
return { xxx }
}
②调用hook函数
模板:
const emits = defineEmits<{
(e: 'click-delete', id: string): void
}>()
const { xxx } = usexxx(() => {
emits('click-delete', props.item.id)
})

import { ref } from 'vue'
import { followOrUnfollow, getPrescriptionOrder, cancelOrder, deleteOrder } from '@/services/consult'
import type { FollowType, ConsultOrderItem } from '@/types/consult'
import { showImagePreview, showFailToast, showSuccessToast } from 'vant';
import { OrderType } from '@/enums'
import { defineEmits } from 'vue'// 封装逻辑,规范 useXxx,表示使用某功能
export const useFollow = (type: FollowType = 'doc') => {const loading = ref(false)// {a, b} 类型,传值得时候 {a, b, c} 也可以,这是类型兼容:多的可以给少的const follow = async (item: { id: string; likeFlag: 0 | 1 }) => {loading.value = truetry {await followOrUnfollow(item.id, type)item.likeFlag = item.likeFlag === 1 ? 0 : 1} finally {loading.value = false}}return { loading, follow }
}// 封装查看处方hook函数
export const useShowPrescription = () => {const onShowPrescription = async (id: string) => {const res = await getPrescriptionOrder(id)console.log(res.data.url);// 预览处方showImagePreview([res.data.url])}return { onShowPrescription }
}// 封装取消问诊hook函数
export const useCancelConsultOrder = () => {const loading = ref(false)const cancelConsultOrder = async (item: ConsultOrderItem) => {try {loading.value = trueconst res = await cancelOrder(item.id)console.log(res, '取消问诊');item.status = OrderType.ConsultCancelitem.statusValue = '已取消'showSuccessToast('取消成功')} catch (error) {showFailToast('取消失败')} finally {loading.value = false}}return { loading, cancelConsultOrder }
}// 封装删除问诊hook函数
export const useDeleteConsultOrder = (cb: () => void) => {const deleteLoading = ref(false)const deleteConsultOrder = async (item: ConsultOrderItem) => {try {deleteLoading.value = trueawait deleteOrder(item.id)showSuccessToast('删除成功')// 成功,做其他业务cb && cb()} catch (error) {showFailToast('删除失败')} finally {deleteLoading.value = false}}return { deleteLoading, deleteConsultOrder }
}

User/components/ConsultItem.vue

import { useShowPrescription, useCancelConsultOrder, useDeleteConsultOrder } from '@/composable'
const { onShowPrescription } = useShowPrescription()
const { loading, cancelConsultOrder } = useCancelConsultOrder()const emits = defineEmits<{(e: 'click-delete', id: string): void
}>()
const { deleteLoading, deleteConsultOrder } = useDeleteConsultOrder(() => {emits('click-delete', props.item.id)
})<!--//样式 -->
<div class="foot" v-if="item.status === OrderType.ConsultComplete"><consult-more :disabled="!item.prescriptionId" @on-delete="deleteConsultOrder(item)"@on-preview="onShowPrescription(item.prescriptionId)"></consult-more>
</div>

相关文章:

  • Webshell混淆免杀的一些思路
  • 说说你对Vue的理解
  • C#拼夕夕自动化登录,电商网页自动化操作。WebView2
  • 代码随想录算法训练营第三十九天| 62 不同路径 63 不同路径 ||
  • QT 中使用 QTableView 和 QStandardItemModel 实现将数据导出到Excel 和 从Excel导入到 QTableView 的功能
  • AI创作ChatGPT源码+AI绘画(Midjourney绘画)+DALL-E3文生图+思维导图生成
  • solidity案例详解(五)能源电力竞拍合约
  • 【Java面试——JUC全局观、原子类、锁、集合类、线程池、工具类】
  • 《凤凰项目》读书笔记
  • 【迅搜05】索引配置(二)字段定义与设计
  • 开源播放器GSYVideoPlayer + ViewPager2 源码解析
  • js进阶笔记之Promise
  • 第一章 分别使用Create-React-App、Vite、Umi Max搭建React项目
  • Linux:进程间通信
  • 【【FPGA 之 MicroBlaze 自定义IP核 之 呼吸灯实验】】
  • [译]如何构建服务器端web组件,为何要构建?
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【node学习】协程
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CODING 缺陷管理功能正式开始公测
  • golang 发送GET和POST示例
  • nodejs:开发并发布一个nodejs包
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue--数据传输
  • webpack+react项目初体验——记录我的webpack环境配置
  • windows下mongoDB的环境配置
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 记录:CentOS7.2配置LNMP环境记录
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 批量截取pdf文件
  • 前言-如何学习区块链
  • 区块链共识机制优缺点对比都是什么
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 延迟脚本的方式
  • 用jQuery怎么做到前后端分离
  • 怎么把视频里的音乐提取出来
  • ​2021半年盘点,不想你错过的重磅新书
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # Apache SeaTunnel 究竟是什么?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #git 撤消对文件的更改
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net FrameWork总结
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作