vue 一个组件内多个弹窗_使用Vue组件实现一个简单弹窗效果

本文通过实例代码介绍了如何使用Vue组件实现一个具有遮罩层、内容定制、props传参和$emit事件的弹窗组件,包括组件的HTML结构、CSS样式、slot插槽的使用、props控制弹窗显隐以及$emit触发父组件事件。
摘要由CSDN通过智能技术生成

最近在使用element-ui框架,用到了Dialog对话框组件,大致实现的效果,跟我之前自己在移动端项目里面弄的一个弹窗组件差不太多。然后就想着把这种弹窗组件的实现方式与大家分享一下,下面本文会带着大家手摸手实现一个弹窗组件。

本文主要内容会涉及到弹窗遮罩的实现, slot 插槽的使用方式, props 、 $emit 传参,具体组件代码也传上去了。如果喜欢的话可以点波赞/关注,支持一下,希望大家看完本文可以有所收获。

组件最后实现的效果

实现步骤

先搭建组件的html和css样式,遮罩层和内容层。

定制弹窗内容:弹窗组件通过 slot 插槽接受从父组件那里传过来弹窗内容。

定制弹窗样式:弹窗组件通过 props 接收从父组件传过来的弹窗宽度,上下左右的位置。

组件开关:通过父组件传进来的 props 控制组件的显示与隐藏,子组件关闭时通过事件 $emit 触发父组件改变值。

1.搭建组件的html和css样式。

html结构:一层遮罩层,一层内容层,内容层里面又有一个头部title和主体内容和一个关闭按钮。

下面是组件中的html结构,里面有一些后面才要加进去的东西,如果看不懂的话可以先跳过,

提示信息

弹窗内容

下面是组件中的主要的css样式,里面都做了充分的注释,主要通过 z-index 和 background 达到遮罩的效果,具体内容的css可以根据自己的需求来设置。

// 最外层 设置position定位

.dialog {

position: relative;

color: #2e2c2d;

font-size: 16px;

}

// 遮罩 设置背景层,z-index值要足够大确保能覆盖,高度 宽度设置满 做到全屏遮罩

.dialog-cover {

background: rgba(0,0,0, 0.8);

position: fixed;

z-index: 200;

top: 0;

left: 0;

width: 100%;

height: 100%;

}

// 内容层 z-index要比遮罩大,否则会被遮盖,

.dialog-content{

position: fixed;

top: 35%;

// 移动端使用felx布局

display: flex;

flex-direction: column;

justify-content: center;

align-items: center;

z-index: 300;

}

2. 通过 slot 定制弹窗内容

这一步,只要理解了 slot 的作用以及用法,就没有问题了。

单个插槽:

这是在没有slot传进来的时候,才显示的弹窗内容

上面是单个插槽也叫默认插槽,在父组件中使用插槽的正确姿势:

这是一些初始内容

这是更多的初始内容

ps:如果子组件里面包含 slot 插槽,那么上面的p标签的内容将会被丢弃。

具名插槽:

所谓的具名插槽,即为 slot 标签赋一个 name 属性,具名插槽可以父组件中不同的内容片段放到子组件的不同地方,具名插槽还是可以拥有一个默认插槽。下面可以看一下弹窗组件插槽的使用方式:

提示信息

弹窗内容

在父组件中的使用方式:

将弹窗组件引入要使用的组件中,并通过 components 注册成为组件。

父组件中弹窗组件插槽的使用方法如下。

插入到name为header的slot标签里面

这里是内容插入到子组件的slot的name为main里面,可以在父组件中添加class定义样式,事件类型等各种操作

关于组件中用到的插槽的介绍就到这里了,插槽在弹窗组件中的应用是一个典型的栗子,可以看到插槽作用相当强大,而插槽本身的使用并不难,同学们爱上插槽了没有?

3.通过 props 控制弹窗显隐&&定制弹窗style

psops 是Vue中父组件向子组件传递数据的一种方式,不熟悉的小伙伴们可以看一下 props文档 。

因为弹窗组件都是引到别的组件里面去用的,为了适合不同组件场景中的弹窗,所以弹窗组件必须具备一定的可定制性,否则这样的组件将毫无意义,下面介绍一下props的使用方式,以弹窗组件为例:

首先需要在被传入的组件中定义props的一些特性,验证之类的。

然后在父组件中绑定props数据。

export default {

props: {

isShow: {

//弹窗组件是否显示 默认不显示

type: Boolean,

default: false,

required:true, //必须

},

//下面这些属性会绑定到div上面 详情参照上面的html结构

// 如: :style="{top:topDistance+'%',width:widNum+'%'}"

widNum:{

//内容宽度

type: Number,

default:86.5

},

leftSite:{

// 左定位

type: Number,

default:6.5

},

topDistance: {

//top上边距

type: Number,

default:35

},

pdt:{

//上padding

type: Number,

default:22

},

pdb:{

//下padding

type: Number,

default:47

}

},

}

父组件中使用方式:

ps:props传递数据不是双向绑定的,而是 单向数据流 ,父组件的数据变化时,也会传递到子组件中,这就意外着我们不应该在子组件中修改props。所以我们在关闭弹窗的时候就 需要通过 $emit 来修改父组件的数据 ,然后数据会自动传到子组件中。

现在基本上弹窗组件都已实现的差不多了,还差一个弹窗的关闭事件,这里就涉及到子组件往父组件传参了。

4. $emit 触发父组件事件修改数据,关闭弹窗

Vue中在子组件往父组件传参,很多都是通过 $emit 来触发父组件的事件来修改数据。

在子组件中,在点击关闭,或者遮罩层的时候触发下面这个方法:

methods: {

closeMyself() {

this.$emit("on-close");

//如果需要传参的话,可以在"on-close"后面再加参数,然后在父组件的函数里接收就可以了。

}

}

父组件中的写法:

//"on-close是监听子组件的时间有没有触发,触发的时候执行closeDialog函数

methods:{

closeDialog(){

// this.status.isShowPublish=false;

//把绑定的弹窗数组 设为false即可关闭弹窗

},

}

可以用弹窗组件实现下列这种信息展示,或者事件交互:

上面是把弹窗的每个步骤拆分开来,一步步解析的,每一步都说的比较清楚了,具体连起来的话,可以看看 代码 ,再结合文章就能理的很清楚了。

总结

以上所述是小编给大家介绍的使用Vue组件实现一个简单弹窗效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值