封装hook函数【便于复用】

一般函数封装

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

const deleteLoading = ref(false)
const emits = defineEmits<{
  (e: 'click-delete', id: string): void
}>()
const deleteConsultOrder = async (item: ConsultOrderItem) => {
  try {
    deleteLoading.value = true
    await 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 = true
    try {
      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 = true
      const res = await cancelOrder(item.id)
      console.log(res, '取消问诊');

      item.status = OrderType.ConsultCancel
      item.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 = true
      await 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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值