vue3自定义弹框

image.png

image.png

组件1

<template>
    <div class="system-user-dialog-container">
        <el-dialog
            center
            align-center
            v-model="state.isShow"
            width="569px"
            @close="dialogRefresh"
        >
            <template #header="{ titleClass }">
                <div :class="titleClass">
                    <img src="@\assets\image\content\left.png" alt="" />&nbsp;
                    {{ state.title }} &nbsp;<img
                        src="@\assets\image\content\right.png"
                        alt=""
                    />
                </div>
            </template>
            <el-form
                ref="formRef"
                :rules="state.rules"
                :model="state.formData"
                size="default"
                label-width="100px"
            >
                <slot name="formPart">
                    <div>表单内容</div>
                </slot>
            </el-form>
            <template #footer>
                <span class="dialog-footer">
                    <el-button @click="onCancel" class="cancle" size="default"
                        >取 消</el-button
                    >
                    <el-button
                        type="primary"
                        @click="onSubmit(formRef)"
                        size="default"
                        >确认</el-button
                    >
                </span>
            </template>
            <img
                src="@\assets\image\content\topleft.png"
                class="img"
                alt=""
                srcset=""
            />
            <img
                src="@\assets\image\content\topright.png"
                class="img"
                alt=""
                srcset=""
            />
            <img
                src="@\assets\image\content\botleft.png"
                class="img"
                alt=""
                srcset=""
            />
            <img
                src="@\assets\image\content\botright.png"
                class="img"
                alt=""
                srcset=""
            />
        </el-dialog>
    </div>
</template>

<script setup lang="ts" name="myDialog">
import { ElMessage, FormInstance } from 'element-plus'
import { reactive, ref } from 'vue'

// 定义变量内容
const formRef = ref()

// 定义子组件向父组件传值/事件
const emit = defineEmits(['doSend'])

const state: any = reactive({
    isShow: false,
    formData: [],
    title: '',
    rules: {}
})

// 取消
const onCancel = () => {
    state.isShow = false
}

// 提交
const onSubmit = async (formEl: FormInstance | undefined) => {
    if (!formEl) return
    //表格验证
    await formEl.validate(async (valid: any, fields: any) => {
        if (valid) {
            emit('doSend')
        } else {
            ElMessage.warning('表格项验证失败,请检查')
            console.log('表格项验证失败!', fields)
        }
    })
    onCancel()
}

const dialogRefresh = () => {
    // 清除校验规则
    formRef.value?.resetFields()
    // 重置表单内容
    state.formData = []
}

/*
 *   formData:表单数据
 *   title:标题
 *   rules:表单校验规则
 */
const openDialog = (formData: object, title: string, rules: object) => {
    state.isShow = true
    state.formData = formData
    state.title = title
    state.rules = rules
}

// 暴露变量
defineExpose({
    openDialog
})
</script>
<style scoped lang="scss">
:deep(.el-dialog__header) {
    width: 100%;
    // background: rgba(15, 25, 45, 0.5);

    height: 60px;
    // background-color: #5e8dff;
}
:deep(.el-dialog) {
    background: rgba(15, 25, 45, 0.5);
    border-radius: 2px;
    border-image: linear-gradient(
            180deg,
            rgba(71, 200, 252, 0),
            rgba(34, 151, 248, 1)
        )
        1 1;
    backdrop-filter: blur(4px);
}
:deep(.el-dialog__header .el-dialog__title) {
    font-size: 18px;
    color: #26c9ff;
    line-height: 25px;
}
:deep(.el-dialog__header .el-dialog__close) {
    color: #fff;
}

.img:nth-of-type(1) {
    position: absolute;
    left: 0;
    top: 0;
}
.img:nth-of-type(2) {
    position: absolute;
    right: 0;
    top: 0;
}
.img:nth-of-type(3) {
    position: absolute;
    left: 0;
    bottom: 0;
}
.img:nth-of-type(4) {
    position: absolute;
    right: 0;
    bottom: 0;
}
:deep(.el-form-item__label) {
    color: #fff;
}
:deep(.el-input__inner) {
    color: #fff;
}
:deep(.el-input__wrapper) {
    border: none;
    background: rgba(255, 255, 255, 0.1);
}
.cancle{
    background: rgba(38, 201, 255, 0.20);
    color: #fff;
    border: 1px solid rgba(38, 201, 255, 1);
}
</style>

组件2

<template>
    <div class="system-dic-dialog-container">
        <myDialog ref="myDialogRef" @doSend="handleOperate">
            <template #formPart>
                <el-form
                    label-width="100px"
                    :model="formLabelAlign"
                    style="max-width: 460px"
                >
                    <el-form-item label="无人机类型">
                        <el-input v-model="formLabelAlign.name" />
                    </el-form-item>
                    <el-form-item label="关联ID">
                        <el-input v-model="formLabelAlign.region" />
                    </el-form-item>
                    <el-form-item label="详细描述">
                        <el-input v-model="formLabelAlign.type" />
                    </el-form-item>
                </el-form>
                <p class="text">删除属性:保持上面所有字段为空,并选择“确定”按钮</p>
            </template>
        </myDialog>
    </div>
</template>

<script setup lang="ts" name="systemDicDialog">
import myDialog from './myDialog.vue'
import { reactive, ref ,watchEffect} from 'vue'
import { getGraphql } from '@/apis/modules/common/account.js'
const receiveID=ref('')
let formLabelAlign=reactive({
    name: '',
    region: '',
    type: ''})
// 定义子组件向父组件传值/事件
const emit = defineEmits(['refresh'])

// 定义变量内容
const myDialogRef = ref()
const props = defineProps({
    title: {
        type: String,
        default: "",
    },
    id: {
        default: "",
    },
})
watchEffect(() => {
 formLabelAlign.name= props.title
  receiveID.value=props.id
})
const state = reactive({
    data: [],
    title: '',
    isAdd: false,
    rules: {
        // area: [{ required: true, message: '请选择区域', trigger: 'blur' }],
        // alarmValueName: [{ required: true, message: '请输入告警值名称', trigger: 'blur' }],
        // alarmValue: [{ required: true, message: '请输入告警值', trigger: 'blur' }],
        // alarmValueUnit: [{ required: true, message: '请选择告警值单位', trigger: 'blur' }],
        // alarmText: [{ required: true, message: '请输入告警提示语', trigger: 'blur' }],
    },

    dialog: {
        isShowDialog: false,
        type: '',
        title: '',
        submitTxt: ''
    }
})

const openDialog = (row: any) => {
    console.log(row, 'row')
    console.log(state.data, 'data')
    if (row) {
        state.title = '无人机属性设置'
        state.isAdd = false
    } else {
        state.title = '无人机属性设置'
        state.isAdd = true
    }
    myDialogRef.value.openDialog(state.data, state.title, state.rules)
}

// 发请求
const handleOperate = () => {
 let params = `mutation drone_profile{ drone_profile(id:"${receiveID.value}", drone_link_id:"${formLabelAlign.region}", drone_type:"${formLabelAlign.name}", drone_description:"${formLabelAlign.type}")}`
  getGraphql(params).then((res) => {
        ElMessage.success('修改成功')
    })
    state.isAdd ? doAdd() : doEdit()
}

// 添加
const doAdd = () => {
    console.log('doAdd')
    clearFormData()
    emit('refresh')
}
// 修改
const doEdit = () => {
    console.log('doEdit')
    clearFormData()
    emit('refresh')
}

// 清空表单信息
const clearFormData = () => {
    state.data = []
}

// 暴露变量
defineExpose({
    openDialog
})
</script>
<style scoped>
.text{
color: rgba(38,192,244,0.6);
}
</style>

其他组件引用

<openDialog
        ref="openDialogRef"
        :title="sendTitle"
        :id="sendID"
        @refresh="handleRefresh"
    ></openDialog>
----------------------------------------------------------------
import openDialog from '@/components/dialog/dialog.vue'
---------------------------------------------------------------------------
const openDialogRef = ref()
let sendTitle = ref('管线基本信息')
let sendID = ref('12')
--------------------------------------------------------------
//显示弹框
function views(){
    openDialogRef.value.openDialog()
}
---------------------------------------------------------------------
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容