vue3 - 自定义弹框组件

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

vue3 - 自定义弹框组件,vue.js文章来源地址https://www.toymoban.com/news/detail-811454.html

写了一个弹框组件
<template>
  <transition name="modal-fade">
    <div v-if="showFlag" class="myModal">
      <div class="content">
        <div class="topBox">
          <div class="leftTitle">
            <span>{{ title }}</span>
          </div>
          <div class="rightClose" @click="cancelModal"><CloseOutlined /></div>
        </div>
        <slot name="content"></slot>
      </div>
    </div>
  </transition>
</template>

<script setup lang="ts">
import { ref, toRefs } from 'vue'

const props = defineProps({
  title: {
    type: String,
    default: '',
  },
})

const { title } = toRefs(props)

// 是否开启弹框
let showFlag = ref(false)

// 开启
const showModal = () => {
  showFlag.value = true
}

// 关闭
const cancelModal = () => {
  showFlag.value = false
}

defineExpose({
  showModal,
  cancelModal,
})
</script>

<style lang="less" scoped>
// 这个动画是,打开弹框时,有一个缓慢打开的效果
@keyframes fadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

// 打开弹框时给它一个上下抖动的效果
@keyframes shake {
  0% { transform: translateY(0); }
  25% { transform: translateY(-10px); }
  50% { transform: translateY(0); }
  75% { transform: translateY(10px); }
  100% { transform: translateY(0); }
}

.myModal {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.4);
  z-index: 100;

  animation: fadeIn 0.5s;
  // animation: fadeIn 0.5s, shake 0.5s;

  .content {
    position: absolute;
    left: 50%;
    top: 30%;
    transform: translate(-50%, -50%);
    background: #ffffff;
    width: 500px;
    padding: 10px;

    .topBox {
      display: flex;
      height: 30px;
      border-bottom: 1px solid #f0f0f0;
      padding: 0 10px 0 0;
      margin-bottom: 20px;
      cursor: pointer;

      .leftTitle {
        flex: 1;
        text-align: left;
        color: rgba(0, 0, 0, 0.8);
        font-weight: 600;
        font-size: 16px;
      }

      .rightClose {
        flex: 1;
        text-align: right;
      }
    }
  }
}

// start - 效果为:关闭时,有一个缓慢消失的效果
.modal-fade-enter-active, .modal-fade-leave-active {
  transition: opacity 0.5s;
}
.modal-fade-enter, .modal-fade-leave-to {
  opacity: 0;
}
// end - 效果为:关闭时,有一个缓慢消失的效果
</style>


使用它
<template>
  <MyModal ref="myModal" :title="title">
    <template #content>
      <div style="display: grid; place-items: center">
        <a-form ref="loginForm" :model="formState" :label-col="labelCol" style="width: 360px">
          <a-form-item has-feedback name="userName">
            <a-input v-model:value="formState.phone" placeholder="请输入手机号" autocomplete="off">
              <template #prefix><UserOutlined style="color: rgba(0, 0, 0, 0.25)" /></template>
            </a-input>
          </a-form-item>

          <a-form-item has-feedback name="code">
            <a-input
              v-model:value="formState.code"
              placeholder="验证码"
              autocomplete="off"
              style="width: 240px"
            >
              <template #prefix><MailOutlined style="color: rgba(0, 0, 0, 0.25)" /></template>
            </a-input>
            <a-button
              :disabled="myState.smsSendFlag"
              v-text="(!myState.smsSendFlag && '获取验证码') || `${myState.time} s`"
              @click="getSms"
              style="margin-left: 15px"
              type="primary"
            ></a-button>
          </a-form-item>

          <a-form-item style="text-align: center">
            <a-button style="width: 360px" type="primary" block @click="handleSubmit">
              登录
            </a-button>
          </a-form-item>
        </a-form>
      </div>
    </template>
  </MyModal>
</template>

<script setup lang="ts">
import { ref } from 'vue'

import * as accountApi from '@/api/account'

import MyModal from '@/components/MyModal/MyModal.vue'
import { message } from 'ant-design-vue'

const myModal = ref()

const showModal = () => {
  myModal.value?.showModal()
}

defineExpose({
  showModal,
})

let title = ref('x管家登陆')

const myState = reactive({
  smsSendFlag: false,
  time: 60,
})

let labelCol = { span: 4 }
interface formState {
  phone: string | number
  code: string | number
}
const formState = ref<formState>({
  phone: '',
  code: '',
})

