用elm组件,新增和编辑用同一个弹窗,数据不清空

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用elm组件,新增和编辑用同一个弹窗,数据不清空相关的知识,希望对你有一定的参考价值。

参考技术A 场景:新增和编辑,使用同一个弹窗,在新增完成之后,清空弹窗,使用组件本身的resetFields()方法,可以重置校验,并把数据回复初试值。

我遇到这样一样问题:我先点击了编辑,在弹窗回显了组件,关闭u时,调用了resetFields()方法,再次点击新增,表单确实去除了校验,但是没有把数据恢复初始化。大致猜测原因:表单把我赋值用来回显的数据当成了初试数据。

解决方法:

在该组件文件中,引入Vue,在编辑事件方法里,弹窗弹出之后,做数据回显之前,加上nextTick()方法,让组件渲染完成之后,再回显数据

用vue2.x注册一个全局的弹窗alert组件

一、在实际的开发当中,弹窗是少不了的,默认系统的弹窗样式太丑,难以满足项目的实际需求,所以需要自己定义弹窗组件,把弹窗组价定义为全局的,这样减少每次使用的时候引入麻烦,节省开发时间。本文将分享如何定义一个全局的弹窗组件。下边开始上代码。

二、实际代码如下:

1.在components目录下的public目录新建一个文件夹alert,然后新建两个文件alert.vue和alert.scss。组件的样式代码我喜欢跟组件放到一起,这样按模块去划分管理。公共的样式就放到公共的样式文件里就行了。

技术分享图片

2.alert.vue代码如下

<template>
  <div class="alertModal" ref="alert">
    <!--social post弹框-->
      <transition name="fade">
          <div v-if="modelFlag==1" class="alertbox">
            <div class="alert-dialog">
              <div class="alert-content">
                <div class="alert-header">
                    <span  class="alertclose" @click="close">×</span>
                    <span class="alert-title">
                       {{modelTitle}}
                    </span>
                </div>
                <div class="alert-body">
                    {{modelContent}}
                </div>
                <div class="alert-footer">
                    <button class="alertbtn"  @click="close">{{modelClose}}</button>
                    <button class="alertbtn alert-info" @click="submit">{{modelSave}}</button>
                </div>
              </div>
            </div>
        </div>
      </transition>
      <div v-if="modelFlag==1" class="modal-backdrop"></div>
  </div>
</template>

<script>

export default {
    data(){
        return{
            modelFlag:0,//0为消失,1为显示
            modelTitle:‘Alert‘,//弹窗标题
            modelClose:‘取消‘,//取消按钮文字
            modelContent:‘‘,//弹窗内容
            modelSave:‘确定‘,//确定按钮文字
            callBack:null,//是否需要回调函数
        }
    },
    methods:{
        //回调函数
        doCallBack(){
            if(typeof this.callBack == ‘function‘){
                this.callBack()
                this.callBack=null;
            }
        },
        //关闭弹窗,数据重置
        close(){
           this.modelFlag=0;
           this.modelTitle=‘Alert‘;
           this.modelClose=‘取消‘;
           this.modelContent=‘‘;
           this.modelSave=‘确定‘;
           this.callBack=null;
        },
        //点击确定按钮弹窗消失
        submit(){
            this.close()
        },
        //显示弹窗,记性复制
        show(options){
            if(this.modelFlag==1){return};
            this.modelTitle=options.modelTitle||this.modelTitle;
            this.modelContent=options.modelContent;
            this.modelFlag=1;
            this.modelSave=options.modelSave||this.modelSave;
            this.modelClose=options.modelClose||this.modelClose;
            if(options.callBack){
                this.callBack=options.callBack;
                this.doCallBack()
            }
        },
    },
    watch:{
       
    }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="sass" scoped>
@import ‘alert.scss‘
</style>

3.在App.vue中引入组件并注册,

import alert from ‘components/public/alert/alert.vue‘
mounted(){
        Vue.prototype.$alert=this.$refs.alert;
    },
  components:{
      alert
  }
<alert ref=‘alert‘></alert>

在外层div下加上组件。

4.使用弹窗

比如我在一个页面那里点击一个button然后调用显示这弹窗,则:

<button @click="showalert">show alert</button>
methods:{
        showalert(){
               this.$alert.show({modelTitle:"Alert Msg",
                          modelContent:‘Please Check!‘})
        }
    },

this.$alert.show({modelTitle:"Alert Msg",modelContent:‘Please Check!‘}),show方法里边传一个对象,里边是相应的配置。

这样就可以使用啦!

技术分享图片

5.最后附上样式代码

.modal.fade .alert-dialog {
  -webkit-transition: -webkit-transform .3s ease-out;
       -o-transition:      -o-transform .3s ease-out;
          transition:         transform .3s ease-out;
  -webkit-transform: translate(0, -25%);
      -ms-transform: translate(0, -25%);
       -o-transform: translate(0, -25%);
          transform: translate(0, -25%);
}
.modal.in .alert-dialog {
  -webkit-transform: translate(0, 0);
      -ms-transform: translate(0, 0);
       -o-transform: translate(0, 0);
          transform: translate(0, 0);
}
.alertbox{
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    text-align: center;
    z-index: 99999;
}
.alert-dialog{
    display: inline-block;
    width: 420px;
    padding-bottom: 10px;
    vertical-align: middle;
    background-color: #fff;
    border-radius: 4px;
    border: 1px solid #e6ebf5;
    font-size: 18px;
    box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
    text-align: left;
    overflow: hidden;
    backface-visibility: hidden;
    position: relative;
    top: 140px;
    padding: 10px 15px;
}
.modal-backdrop.fade {
  filter: alpha(opacity=0);
  opacity: 0;
}
.modal-backdrop.in {
  filter: alpha(opacity=50);
  opacity: .5;
}
.alert-footer{
    float: right;
    margin-top: 5px;
}
.alert-scrollbar-measure {
  position: absolute;
  top: -9999px;
  width: 50px;
  height: 50px;
  overflow: scroll;
}


.fade-enter-active, .fade-leave-active {
  transition: opacity .5s
}
.fade-enter, .fade-leave-to /* .fade-leave-active in <2.1.8 */ {
  opacity: 0
}
.modal-backdrop {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1040;
    background-color: #000;
    opacity: 0.5;
}

.el-icon-date{
    cursor: pointer;
}
.alert-header{
    
}
.alert-title{
    font-size: 18px;
    line-height: 1;
    color: #2d2f33;
}
.alert-body{
    padding: 10px 0px;
    color: #5a5e66;
    font-size: 14px;
    line-height: 17px;
}
.alertbtn{
    text-align: center;
    font-weight: 500;
    cursor: pointer;
    padding: 9px 15px;
    font-size: 12px;
    border-radius: 3px;
    line-height: 1;
    background: #fff;
    border: 1px solid #d8dce5;
    border-color: #d8dce5;
    color: #5a5e66;
}
.alert-info{
    color: #fff;
    background-color: #409eff;
    border-color: #409eff;
}
.alertclose{
    float: right;
    cursor: pointer;
}

 希望对大家有用。


以上是关于用elm组件,新增和编辑用同一个弹窗,数据不清空的主要内容,如果未能解决你的问题,请参考以下文章

element-ui 表单编辑之后再新增表单数据无法清空问题(已解决)

VUE 父组件调用子组件弹窗

el-dialog 业务应用

函数式编程中的战斗机--elm编写实例(薛定鄂的猫)

用react做项目时弹窗是用hidden控制显示隐藏的方法还是用组件,组件都有哪些呢

品牌新增