您的当前位置:首页正文

如何利用Vue组件实现弹窗功能

2023-11-29 来源:91汽车资讯网
这次给大家带来如何利用Vue组件实现弹窗功能,利用Vue组件实现弹窗功能的注意事项有哪些,下面就是实战案例,一起来看一下。

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

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

组件最后实现的效果

实现步骤

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

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

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

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

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

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

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

<template> <p class="dialog"> <!--外层的遮罩 点击事件用来关闭弹窗,isShow控制弹窗显示 隐藏的props--> <p class="dialog-cover back" v-if="isShow" @click="closeMyself"></p> <!-- transition 这里可以加一些简单的动画效果 --> <transition name="drop"> <!--style 通过props 控制内容的样式 --> <p class="dialog-content" :style="{top:topDistance+'%',width:widNum+'%',left:leftSite+'%'}" v-if="isShow"> <p class="dialog_head back"> <!--弹窗头部 title--> <slot name="header">提示信息</slot> </p> <p class="dialog_main" :style="{paddingTop:pdt+'px',paddingBottom:pdb+'px'}"> <!--弹窗的内容--> <slot name="main">弹窗内容</slot> </p> <!--弹窗关闭按钮--> <p class="foot_close" @click="closeMyself"> <p class="close_img back"></p> </p> </p> </transition> </p></template>

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

<style lang="scss" scoped> // 最外层 设置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; }</style>

2. 通过 slot 定制弹窗内容

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

单个插槽:

<slot>这是在没有slot传进来的时候,才显示的弹窗内容</slot>上面是单个插槽也叫默认插槽,在父组件中使用插槽的正确姿势:

<my-component> <!--在my-component里面的所有内容片段都将插入到slot所在的DOM位置,并且会替换掉slot标签--> <!--这两个p标签,将替换整个slot标签里面的内容--> <p>这是一些初始内容</p> <p>这是更多的初始内容</p></my-component>

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

具名插槽:

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

<p class="dialog_head back "> <!--弹窗头部 title--> <slot name="header">提示信息</slot> </p> <p class="dialog_main " :style="{paddingTop:pdt+'px',paddingBottom:pdb+'px'}"> <!--弹窗的内容--> <slot name="main">弹窗内容</slot> </p>

在父组件中的使用方式:

将弹窗组件引入要使用的组件中,并通过 components 注册成为组件。父组件中弹窗组件插槽的使用方法如下。

<dialogComponent> <p slot="header">插入到name为header的slot标签里面</p> <p class="dialog_publish_main" slot="main"> 这里是内容插入到子组件的slot的name为main里面,可以在父组件中添加class定义样式,事件类型等各种操作 </p></dialogComponent>

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

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

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

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

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