// 获取验证码
const getSms = async () => {
  let params = {
    phone: formState.value.phone,
  }
  if (params['phone'] == '') {
    message.error(`手机号不能为空~`)
    return
  }
  const hide = message.loading('验证码发送中..', 0)
  try {
    let { state, message: msg } = await accountApi.idleSendSms(params)
    if (state === 200) {
      myState.smsSendFlag = true
      const interval = setInterval(() => {
        if (myState.time-- <= 0) {
          myState.time = 60
          myState.smsSendFlag = false
          clearInterval(interval)
        }
      }, 1000)
    } else {
      message.error(msg)
    }
  } catch (error) {
    message.error('网络请求连接失败~')
  }
  setTimeout(hide, 1)
}

// 登录
const handleSubmit = async () => {
  let params = {
    phone: formState.value.phone,
    code: formState.value.code,
  }
  try {
    const { state, message: msg, token } = await accountApi.idleLogin(params)
    if (state === 200) {
      message.success('登录成功~')
      myModal.value?.cancelModal()
    } else {
      message.error(msg)
    }
  } catch (error) {
    message.error('网络请求发送失败~')
  }
}
</script>

到了这里,关于vue3 - 自定义弹框组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 壁纸小程序Vue3(自定义头部组件)

     coustom-nav  1)状态栏     view class=\\\"statusBar\\\" :style=\\\"{height: statusBarHeight +\\\'px\\\'}\\\"/view H5中为0     view class=\\\"titleBar\\\" :style=\\\"{height:titleBarHeight+\\\'px\\\'}\\\" 获取胶囊位置   view class=\\\"fill\\\" :style=\\\"{height:statusBarHeight+titleBarHeight+\\\'px\\\'}\\\"     /view 填充区域,让轮播图展示全 script setup import { ref } from \\\'vue

    2024年04月11日
    浏览(24)
  • Vue3 子组件定义默认值withDefaults

    如果父组件为传递子组件数据, 子组件可以使用withDefaults定义默认值 父组件 子组件

    2024年02月11日
    浏览(26)
  • 在vue3中定义组件的5种方式

    Vue 正在不断发展,目前在 Vue3 中定义组件的方法有多种。从选项式到组合式再到类 API ,情况截然不同。本文将会定义一个简单的组件并使用所有可用的方法重构它。 这是在 Vue 中声明组件的最常见方法。从 Vue1 就开始存在了,我们很可能已经熟悉它了。一切都在对象内部声

    2024年02月13日
    浏览(25)
  • vue3自定义封装组件:消息提示、轮播图、加载更多、骨架屏组件

    定义组件:src/components/library/xtx-infinite-loading.vue 注册组件:src/components/library/index.js  引用组件:src/main.js 使用组件: .vue文件 首先是轮播图的样式:src/components/library/xtx-carousel.vue  然后是轮播图的结构与逻辑封装:src/components/library/xtx-carousel.vue 插件注册:src/components/library

    2024年02月12日
    浏览(31)
  • 自定义精美商品分类列表组件 侧边栏商品分类组件 category组件(适配vue3)

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月05日
    浏览(37)
  • 1. 使用Popup组件自定义弹框提示页面

    在QT中,经常使用QMessageBox进行弹框的提示,而在QML中并没有这个功能,但是可以利用Popup组件进行自定义弹框的设计。 该组件可以理解为是一个空白区域,默认的visible属性是false,即不显示,需要用户手动设置其为true,才能显示出来。或者使用其自带的open()和close()函数打开

    2024年02月07日
    浏览(25)
  • Vue3 —— 在vue中动态引入组件以及动态引入js的方法

    文章目录 一 、 动态引入组件 1. 具体写法 二、 动态引入js文件 1. 具体写法 总结 定义一个异步组件,它在运行时是懒加载的。参数可以是一个异步加载函数,或是对加载行为进行更具体定制的一个选项对象。 在大型项目中,我们可能需要拆分应用为更小的块,并仅在需要时

    2024年02月12日
    浏览(35)
  • vue3前端excel导出;组件表格,自定义表格导出;Vue3 + xlsx + xlsx-style

    当画面有自定义的表格或者样式过于复杂的表格时,导出功能可以由前端实现 1. 使用的插件 : sheet.js-xlsx 文档地址:https://docs.sheetjs.com/ 中文地址:https://geekdaxue.co/read/SheetJS-docs-zh/README.md xlsx-style:https://www.npmjs.com/package/xlsx-style 2. 安装引用 安装插件-vue3 引用插件 3. 组件表格

    2024年04月26日
    浏览(33)
  • vue3自定义dialog createApp setup语法组件使用element

    目录  index.vue mapDialog.js

    2024年02月14日
    浏览(34)
  • 前端Vue自定义签到积分获取弹框抽取红包弹框 自定义弹框内容 弹框顶部logo

    前端组件化开发:以cc-downloadDialog组件为例 随着技术的发展,开发的复杂度也越来越高。传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现

    2024年02月11日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包