vue一步步实现alert功能


Posted in Javascript onJuly 05, 2017

原生alert的缺点

  1. 会阻塞一切操作,影响用户体验
  2. 很多浏览器会默认静止alert,例如微信。
  3. 原生alert框样式丑陋。

vue一步步实现alert功能

项目地址: web-style 项目里有css样式和vue组件。目标是快速构建后台系统。有一定自适应的设计。

css

思路:最外层是一个黑色透明撑满全屏幕的div并且是fixed的div.modal-mask

在mask内部是一个垂直居中的div框大小可以固定。垂直居中方法有几种可选。我选用的是flex。关键性的css代码如下

.modal-mask{
 position: fixed;
 top: 0;
 left: 0;
 right: 0;
 bottom: 0;
 background-color: rgba(55,55,55,.6);
 z-index: 100;
 display: flex;
 align-items: center;
 justify-content: center;
}
.modal-confirm{
 width: 400px;
 box-sizing: border-box;
 padding: 30px 40px;
 background-color: #fff;
 border-radius: 6px;
}
@media only screen and (max-width: 640px) {
 .modal-confirm{
  width: 100%;
  margin: 0 20px;
  padding: 10px 20px; 
 }
}

其中modal-confirm是alert框,有固定的宽度400px 还有padding。 然后我们做了一个小小的自适应。 在小屏上(屏幕宽度小于640px)取消了固定宽度。减少了padding的值,看起来更小巧。

开发vue组件

vue template

首先我希望这个组件功能能像原生的alert事件一样随时随地的方便调用。 不希望每次都new Vue({})一个实例。 所以我做了一些不一样的设计。

<div class="modal-mask" v-show="show">
    <div class="modal-confirm">
      <h2 class="confirm-header">
        <i class="iconfont icon-questioncircle"></i> {{ title }}
      </h2>
      <div class="confirm-content">
        {{ content }}
      </div>
      <div class="confirm-btns">
        <button class="btn" @click="op(1)">取 消</button>
        <button class="btn btn-primary" @click="op(2)">确 定</button>
      </div>
    </div>
  </div>

v-show是控制alert组件的显示和隐藏的指令。 {{ }}是vue默认的模版标记。

@click 是绑定click事件的指令

vue data

new Vue({
  el: '#V-confirm',
  data: {
       show: false,
       onCancel: false,
       onOk: false,
       title: '',
       content: ''
     }
  })
  1. show 是控制显示隐藏的标记。
  2. onCancel onOk 是点击取消或者确定时候触发的回调。
  3. title content 是alert显示的文本。

vue methods

methods: {
   op(type){
    this.show = false
    if(type == '1'){
     if(this.onCancel) this.onCancel()
    }else{
     if(this.onOk) this.onOk()
    }

    this.onCancel = false
    this.onOk = false
    
    document.body.style.overflow = ''
   },
   alert(setting){
    this.title = setting.title || '标题'
    this.content = setting.content || '内容'
    this.onOk = setting.onOk || false
    this.onCancel = setting.onCancel || false
    this.show = true
    document.body.style.overflow = 'hidden'
   }
  }
 }
  1. alert(setting) 方法是控制显示alert组件的方法。接受一个object的参数配置。
  2. op(type) 方法是点击取消和确定按钮的时候触发的时候。

hack代码

var element = document.createElement('div');
 element.id = 'V-confirm'
 element.innerHTML = template
 document.body.appendChild(element)

这一段代码作用是一开始就把vue实例插入到 body 底部,方便直接 alert 调用。

加入一些动画效果

依赖的是vue指令 transition 具体的用法教程 大家去过渡-传送门

.modal-enter, .modal-leave {
 opacity: 0;
}
.modal-transition{
 transition: all .3s ease;
}

.modal-enter .modal-confirm,
.modal-leave .modal-confirm {
 transform: scale(1.1);
}
.modal-transition{
 transition: all .3s ease;
}

用法

var setting = {}
  setting.title = '你确定删除吗?'
  setting.content = '删除不可以恢复...'
  setting.onOk = function(){}
  setting.onCancel = function(){}
  
  
$confirm.alert(setting)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
Aug 23 Javascript
jQuery中:first选择器用法实例
Dec 30 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
Feb 16 Javascript
Javascript中获取对象的原型对象的方法小结
Feb 25 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
Oct 02 Javascript
JavaScript模拟数组合并concat
Mar 06 Javascript
JS 拦截全局ajax请求实例解析
Nov 29 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
Jul 27 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
Dec 09 Javascript
Vue和React组件之间的传值方式详解
Jan 31 Javascript
React学习之受控组件与数据共享实例分析
Jan 06 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
Apr 29 Javascript
详解vue.js移动端导航navigationbar的封装
Jul 05 #Javascript
JS实现移动端按首字母检索城市列表附源码下载
Jul 05 #Javascript
webpack教程之webpack.config.js配置文件
Jul 05 #Javascript
webstorm添加vue.js支持的方法教程
Jul 05 #Javascript
vue.js实现刷新当前页面的方法教程
Jul 05 #Javascript
vue router2.0二级路由的简单使用
Jul 05 #Javascript
详解使用Node.js 将txt文件转为Excel文件
Jul 05 #Javascript
You might like
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
Vue如何实现监听组件原生事件
2020/07/03 Javascript
python opencv 图像尺寸变换方法
2018/04/02 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
python的常见矩阵运算(小结)
2019/08/07 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
python源文件的字符编码知识点详解
2021/03/04 Python
货代行业个人求职简历的自我评价
2013/10/22 职场文书
《夜晚的实验》教学反思
2014/02/19 职场文书
怎样写辞职信
2015/02/27 职场文书
决心书格式及范文
2019/06/24 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis
MySQL七种JOIN类型小结
2021/10/24 MySQL
Python 数据可视化之Bokeh详解
2021/11/02 Python
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis