广告
返回顶部
首页 > 资讯 > 前端开发 > html >vue中怎么实现一个模态框组件
  • 429
分享到

vue中怎么实现一个模态框组件

2024-04-02 19:04:59 429人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关Vue中怎么实现一个模态框组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。组件结构<template> &nbs

这期内容当中小编将会给大家带来有关Vue中怎么实现一个模态框组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

组件结构

<template>     <div class="modal" v-show="show" transition="fade">         <div class="modal-dialog">             <div class="modal-content">                 <!--头部-->                 <div class="modal-header">                     <slot name="header">                         <p class="title">{{modal.title}}</p>                     </slot>                     <a v-touch:tap="close(0)" class="close" href="javascript:void(0)"></a>                 </div>                 <!--内容区域-->                 <div class="modal-body">                     <slot name="body">                         <p class="notice">{{modal.text}}</p>                     </slot>                 </div>                 <!--尾部,操作按钮-->                 <div class="modal-footer">                     <slot name="button">                         <a v-if="modal.showCancelButton" href="javascript:void(0)" class="button {{modal.cancelButtonClass}}" v-touch:tap="close(1)">{{modal.cancelButtonText}}</a>                         <a v-if="modal.showConfirmButton" href="javascript:void(0)" class="button {{modal.confirmButtonClass}}" v-touch:tap="submit">{{modal.confirmButtonText}}</a>                     </slot>                 </div>             </div>         </div>     </div>     <div v-show="show" class="modal-backup" transition="fade"></div> </template>

模态框结构分为三部分,分别为头部、内部区域和操作区域,都提供了slot,可以根据需要定制。

样式

