| import { nextTick, ref } from 'vue' |
| import {isFunction} from "lodash-es"; |
| |
| export function useModal() { |
| const visible = ref(false) |
| const loading = ref(false) |
| |
| const showModal = () => { |
| visible.value = true |
| } |
| |
| const toggleLoading = () => { |
| loading.value = !loading.value |
| } |
| |
| |
| const handleOk = async (callbackFn) => { |
| if (!callbackFn || isFunction(callbackFn) ) return |
| toggleLoading() |
| callbackFn(() => { |
| toggleLoading(); |
| hideModal(); |
| }) |
| } |
| |
| |
| const hideModal = (callbackFn) => { |
| console.log('output-> callbackFn ', callbackFn) |
| if (callbackFn || isFunction(callbackFn) ) { |
| callbackFn() |
| } |
| visible.value = false |
| } |
| |
| return { |
| visible, |
| showModal, |
| hideModal, |
| handleOk, |
| loading, |
| toggleLoading |
| } |
| } |
| |
| <template> |
| <div> |
| <a-modal :visible="props.visible" |
| :title="props.title" |
| @cancel="props.onCancel" |
| :footer="null" |
| > |
| <slot name="content"></slot> |
| |
| <slot name="footer"> |
| |
| </slot> |
| </a-modal> |
| </div> |
| </template> |
| <script setup> |
| const props = defineProps({ |
| visible: { |
| type: Boolean, |
| default: false |
| }, |
| loading: { |
| type: Boolean, |
| default: false |
| }, |
| title: { |
| type: String, |
| default: '' |
| }, |
| onOk: { |
| type: Function, |
| default: () => { |
| } |
| }, |
| onCancel: { |
| type: Function, |
| default: () => { |
| |
| } |
| } |
| }) |
| |
| |
| </script> |
| <template> |
| <div> |
| <BaseModal |
| :visible="visible" |
| :loading="loading" |
| :on-ok="okCallbackFn" |
| :on-cancel="cancelCallbackFn" |
| :title="null" |
| :footer="null" |
| > |
| <template v-slot:content> |
| <main class="hz-callback-box"> |
| <img src="@/assets/feedback/over-icon.svg" alt="" /> |
| <div>是否结束此次反馈?</div> |
| </main> |
| </template> |
| <template v-slot:footer> |
| <div class="hz-btn-group"> |
| <a-button key="back" @click="cancelCallbackFn" style="margin-right: 12px">取消</a-button> |
| <a-button key="submit" |
| type="primary" |
| @click="okCallbackFn" |
| :loading="loading" |
| >确定 |
| </a-button> |
| </div> |
| </template> |
| </BaseModal> |
| </div> |
| </template> |
| |
| <script setup> |
| |
| import { useModal } from '@/hooks/useModalPlus.js' |
| import BaseModal from '@/views/Manage/FeedbackManage/components/BaseModal.vue' |
| |
| let { visible, loading, handleOk, hideModal, showModal } = useModal() |
| |
| const emits = defineEmits() |
| defineExpose({ |
| showModal, |
| hideModal |
| }) |
| |
| const okCallbackFn = () => { |
| emits('emitOverFeedback', {loading, visible}) |
| } |
| |
| const cancelCallbackFn = () => { |
| console.log('output-> hide') |
| visible.value = false |
| } |
| </script> |
| |
| <style lang="scss" scoped> |
| .hz-callback-box { |
| display: flex; |
| flex-direction: column; |
| justify-content: center; |
| align-items: center; |
| |
| img { |
| width: 108px; |
| height: 108px; |
| } |
| |
| div { |
| font-size: 16px; |
| color: rgba(255, 255, 255, 1); |
| margin-top: 18px; |
| } |
| } |
| |
| .hz-btn-group { |
| width: 100%; |
| display: flex; |
| justify-content: flex-end; |
| } |
| </style> |
| |
| <template> |
| <OverFeedbackModal ref="overFeedbackRef"/> |
| |
| const overFeedbackRef = ref(null) |
| |
| const onShowModal = () => { |
| overFeedbackRef.value.showModal() |
| } |
| const onHideModal = () => { |
| overFeedbackRef.value.hideModal() |
| } |
| </template |
| |
| <script setup> |
| |
| </script> |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具