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 相关文章推荐
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
Mar 11 Javascript
JSQL  一个 web DB 的封装
May 05 Javascript
jQuery$命名冲突怎么办如何解决
Jan 16 Javascript
document.addEventListener使用介绍
Mar 07 Javascript
js实现数字每三位加逗号的方法
Feb 05 Javascript
浅析JavaScript中的事件机制
Jun 04 Javascript
jquery表单验证需要做些什么
Nov 17 Javascript
去除html代码里面的script正则方法
May 19 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
Nov 15 Javascript
微信小程序实现底部导航
Nov 05 Javascript
ES6基础之默认参数值
Feb 21 Javascript
js 函数性能比较方法
Aug 24 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
php获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
php 强制下载文件实现代码
2013/10/28 PHP
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
浅谈JS的基础类型与引用类型
2016/09/13 Javascript
实现微信小程序的wxml文件和wxss文件在webstrom的支持
2017/06/12 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
Python操作CouchDB数据库简单示例
2015/03/10 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
个人思想理论学习的自我鉴定
2013/11/30 职场文书
村委会贫困证明
2014/01/14 职场文书
中文专业自荐书
2014/06/29 职场文书
解除同居协议书
2015/01/29 职场文书
理解python中装饰器的作用
2021/07/21 Python
Redis实战高并发之扣减库存项目
2022/04/14 Redis