首页 > 其他分享 >a-modal使用hooks封装状态逻辑并添加全屏切换效果

a-modal使用hooks封装状态逻辑并添加全屏切换效果

时间:2024-03-06 17:24:45浏览次数:17  
标签:loading const hooks value 全屏 modal import hideModal

  • /hooks/useModal.js
import { nextTick, ref } from 'vue'
import {isFunction} from "lodash-es";

export function useModal() {
	// 标题
	// 执行ok、cancel方法
	const visible = ref(false)
	const loading = ref(false)

	const hideModal = () => {
		visible.value = false
	}

	const showModal = () => {
		visible.value = true
	}

	const toggleLoading = () => {
		loading.value = !loading.value
	}
	const handleOk = async (callbackFn) => {
		if (!callbackFn || isFunction(callbackFn) ) return
		toggleLoading()
		console.log('output-> 1', 1)
		callbackFn(() => {
			console.log('output-> 2', 2)
			toggleLoading();
			hideModal();
		})
	}

	return {
		visible,
		showModal,
		hideModal,
		handleOk,
		loading,
		toggleLoading
	}
}

  • testModal.vue
<template>
  <div>
    <a-button type="link" @click="showModal">详情</a-button>
    <a-modal v-model:visible="visible"
             :closable="false"
             :wrap-class-name="[isFullscreen ? 'full-modal' : '']"
    >
      <template #title>
        <div style="display: flex; justify-content: space-between">
          <span>登录表单</span>
          <span>
            <span style="margin-right: 8px">
              <fullscreen-exit-outlined v-if="isFullscreen" @click="onFullscreenToggle"/>
              <fullscreen-outlined v-else @click="onFullscreenToggle"/>
            </span>
            <span>
              <close-outlined @click="onClose"/>
            </span>
          </span>
        </div>
      </template>
      <a-form
        ref="formRef"
      >
        <a-form-item name="name">
          <a-input
            v-model:value="state.userName"
            autocomplete="off"
            placeholder="请输入账号"
          >
            <template v-slot:prefix>
              <UserOutlined style="color: rgba(0, 0, 0, 0.25)"/>
            </template>
          </a-input>
        </a-form-item>
      </a-form>
      <template #footer>
        <a-button key="back" @click="hideModal">取消</a-button>
        <a-button key="submit"
                  type="primary" :loading="loading"
                  @click="handleOk(submitFn)">提交
        </a-button>
      </template>
    </a-modal>
  </div>
</template>
<script setup>
import {useModal} from '@/hooks/useModal'
import {message} from 'ant-design-vue'
import {UserOutlined, CloseOutlined, FullscreenOutlined, FullscreenExitOutlined} from '@ant-design/icons-vue'
import {reactive, ref} from 'vue'

const {visible, loading, handleOk, hideModal, showModal} = useModal()

const isFullscreen = ref(false)
const state = reactive({
  userName: ''
})


const submitFn = async (callback) => {
  setTimeout(() => {
    // 提交逻辑代码
    console.log('output-> state.userName::: ', state.userName)
    message.warn('提交成功')
    callback()
  }, 2000)
  return true
}
const onFullscreenToggle = () => {
  isFullscreen.value = !isFullscreen.value
}
const onClose = () => {
  hideModal()
}

</script>

<style lang="scss">
.full-modal {
  .ant-modal {
    max-width: 100%;
    top: 0;
    padding-bottom: 0;
    margin: 0;
  }

  .ant-modal-content {
    display: flex;
    flex-direction: column;
    height: 100vh;
    width: 90vw;
    margin-left: 200px;
  }

  .ant-modal-body {
    flex: 1;
  }
}
</style>

标签:loading,const,hooks,value,全屏,modal,import,hideModal
From: https://www.cnblogs.com/openmind-ink/p/18057053

相关文章

  • React Hooks 钩子特性及应用场景
    Hooks是React16.8的新增特性。它可以让你在不编写class组件的情况下使用state以及其他的React特性。ReactHooks表现形式是以use开头的函数被称为Hook。useState是React提供的一个内置Hook。你可以在ReactAPI参考中找到其他内置的Hook。你也可以通过组合......
  • React 高阶组件、Render props、hooks 有什么区别?
    这三者是目前react解决代码复用的主要方式:高阶组件(hoc)官方解释:高阶组件(HOC)是React中用于复用组件逻辑的一种高级技巧。HOC自身不是ReactAPI的一部分,它是一种基于React的组合特性而形成的设计模式。简言之,HOC是一种组件的设计模式,HOC接受一个组件和额外的......
  • 自定义Hooks:四个典型的使用场景
    一、如何用好hook要用好ReactHooks,很重要的一点,就是要能够从Hooks的角度去思考问题。要做到这一点其实也不难,就是在遇到一个功能开发的需求时,首先问自己一个问题:这个功能中的哪些逻辑可以抽出来成为独立的Hooks?这样问的目的,是为了让我们尽可能的吧业务陆奥及拆分......
  • React的7个常用Hooks及使用场景(含示例)
    React是一款非常流行的JavaScript库,它提供了许多Hooks,用于管理函数组件的状态和生命周期。下面是React的每个Hooks的使用场景和示例:No1、useStateuseState用于在函数组件中管理状态。它返回一个包含当前状态和一个更新状态的函数的数组。更新状态的函数可以接受一个新的值......
  • useModal对弹窗进行逻辑封装
    useModal.jsimport{nextTick,ref}from'vue'import{isFunction}from'@/utils/judge'exportfunctionuseModal(){ //标题 //执行ok、cancel方法 constvisible=ref(false) constloading=ref(false) consthideModal=()=>{ ......
  • Qt 编写的qml程序全屏时,挡住系统虚拟键盘的解决办法
    官方有提到该问题。尤其是使用qml时,一定会出现这个遮挡问题。https://doc.qt.io/qt-5/windows-issues.html 默认的qml工程的解决代码如下:1...2#include<QWindow>3#include<QtPlatformHeaders/QWindowsWindowFunctions>4...56intmain(intargc,char*arg......
  • Android 《设置全屏隐藏状态栏》
    @OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//全屏去状态栏(在setContentView之前)requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().addFlags(WindowManager.La......
  • uniapp nvue页面 map地图全屏设置
    因为nvue页面:100vh以及百分比不可用,所以1,可以获取当前屏幕高度然后赋值<map:latitude="latitude":longitude="longitude":style="'height:'+windowHeight*2+'rpx;'"></map>const{windowWidth,windowHeight,appName}=......
  • MMFN论文阅读笔记(Multi-modal Fake News Detection on Social Media via Multi-graine
    论文标题:Multi-modalFakeNewsDetectiononSocialMediaviaMulti-grainedInformationFusion论文作者:YangmingZhou,YuzhouYang,QichaoYing,ZhenxingQian,XinpengZhang论文来源:ICMR2023,paper论文代码:暂无介绍目前的多模态方法主要集中在文本和视觉特征的融......
  • 使用`react-hooks写法`对`antd的Upload.Dragger上传组件`进行二次封装
    使用react-hooks写法对antd的Upload.Dragger上传组件进行二次封装预期对antd的Upload.Dragger组件进行二次封装,让它的使用方法和Upload.Dragger组件保持一致。让该组件能自动把数据放到对应后端服务器中。让该组件能的value值如果没上传,为数组形式。如果没有值,为空数组。如......