.modal {     position: fixed;     left: 0;     top: 0;     right: 0;     bottom: 0;     z-index: 1001;     -WEBkit-overflow-scrolling: touch;     outline: 0;     overflow: scroll;     margin: 30/@rate auto; } .modal-dialog {     position: absolute;     left: 50%;     top: 0;     transfORM: translate(-50%,0);     width: 690/@rate;     padding: 50/@rate 40/@rate;     background: #fff; } .modal-backup {     position: fixed;     top: 0;     right: 0;     bottom: 0;     left: 0;     z-index: 1000;     background: rgba(0, 0, 0, 0.5); }

这里只是一些基本样式,没什么好说的,这次项目是在移动端,用了淘宝的自适应布局方案,@rate是切稿时候的转换率。

接口定义

 props: ['modalOptions'], computed: {          modal: {         get() {             let modal = this.modalOptions;             modal = {                 title: modal.title || '提示',                 text: modal.text,                 showCancelButton: typeof modal.showCancelButton === 'undefined' ? true : modal.showCancelButton,                 cancelButtonClass: modal.cancelButtonClass ? modal.showCancelButton : 'btn-default',                 cancelButtonText: modal.cancelButtonText ? modal.cancelButtonText : '取消',                 showConfirmButton: typeof modal.showConfirmButton === 'undefined' ? true : modal.cancelButtonClass,                 confirmButtonClass: modal.confirmButtonClass ? modal.confirmButtonClass : 'btn-active',                 confirmButtonText: modal.confirmButtonText ? modal.confirmButtonText : '确定',             };             return modal;         },     }, },

这里定义了接口的参数,可以自定义标题、内容、是否显示按钮和按钮的样式,用一个computed来做参数默认值的控制。

模态框内部方法

data() {     return {         show: false,   // 是否显示模态框         resolve: '',         reject: '',         promise: '',  // 保存promise对象     }; }, methods: {          submit() {         this.resolve('submit');     },          close(type) {         this.show = false;         this.reject(type);     },          confirm() {         this.show = true;         this.promise = new Promise((resolve, reject) => {             this.resolve = resolve;             this.reject = reject;         });         return this.promise;   //返回promise对象,给父级组件调用     }, },

在模态框内部定义了三个方法,最核心部分confirm方法,这是一个定义在模态框内部,但是是给使用模态框的父级组件调用的方法,该方法返回的是一个promise对象,并将resolve和reject存放于modal组件的data中,点击取消按钮时,断定为reject状态,并将模态框关闭掉,点确定按钮时,断定为resolve状态,模态框没有关闭,由调用modal组件的父级组件的回调处理完成后手动控制关闭模态框。

调用

<!-- template --> <confirm v-ref:dialog :modal-options.sync="modal"></confirm> <!-- methods --> this.$refs.dialog.confirm().then(() => {     // 点击确定按钮的回调处理     callback();     this.$refs.dialog.show = false;  }).catch(() => {     // 点击取消按钮的回调处理     callback(); });

用v-ref创建一个索引,就很方便拿到模态框组件内部的方法了。这样一个模态框组件就完成了。

其他实现方法

在模态框组件中,比较难实现的应该是点击确定和取消按钮时,父级的回调处理,我在做这个组件时,也参考了一些其实实现方案。

使用事件转发

这个方法是我的同事实现的,用在上一个项目,采用的是$dispatch和$broadcast来派发或广播事件。

首先在根组件接收dispatch过来的transmit事件,再将transmit事件传递过来的eventName广播下去

events: {          'transmit': function (eventName, arg) {         this.$broadcast(eventName, arg);     } },

其次是模态框组件内部接收从父级组件传递过来的确定和取消按钮所触发的事件名,点击取消和确定按钮的时候触发

// 接收事件,获得需要取消和确定按钮的事件名 events: {     'tip': function(obj) {         this.events = {             cancel: obj.events.cancel,             confirm: obj.events.confirm         }     } } // 取消按钮 cancel:function() {     this.$dispatch('transmit',this.events.cancel); } // 确定按钮 submit: function() {     this.$dispatch('transmit',this.events.submit); }

在父级组件中调用模态框如下:

this.$dispatch('transmit','tip',{     events: {         confirm: 'confirmEvent'     } }); this.$once('confirmEvent',function() {     callback(); }

先是传递tip事件,将事件名传递给模态框,再用$once监听确定或取消按钮所触发的事件,事件触发后进行回调。

这种方法看起来是不是很晕?所以vue  2.0取消了$dispatch和$broadcast,我们在最近的项目中虽然还在用1.0,但是也不再用$dispatch和$broadcast,方便以后的升级。

使用emit来触发

这种方法来自vue-bootstrap-modal,点击取消和确定按钮的时候分别emit一个事件,直接在组件上监听这个事件,这种做法的好处是事件比较容易追踪。

// 确定按钮 ok () {     this.$emit('ok');     if (this.closeWhenOK) {         this.show = false;     } }, // 取消按钮 cancel () {     this.$emit('cancel');     this.show = false; },

调用:

<modal title="Modal Title" :show.sync="show" @ok="ok" @cancel="cancel">     Modal Text </modal>

上述就是小编为大家分享的vue中怎么实现一个模态框组件了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网html频道。

--结束END--

本文标题: vue中怎么实现一个模态框组件

本文链接: https://www.lsjlt.com/news/71965.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue中怎么实现一个模态框组件
    这期内容当中小编将会给大家带来有关vue中怎么实现一个模态框组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。组件结构<template> &nbs...
    99+
    2022-10-19
  • vue.extend中怎么实现一个alert模态框弹窗组件
    这篇文章将为大家详细讲解有关vue.extend中怎么实现一个alert模态框弹窗组件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。alert.js文件代码...
    99+
    2022-10-19
  • Vue中怎么实现一个单文件组件
    这期内容当中小编将会给大家带来有关Vue中怎么实现一个单文件组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。背景相信大家在使用Vue开发项目时,基本都是以单文件组件的形...
    99+
    2022-10-19
  • vue-cli3中怎么实现一个fullpage组件
    本篇文章为大家展示了vue-cli3中怎么实现一个fullpage组件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。准备$ npm i ...
    99+
    2022-10-19
  • vue中怎么实现一个翻页组件
    这篇文章将为大家详细讲解有关vue中怎么实现一个翻页组件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先,翻页组件(以下称“pager组件”)一般拥有的元...
    99+
    2022-10-19
  • Vue中怎么实现一个异步组件
    今天就跟大家聊聊有关Vue中怎么实现一个异步组件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。index.html<!DOCTYPE ...
    99+
    2022-10-19
  • Vue中怎么实现一个树形组件
    Vue中怎么实现一个树形组件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体如下:使用SemanticUI和vue做一个me...
    99+
    2022-10-19
  • vue中怎么封装一个弹出框组件
    这期内容当中小编将会给大家带来有关vue中怎么封装一个弹出框组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.你需要先建一个弹出框的模板://首先创建一个mack.v...
    99+
    2022-10-19
  • vue-star中怎么实现一个评星组件
    vue-star中怎么实现一个评星组件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。star文件夹下建立Star.vue,及相关的图片信息...
    99+
    2022-10-19
  • Vue中怎么实现一个全局loading组件
    Vue中怎么实现一个全局loading组件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。loading.js:import '...
    99+
    2022-10-19
  • vue中怎么实现一个toast弹窗组件
    本篇文章给大家分享的是有关vue中怎么实现一个toast弹窗组件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先,我们来分析一下弹窗组件的特...
    99+
    2022-10-19
  • Vue中怎么实现一个表情输入组件
    这篇文章将为大家详细讲解有关Vue中怎么实现一个表情输入组件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。html区域<template> &n...
    99+
    2022-10-19
  • vue中怎么实现一个上传图片组件
    本篇文章给大家分享的是有关vue中怎么实现一个上传图片组件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.首先得有一个[type=file]...
    99+
    2022-10-19
  • 使用Ajax怎么实现一个动态加载组合框
    这篇文章将为大家详细讲解有关使用Ajax怎么实现一个动态加载组合框,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一  province.jsp<%@ page&nb...
    99+
    2023-06-08
  • Vue 中怎么实现一个短信验证码组件
    本篇文章给大家分享的是有关Vue 中怎么实现一个短信验证码组件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、 Vue 组件代码如下:Vue...
    99+
    2022-10-19
  • Vue中怎么实现一个底部导航栏组件
    今天就跟大家聊聊有关Vue中怎么实现一个底部导航栏组件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。<template> <di...
    99+
    2022-10-19
  • C#中怎么实现一个动态数组
    C#中怎么实现一个动态数组,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。数组的容量是固定的,但ArrayList的容量可以根据需要自动扩充。当我们修改了ArrayList的...
    99+
    2023-06-17
  • JavaScript实现一个输入框组件
    本文实例为大家分享了手动实现一个输入框组件的具体代码,供大家参考,具体内容如下 背景 taro h5中想要实现一个样式如下的输入框: 问题: taro组件和taro-ui组件中都没...
    99+
    2022-11-12
  • vue中怎么自定义一个全局消息框组件
    这篇文章将为大家详细讲解有关vue中怎么自定义一个全局消息框组件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.发现问题在进行移动端适配的时候,为了在各个...
    99+
    2022-10-19
  • 微信小程序中怎么实现一个搜索框组件
    今天就跟大家聊聊有关微信小程序中怎么实现一个搜索框组件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。search.wxml<view ...
    99+
    2022-10-19
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作