vue 2.0封装model组件的方法


Posted in Javascript onAugust 03, 2017

本文介绍了vue 2.0封装model组件的方法,分享给大家,希望对大家有所帮助

单文件组件

使用单文件组件封装model的模板、逻辑和样式,之后就可以在页面中调用此通用组件。

vue 2.0封装model组件的方法

需求

model有两个使用场景:

1、备注/修改密码(简易):

在屏幕中垂直居中
2、添加/修改/展示信息(复杂):

距离屏幕顶部200px,内容过长时可滚动。

3、常规要求(共同点):

标题,关闭icon

点击确定/关闭/遮罩,隐藏model组件

分析上述需求点,得到如下图:

vue 2.0封装model组件的方法

  • wrapper:负责遮盖屏幕
  • inner:负责垂直居中/距顶部200px
  • title:可变化标题
  • content:可变化的内容区域

方案

1、Prop传参
title(标题)、show(隐藏/显示)、width(宽度)、type(居中/顶部)

2、自定义事件
关闭model

3、slot分发
内容区域可自定义

4、滚动穿透

具体实现

template

<div class="model-mask" v-show="show">
  <div :class="[type === 'top' ? 'model-wrapper-top' : 'model-wrapper']" @click="close">
   <div :class="[type === 'top' ? 'model-container-top' : 'model-container']"
    :style="{width:width + 'px'}">
    <div class="model-header">
     <span>{{title}}</span>
     <i class="close-empty" @click="close">
      <Icon
       type="ivu-icon ivu-icon-ios-close-empty"
       size="25" />
     </i>
    </div>
    <div class="model-body">
     <slot></slot>
    </div>
   </div>
  </div>
 </div>

script

export default {
 name: 'MyModel',
 props:
 {
  title: String,
  show: Boolean,
  width: Number,
  type: String
 },
 data () {
  return {
   scrollTop: ''
  }
 },
 watch: {
  show: function (val, oldVal) {
   function getScrollTop () {
    return document.body.scrollTop || document.documentElement.scrollTop
   }
   if (val) {
    // 在弹出层显示之前,记录当前的滚动位置
    this.scrollTop = getScrollTop()
    let body = document.querySelector('body')
    body.className = 'not-scroll'
    // 把脱离文档流的body拉上去!否则页面会回到顶部!
    document.body.style.top = -this.scrollTop + 'px'
   }
  }
 },
 methods: {
  close: function (e) {
   function to (scrollTop) {
    document.body.scrollTop = document.documentElement.scrollTop = scrollTop
   }
   let target = e.srcElement || e.target
   if (target.className === 'model-wrapper' ||
     target.className.indexOf('ivu-icon-ios-close-empty') > -1 ||
     target.className === 'model-wrapper-top') {
    this.$emit('close')
    let body = document.querySelector('body')
    body.className = ''
    // 滚回到老地方!
    to(this.scrollTop)
   }
  }
 }
}

style

<style scoped lang="scss">
.model-mask {
 height: 100%;
 position: fixed;
 top: 0;
 bottom: 0;
 left: 0;
 right: 0;
 z-index: 1000;
 background: rgba(0, 0, 0, .5);
}
/**
 * 垂直居中
 */
.model-wrapper {
 height: 100%;
 text-align: center;
}
.model-wrapper:before {
 content: "";
 display: inline-block;
 height: 100%;
 vertical-align: middle;
}
.model-container {
 position: relative;
 display: inline-block;
 vertical-align: middle;
 background-color: white;
 text-align: left;
 box-shadow: 0 5px 14px 0 rgba(0,0,0,0.15);
 border-radius: 6px;
 overflow: hidden;
 z-index: 1050;
}
/**
 * 距离顶部100px,可滚动
 */