<script>export default { props: { isShow: { //弹窗组件是否显示 默认不显示 type: Boolean, default: false, required:true, //必须 }, //下面这些属性会绑定到p上面 详情参照上面的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 } },}</script>

父组件中使用方式:

<dialogComponent :is-show="status.isShowPublish" :top-distance="status.topNum"></dialogComponent>

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

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

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

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

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

methods: { closeMyself() { this.$emit("on-close"); //如果需要传参的话,可以在"on-close"后面再加参数,然后在父组件的函数里接收就可以了。 } }

父组件中的写法:

<dialogComponent :is-show="status.isShowPublish" :top-distance="status.topNum" @on-close="closeDialog"> </dialogComponent> //"on-close是监听子组件的时间有没有触发,触发的时候执行closeDialog函数methods:{ closeDialog(){ // this.status.isShowPublish=false; //把绑定的弹窗数组 设为false即可关闭弹窗 },}

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

弹窗组件代码

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

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

怎样进行JS变量声明var,let.const

怎样使用vue计算属性与方法侦听器

小编还为您整理了以下内容,可能对您也有帮助:

vue3.0如何点击按钮弹出框

vue3.0点击+按钮后点击按钮弹出框。
查询vue官网显示,点击+按钮后弹出选项列表Member子组件,点击Member子组件上的按钮即可点击按钮弹出框。
vue3.0是iOS和Android平台上的一款Vlog社区与编辑工具,允许用户通过简单的操作实现Vlog的拍摄。

vue3.0如何点击按钮弹出框

vue3.0点击+按钮后点击按钮弹出框。
查询vue官网显示,点击+按钮后弹出选项列表Member子组件,点击Member子组件上的按钮即可点击按钮弹出框。
vue3.0是iOS和Android平台上的一款Vlog社区与编辑工具,允许用户通过简单的操作实现Vlog的拍摄。

Vue - 简单实现一个命令式弹窗组件

在日常工作中弹窗组件是很常用的组件,但用得多还是别人的,空闲时间就自己来简单实现一个弹窗组件

涉及知识点:extend、 el

使用方式:

index.vue:组件布局、样式、交互逻辑

index.js:挂载组件、暴露方法

在此之前,了解下涉及的知识点

1. extend

使用这个api,可以将引入的vue组件变成vue构造函数,实例化后方便进行扩展

2. $mount

我们希望弹窗组件是在使用时才显示出来,那么就需要动态的向body中添加元素。使用$mount方法可以手动挂载一个vue实例,和 extend 刚好搭配使用,这个也是弹窗组件命令式的关键。

3. $el

既然要添加dom元素,通过实例的$el属性,正好可以取到dom元素,之后就是使用原生方法进行添加节点啦~

index.vue

index.js

main.js

上面我对外暴露的对象中含有install方法,这里可以使用Vue.use注册组件(使用Vue.use后,会查找install方法进行调用),将组件调用方法挂载到Vue原型上。

这个弹窗组件比较简陋,还有很多地方可以完善

Vue - 简单实现一个命令式弹窗组件

在日常工作中弹窗组件是很常用的组件,但用得多还是别人的,空闲时间就自己来简单实现一个弹窗组件

涉及知识点:extend、 el

使用方式:

index.vue:组件布局、样式、交互逻辑

index.js:挂载组件、暴露方法

在此之前,了解下涉及的知识点

1. extend

使用这个api,可以将引入的vue组件变成vue构造函数,实例化后方便进行扩展

2. $mount

我们希望弹窗组件是在使用时才显示出来,那么就需要动态的向body中添加元素。使用$mount方法可以手动挂载一个vue实例,和 extend 刚好搭配使用,这个也是弹窗组件命令式的关键。

3. $el

既然要添加dom元素,通过实例的$el属性,正好可以取到dom元素,之后就是使用原生方法进行添加节点啦~

index.vue

index.js

main.js

上面我对外暴露的对象中含有install方法,这里可以使用Vue.use注册组件(使用Vue.use后,会查找install方法进行调用),将组件调用方法挂载到Vue原型上。

这个弹窗组件比较简陋,还有很多地方可以完善

vue启动页上弹出隐私政策怎么实现?

在 Vue 项目中实现启动页上弹出隐私可以使用一个对话框组件。在这个组件中,可以使用 Vue 的 v-if 指令来控制对话框的显示/隐藏状态。在应用程序的入口文件中,可以在创建 Vue 实例之前使用该组件,并在用户同意隐私后再创建 Vue 实例。

下面是一个简单的示例:

创建一个对话框组件 PrivacyPolicy.vue。

vue提示弹窗插件(alert、confirm、msg)

-moles:放置模块的文件夹,里面有一个 alert 文件夹,用于存放 alert 插件 ;

-Alert.vue:就是我们要在多处用到提示弹窗组件;

-index.js:对于该自定义插件的一些配置;

1.alert

2.confirm

原文 https://blog.csdn.net/sinat_40697723/article/details/106036056

91汽车资讯网还为您提供以下相关内容希望对您有帮助:

vue-flow-editor怎么打开自定义的弹出框

1、首先,在utiljs文件中,从里面解构出message,这个东西看起来是个方法,里边实际上是一个组件。2、其次,把这个组件使用Vue单独进行渲染,渲染完之后单独挂在到一个节点上。3、最后,在DOM结构中,有两个节点,一个是写...

vue弹出框可见如何设置属性

1、在vue组件中添加一个data属性,用于控制弹出框的可见性2、在弹出框的dom元素中,使用v-show或v-if指令,将其与data属性绑定。3、在需要展示弹出框的事件或方法中,修改data属性的值,来触发弹出框的显示或隐藏。

vue-cli脚手架引入弹出层layer插件的几种方法

1.如何引入在vue-cli里,引入文件有几钟方法一种是用npm或者cnpm指令去下载对应的插件,然后在main.js里用import方法引入,这里不讨论这种方法我比较喜欢采用的是直接下载对应的js,然后引入到vue项目中去问题来了,如何引入...

vue中登录首页有优惠券弹,切换页面弹窗消失,再返回首页弹窗

vue中登录首页有优惠券弹,切换页面弹窗消失,再返回首页弹窗按以下步骤操作:1、在首页组件中,可以使用Vue的条件渲染功能,将优惠券弹窗组件包裹在一个v-if指令中。2、在首页组件的data选项中,定义一个showCouponPopup的布尔...

vue3.0如何点击按钮弹出框

vue3.0点击+按钮后点击按钮弹出框。查询vue官网显示,点击+按钮后弹出选项列表Member子组件,点击Member子组件上的按钮即可点击按钮弹出框。vue3.0是iOS和Android平台上的一款Vlog社区与编辑工具,允许用户通过简单的操作实现Vlog...

Vue - 简单实现一个命令式弹窗组件

1. extend 使用这个api,可以将引入的vue组件变成vue构造函数,实例化后方便进行扩展 2. $mount 我们希望弹窗组件是在使用时才显示出来,那么就需要动态的向body中添加元素。使用$mount方法可以手动挂载一个vue实例,和 extend...

vue提示弹窗插件(alert、confirm、msg)

-modules:放置模块的文件夹,里面有一个 alert 文件夹,用于存放 alert 插件 ;-Alert.vue:就是我们要在多处用到提示弹窗组件;-index.js:对于该自定义插件的一些配置;1.alert 2.confirm 原文 https://blog.csdn....

vue3为啥一进页面所有弹窗还没点就加载了

1、在Vue3中,可以使用v-if或v-show指令来控制组件的显示和隐藏。弹窗组件的显示属性在组件初始化时设置为true,则弹窗将自动显示。2、组件初始化时执行了弹出弹窗的代码,则弹窗将在页面加载时自动显示。

vue启动页上弹出隐私政策怎么实现?

在 Vue 项目中实现启动页上弹出隐私政策可以使用一个对话框组件。在这个组件中,可以使用 Vue 的 v-if 指令来控制对话框的显示/隐藏状态。在应用程序的入口文件中,可以在创建 Vue 实例之前使用该组件,并在用户同意隐私...

客户须知等内容在移动端弹窗查看分页vue如何实现

找到methods选项选择分页vue方法,就可实现客户须知等内容在移动端弹窗查看分页vue。选项选择分页vue方法后,当页面滚动到低部时去查询客户须知等内容,就可实现客户须知等内容在移动端弹窗查看分页vue。

Top