logo 范 · 拾光录
网址收集 关于作者 Github Gitee
杂文随笔4
Hexo博客:基础使用Hexo博客:Next主题Hexo博客:Next进阶使用Hexo博客:Next高级配置
前端编程3
前端基础知识16
UniApp15
Vue框架19
Java编程7
Java基础知识14
SpringBoot31
SpringMVC14
MyBatis8
SpringCloud15
RocketMQ1
MyCat1
数据库4
MySQL6
Redis7
MongoDB10
H21
Java技术栈4
知识整理分布式锁的实现方案MySQL事务MySQL的锁
软件工具箱14
IDEAGitMavenGradleNginx安装Nginx配置JMeter压测OllamaPicGoRustFSVSCodeDockerObsidianObs录制
Linux知识11
树莓派安装及使用ArchLinux:常用软件ArchLinux:基础系统安装ArchLinux:深度优化ArchLInux:图形化界面安装ArchLinux:Nirifrp内网穿透Jar启动脚本Linux常用命令VirtualBox安装CentOSVirtualBox安装Ubuntu
Python编程6
Python基础知识Python语法yolo目标检测OpenCV的使用及树莓派平台condauv
创意设计2
Blender:入门知识UI设计基础知识
AI相关9
Claude CodeHermes AgentOpenAI基本使用OpenAI工具调用OpenAI记忆管理OpenAI推理执行OpenAI开发框架Langchainllama.cpp

组件

文件名为DialogComponent.vue,能统一调整所有弹窗的样式,实现与滚动条的结合

<!--弹窗组件-->
<template>
  <el-dialog
    v-model="mvOnOff"
    :title="title"
    :width="width"
    destroy-on-close
    @close="diaClose()"
    :close-on-click-modal="false"
    :close-on-press-escape="false"
    :show-close="false">
    <div>
      <div class="dialog-component-body-margin">
        <el-scrollbar max-height="70vh">
          <div class="dialog-component-body-padding">
            <slot name="body"/>
          </div>
        </el-scrollbar>
      </div>
    </div>
    <template #footer>
      <slot name="footer"/>
    </template>
  </el-dialog>
</template>

<script setup>
import {watch, ref} from 'vue'

const props = defineProps({
  onOff: Boolean,
  title: String,
  width: Number,
})

const mvOnOff = ref(props.onOff)

watch(() => props.onOff, () => {
  mvOnOff.value = props.onOff
})

// 关闭回调,修复右上角关闭未更新v-model值问题
function diaClose() {
  console.log('关闭')
  mvOnOff.value = false
}
</script>

<style scoped lang="sass">
// 调整滚动条位置
.dialog-component-body-margin
  margin: -30px -20px
  .dialog-component-body-padding
    padding: 30px 20px
</style>

使用

<DialogComponent
    v-model:on-off="modifyData.dialog.flag"
    v-model:title="modifyData.dialog.title"
    v-model:width="modifyData.dialog.width">
    <template #body>
      <el-form
        ref="modifyRef"
        :model="modifyData.req"
        :rules="modifyData.rules"
        label-width="82">
        <el-form-item label="角色名" prop="name">
          <el-input v-model="modifyData.req.name"/>
        </el-form-item>
      </el-form>
    </template>
    <template #footer>
      <el-button @click="modifyData.dialog.flag=false">取消</el-button>
      <el-button type="primary" @click="modifyDeal(modifyRef)" v-text="modifyData.dialog.btn"></el-button>
    </template>
  </DialogComponent>

弹窗垂直居中

// el-dialog 垂直居中
.el-dialog
  display: flex
  flex-direction: column
  margin: 0 !important
  position: absolute
  top: 50%
  left: 50%
  transform: translate(-50%, -50%)
  max-height: calc(100vh - 50px)
  max-width: calc(100% - 100px)
  // 调整圆角
  border-radius: 4px
// el-dialog 内容滚动
.el-dialog .el-dialog__body
  flex: 1
  overflow: auto
组件
使用
弹窗垂直居中