.model-wrapper-top {
 position: relative;
 height: 100%;
 overflow-x: hidden;
 overflow-y: scroll;
}
.model-container-top {
 margin: 100px auto;
 background-color: white;
 text-align: left;
 box-shadow: 0 5px 14px 0 rgba(0,0,0,0.15);
 border-radius: 6px;
 overflow: hidden;
}
.close-empty {
 position: absolute;
 right: 16px;
 top: 10px;
 overflow: hidden;
 cursor: pointer;
 z-index: 1100;
}
.model-header {
 position: relative;
 height: 45px;
 line-height: 45px;
 padding: 0 20px;
 font-size: 14px;
 color: #999;
 border-bottom: 1px solid #eee;
}
</style>

引用

<button type="button" @click="showModel">戳我呀</button>
import MyModel from '../componets/model.vue'
export default {
 name: 'test',
 components: {
  MyModel
 },
 data () {
  return {
   show: false
  }
 },
 methods: {
  /**
   * 打开model
   */
  closeModel: function () {
   this.show = false
  },
  /**
   * 关闭model
   */
  showModel: function () {
   this.show = true
  }
 }
}

引用一

<my-model title="标题" :width="400" :show="show" v-on:close="closeModel">
   <!-- slot -->
   <div class="tips">
     <p>this is content area。</p>
   </div>
  </my-model>

引用二

<my-model type="top" title="标题" :width="400" :show="show" v-on:close="closeModel">
   <!-- slot -->
   <div class="tips">
     <p v-for="i in 50">this is content area。</p>
   </div>
  </my-model>

demo

垂直居中

vue 2.0封装model组件的方法

距顶部200px,可滚动

vue 2.0封装model组件的方法

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

Javascript 相关文章推荐
js调用图片隐藏&amp;显示实现代码
Sep 13 Javascript
javascript获取所有同类checkbox选项(实例代码)
Nov 07 Javascript
jQuery及JS实现循环中暂停的方法
Feb 02 Javascript
jQuery查找节点方法完整实例
Sep 13 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
Oct 25 Javascript
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
Feb 14 Javascript
详解JS数组Reduce()方法详解及高级技巧
Aug 18 Javascript
vue 添加vux的代码讲解
Nov 30 Javascript
JavaScript中set与get方法用法示例
Aug 15 Javascript
jQuery 操作 HTML 元素和属性的方法
Nov 12 jQuery
浅谈vuex actions和mutation的异曲同工
Dec 13 Javascript
在Vue中实现随hash改变响应菜单高亮
Mar 09 Javascript
jQuery实现上传图片前预览效果功能
Aug 03 #jQuery
详解基于vue的移动web app页面缓存解决方案
Aug 03 #Javascript
Bootstrap与Angularjs的模态框实例代码
Aug 03 #Javascript
基于 Bootstrap Datetimepicker 联动
Aug 03 #Javascript
详解react-webpack2-热模块替换[HMR]
Aug 03 #Javascript
webpack开发跨域问题解决办法
Aug 03 #Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
Aug 03 #Javascript
You might like
PHP多线程抓取网页实现代码
2010/07/22 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
Javascript 模式实例 观察者模式
2009/10/24 Javascript
js DOM模型操作
2009/12/28 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
2011/12/08 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
jQuery表单设置值的方法
2017/06/30 jQuery
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
vue element-ui中table合计指定列求和实例
2020/11/02 Javascript
python杀死一个线程的方法
2015/09/06 Python
python WindowsError的错误代码详解
2017/07/23 Python
python xlsxwriter创建excel图表的方法
2018/06/11 Python
python ChainMap的使用和说明详解
2019/06/11 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
简单html5代码获取地理位置
2014/03/31 HTML / CSS
会计电算化专业应届大学生求职信
2013/10/22 职场文书
大学本科毕业生的自我鉴定
2013/11/26 职场文书
计算机科学系职业生涯规划书
2014/03/08 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
生产操作工岗位职责
2014/09/16 职场文书
大学生年度个人总结
2015/02/15 职场文书
告知书格式
2015/07/01 职场文书
社区安全温馨提示语
2015/07/14 职场文书
中秋节随笔
2015/08/15 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
JavaScript的function函数详细介绍
2021/11/20 Javascript