Vue手写dialog组件模态框过程详解

 更新时间:2023年02月10日 15:18:36   作者:tjq11111  
这篇文章主要介绍了Vue手写dialog组件模态框过程,dialog组件为模态框,因此应该是固定定位到页面上面的,并且需要留一定的插槽来让使用者自定义显示内容

在vue项目下创建文件dialog

实现思路

1、dialog组件为模态框,因此应该是固定定位到页面上面的,并且需要留一定的插槽来让使用者自定义显示内容

2、难点在于如何一句话打开dialog,也就是下面的index.js文件的内容:导入我们已经写好的组件(可以先写一个及其简单的),模块暴露出一个函数(DiaLog)用于生成dialog,这里主要利用到vue中的createApp函数,createApp创建应用,将应用挂载到我们的新建div标签上,随着用户触发点击事件,将div标签销毁即可

index.js文件

import dialog from './index.vue'
import { createApp} from 'vue'
export const DiaLog = (obj) => {
	const app = createApp(dialog, {
		...obj,
		on_click: (flg) => {
			console.log(flg);
			div.remove()
		},
	})
	const div = document.createElement('div')
	app.mount(div)
	document.body.appendChild(div)
}

使用

<template>
  <div class="app">
    <button @click="DiaLog({_title:'我不想起标题'})">起飞</button>
  </div>
</template>
<script setup>
import { DiaLog } from './package/dialog/index.js'
</script>
<style scoped lang="scss">
.app {
  height: 1200px;
}
</style>

index.vue文件

<template>
	<div class="dialog">
		<h1 v-if="props._title">{{ props._title }}</h1>
		<div>
			<slot></slot>
		</div>
		<div class="btn">
			<button @click="emitFn(false)">取消</button>
			<button @click="emitFn(true)" class="success">确认</button>
		</div>
	</div>
	<div class="background" v-if="props._background"></div>
</template>
<script setup>
const props = defineProps({
	_title: {
		type: String,
		default: '无标题'
	},
	_background: {
		type: Boolean,
		default: true
	}
})
const emit = defineEmits([
	'_click'
])
const emitFn = (boolean) => {
	emit('_click', boolean)
}
</script>
<style scoped lang="scss">
.dialog {
	background-color: white;
	z-index: 999;
	position: fixed;
	width: 400px;
	min-height: 200px;
	left: 50%;
	top: 50%;
	border: 1px solid rgba(0, 0, 0, 0.5);
	transform: translateX(-50%) translateY(-50%);
	display: flex;
	flex-direction: column;
	justify-content: space-between;
	padding: 15px;
	h1 {
		font-size: 20px;
		font-weight: 400;
		padding: 0;
		margin: 0;
	}
	.btn {
		display: flex;
		justify-content: end;
		button {
			padding: 5px 15px;
			border-radius: 5px;
			border: 2px solid #E2E2E2;
			font-size: 14px;
			cursor: pointer;
		}
		.success {
			color: white;
			background-color: #36AD6A;
			margin-left: 20px;
		}
	}
}
.background {
	width: 100vw;
	height: 100vh;
	position: fixed;
	left: 0;
	// display: none;
	top: 0;
	background-color: rgba(0, 0, 0, 0.5);
	z-index: 99;
}
</style>

到此这篇关于Vue手写dialog组件模态框过程详解的文章就介绍到这了,更多相关Vue dialog组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)

    Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)

    这篇文章主要介绍了Vuejs 2.0 子组件访问/调用父组件的方法(示例代码),需要的朋友可以参考下
    2018-02-02
  • 在vue中阻止浏览器后退的实例

    在vue中阻止浏览器后退的实例

    今天小编就为大家分享一篇在vue中阻止浏览器后退的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Vue3的setup在el-tab中动态加载组件的方法

    Vue3的setup在el-tab中动态加载组件的方法

    公司某项目需求在页面显示的组件是根据角色变化而变化的,怎么实现这个效果呢,下面小编给大家介绍下Vue3的setup在el-tab中动态加载组件的方法,需要的朋友可以参考下
    2022-11-11
  • Vue.js中动态更改svg的相关属性详解

    Vue.js中动态更改svg的相关属性详解

    这篇文章主要为大家介绍了Vue.js中动态更改svg的相关属性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • ElementUI年份范围选择器功能实现

    ElementUI年份范围选择器功能实现

    elementUI中有日期范围组件,月份范围选择的,就是没有年份范围选择的,需要加一个类似风格的,下面这篇文章主要给大家介绍了关于ElementUI年份范围选择器功能实现的相关资料,需要的朋友可以参考下
    2023-02-02
  • Vue3后台管理系统之创建和配置项目

    Vue3后台管理系统之创建和配置项目

    后台管理系统是我们日常开发学习经常遇到的一个项目,下面这篇文章主要给大家介绍了关于Vue3后台管理系统之创建和配置项目的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 基于vue2实现一个日历组件

    基于vue2实现一个日历组件

    最近在做一个类似课程表的需求,需要自制一个日历来支持功能及展现,就顺便研究一下应该怎么开发日历组件,下面这篇文章主要给大家介绍了关于如何基于vue2实现一个日历组件的相关资料,需要的朋友可以参考下
    2022-12-12
  • vue在路由中验证token是否存在的简单实现

    vue在路由中验证token是否存在的简单实现

    今天小编就为大家分享一篇vue在路由中验证token是否存在的简单实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vue刷新页面时去闪烁提升用户体验效果的实现方法

    vue刷新页面时去闪烁提升用户体验效果的实现方法

    这篇文章主要介绍了vue刷新页面时去闪烁提升体验方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • vue实现二维码扫码功能(带样式)

    vue实现二维码扫码功能(带样式)

    最近接了一个移动端的项目,实现微信扫码功能,今天小编利用这个平台给大家分享vue实现二维码扫描功能的实现代码,需要的朋友参考下吧
    2021-08-08

最新评论