zoukankan      html  css  js  c++  java
  • iview之Model对话框封装

    使用iview的Model对话框引发的问题:弹窗只能打开一次,或者压根触发不了。
    排查后是由于不同于其他放方法传递形式,导致this.$emit无法触发父组件的方法。

    要点记录:
    1、父组件传递方法给子组件,要求以@on为方法名前缀

    @on-方法名="父组件方法名"
    

    子组件调用父组件的方法:this.$emit('on-方法名');
    2、对话框只要一个按钮的情况下,将取消按钮的文本设置为空,则不显示。如果设置确定按钮的文本为空则无效。
    3、可以直接取用props中的开关属性,也可以另外在data中定义开关属性,将props的开关属性赋值给data的开关属性。在data中另外定义属性的方式一般用于
    需要在子组件中对该属性做其他的逻辑处理。
    4、通过监听props中的开关属性,实现开关切换。
    5、在没有标题的情况下,不显示右上角的关闭按钮,可设置closable属性值为false。文中的方式是将右上角的关闭按钮与标题绑定,在没有标题的情况下不显
    示右上角的关闭按钮。
    拓展:对于组件封装,都是为了可以重复使用的原因。但往往相同中总会有一些小变动,比如A、B弹窗要求的按钮颜色不一样,这时候可以通过增加样式传递的
    方式,或者传递不同的class名,在子组件中做不同的按钮样式定义,加入具体注释,就可以不用重复的新建相同组件了。

    完整代码

    父组件调用:

    <div>
       <Button type="primary" @click="modal3 = true">封装对话框组件</Button>
      <md :modelVisible="modal3" 
      :title="''"
      :cancelText="''" 
      @on-close-cancel="closeModel"
      @on-open="openModel">
          <Button type="primary" @click="modal1 = true">Display dialog box</Button>
      </md>
    </div>
    

    父组件脚本:

    import md from '../../components/ModalDynamic';
    export default {
        name: "",
        data() {
            return{
                modal3: false
            };
        },
        components:{
            md
        },
        methods: {
            closeModel() {
                console.log('弹窗关闭');
                this.modal3 = false
            },
            openModel(obj) {
                console.log('弹窗关闭并返回弹窗数据', obj);
                this.modal3 = false
            }
        }
    }
    

    子组件:

    <template>
        <div class="yu-dynamic-model">
            <Modal
                v-model="modelVisible"
                :width="width"
                :scrollable="true"
                :closable="closableRight"
                :ok-text="okText"
                :cancel-text="cancelText"
                :mask-closable="false">
                <slot />
                <div v-if="title" slot="header" class="model-header">
                    <span>{{title}}</span>
                </div>
                <div slot="footer" class="model-footer">
                    <Button v-if="cancelText" @click="cancel">{{ cancelText }}</Button>
                    <Button v-if="okText" type="primary" @click="ok">{{ okText }}</Button>
                </div>
            </Modal>
        </div>
    </template>
    
    <script>
    export default {
        name: "",
        props: {
            modelVisible: {
                type: Boolean,
                default: () => false
            },
            title: {
                type: String,
                default: ''
            },
            okText: {
                type: String,
                default: '确定'
            },
            cancelText: {
                type: String,
                default: '取消'
            },
            {
                type: Number,
                default: 50
            }
        },
        data() {
            return{
                modelShow: this.modelVisible,
                closableRight: this.title ? true : false
            }
        },
        watch: {
            modelVisible: {
                handler: function(n, o){
                    this.modelShow = n;
                }
            }
        },
        methods: {
            ok() {
                this.modelShow = false;
                this.$emit('on-open',false);
            },
            cancel() {
                this.modelShow = false;
                this.$emit('on-close-cancel', false);
            }
        }
    }
    </script>
    
  • 相关阅读:
    部署prerender服务器
    Bzoj4727--Poi2017Turysta
    Bzoj4818--Sdoi2017序列计数
    Heoi2014系列题解
    scoi2017酱油记
    Burnside引理与Pólya定理
    2017省选前北京集训总结
    奥妙重重的随机发生器
    ???--???Insection is not allowed
    反演
  • 原文地址:https://www.cnblogs.com/min77/p/15500090.html
Copyright © 2011-2022 走看看