vue使用轻量级弹出层组件

后台管理系统经常会使用到弹出层进行表单数据填写,使用element-ui会发现弹出层的整体不美观,而且无法拖拽,换一个基于lay-ui弹出层的vue组件
lay-ui是一个基于jQuery的经典的UI框架,本次使用它的一个弹出层组件,基于vue封装的弹出层组件

1.安装vue-layer

npm install vue-layer

2 在程序入口添加,将组件添加到vue原型对象链上

import Vue from 'vue';
import layer from 'vue-layer'
import 'vue-layer/lib/vue-layer.css';
//挂载layer
Vue.prototype.$layer = layer(Vue);

3.调用实例

this.$layer.alert("找不到对象!");

4.属性值

{
  type: 0, //0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
  title: '信息',
  content: '',
  area: 'auto',
  offset: 'auto',
  icon: -1,
  btn: '确定',
  time: 0,
  shade: true,//是否显示遮罩
  yes: '',
  cancel: '',
  tips: [0,{}],//支持上右下左四个方向,通过1-4进行方向设定,可以设定tips: [1, '#c00']
  tipsMore: false,//是否允许多个tips
  shadeClose: true,//点击遮罩是否关闭
  maxmin: true,//开启最大化最小化
  scrollbar: true, //是否允许浏览器出现滚动条:默认是允许
  resize: false //是否允许拉伸,默认是不允许
}

5.常用的方法

layer.alert(content, [options, yes]);
 // options和yes可以省略, 如果您不愿意写options,则可以直接写确定按钮的函数,即yes
 // content 可以为html
 //yes如果是个function,这会自动添加参数layerid,
 (layerid)=>{
   this.$layer.close(layerid);
 }
layer.confirm(content, [options, yes, cancel]);
  // options,yes和cancel可以省略, 如果您不愿意写options,则可以直接写确定按钮的函数,即yes,或者覆盖默认的cancel方法。PS:yes和cancel方法不能互换
  //content 可以为html
   //yes,cancel如果是个function,这会自动添加参数layerid,
 (layerid)=>{
   this.$layer.close(layerid);
 }
layer.iframe({
  content: {
    content: componentName, //传递的组件对象
    parent: this,//当前的vue对象
    data:{}//props
  },
  area:['800px','600px'],
  title: 'title',
  cancel:()=>{//关闭事件
     alert('关闭iframe');
  }
});
layer.close(id);
layer.closeAll(type);
//弹窗最大化
layer.full(layerid);
//弹窗最小化
layer.min(layerid);
//还原弹窗
layer.restore(layerid);

关于this.$layer.iframe
其实使用iframe层,除了操作方便外,主要的目的是隔离代码, 降低代码复杂度。而在vue中,组件就是功能块的基本单位了,所以vue-layer中并不存在iframe的DOM元素,这里用的都是组件。 这里的content有三个参数:

content: 此参数为组件对象, 比如

import editFrom from ‘./edir-form.vue’;
此处content就为editFrom即可。

parent:

此参数其实就是当前调用layer的vue对象, 即this即可。在editForm中可以直接使用, this. p a r e n t l a y e r v u e e a s y 使 v u e x t h i s . parent来获取调用layer的vue对象,然后父子传值神马的,就很easy,当然也可以直接使用vuex,就不用this. parent了,另外自动注入了原始数据的浅拷贝lydata,也可以直接赋值这个数据来同步父对象的数据

data: 此参数可认为是editForm的props,传递到iframe后是这个数据的深拷贝,改变数据不会影响来源数据。

该方法会自动添加一个key为layerid的值, 该值为创建层的id, 可以直接使用
该方法会自动添加一个key为lydata的值, 该值为data的浅拷贝, 当iframe要更改父窗口传递的数据的时候,可以直接使用lydata来修改,对于表单使用非常方便

methods:{
   eidt() {
      this.$layer.iframe({
        content: {
          content: editForm, //传递的组件对象
          parent: this,//当前的vue对象
          data:{
        info:{a:1}
      }//props
        },
        area:['800px','600px'],
        title:"editForm"
      });
  }
}

iframe组件中

export default {
  data() {
    return {
      form: {
      }
    };
  },
  props: {
    info: {
      type: Object,
      default: () => {
        return {};
      }
    },
    layerid: {
      type: String,
      default: ""
    },
    lydata: {
      type: Object,
      default: () => {
        return {};
      }
    }
  },
  methods: {
    onSubmit() {
      this.$layer.msg("提交成功", () => {
        this.lydata.info.name = this.form.name;
        this.$layer.close(this.layerid);
      });
    },
    cancel() {
      this.$layer.close(this.layerid);
    }
  },
  mounted() {
    this.form = this.info;
  }
};

更多详情参照npm说明:https://www.npmjs.com/package/vue-layer

猜你喜欢

转载自blog.csdn.net/qq_38318330/article/details/107975765