【问题标题】:Vue.js 2: Modal Dialog - close when Method is successfulVue.js 2:模式对话框 - 方法成功时关闭
【发布时间】:2018-10-27 15:24:06
【问题描述】:

我有以下指令:

import Vue from 'vue'

const Dialog = Vue.extend({
    template: `
    <div v-if="show" class="modal">
        <div class="modal-body">
            <div class="modal-header"><h3>Aktion bestätigen</h3></div>
            <div class="modal-content">
                <div class="uk-flex">
                    <div class="uk-margin-small-right">
                        <span uk-icon="icon: question; ratio: 3"></span>
                    </div>
                    <div>
                        Are You sure?
                    </div>
                </div>
                <hr>
                <div class="uk-flex uk-flex-right">
                    <button class="uk-button uk-button-danger uk-margin-small-right" @click="confirmed">Yes</button>
                    <button class="uk-button uk-button-default" @click="show = false">Cancel</button>
                </div>
            </div>
        </div>
    </div>
  `
});

Vue.directive('confirm', {
    bind(el, binding, vnode) {
        let confirm_method = binding.value;
        el.handleClick = (e) => {
            const data = { confirmed: confirm_method , show: true};
            let dialog = new Dialog({data: data}).$mount();
            document.getElementsByTagName('body')[0].appendChild(dialog.$el);
        }
        el.addEventListener('click', el.handleClick);
    },
    unbind(el) {
        el.removeEventListener('click', el.handleClick);
    }
});

这很好用。当我单击“取消”时,模式关闭。当我点击“是”时,Vue模板中定义的方法

<button v-confirm="delete">delete</button>

被执行。

但是模态没有出现。方法执行后,如何告诉modal关闭,并在出现错误时显示错误消息?

【问题讨论】:

    标签: modal-dialog vuejs2


    【解决方案1】:

    您可以将methods 传递给Dialog:

    Vue.directive('confirm', {
        bind(el, binding, vnode) {
             let confirm_method = binding.value;
             el.handleClick = (e) => {
                 const data = { confirmed: confirm_method , show: true};
                 let dialog = new Dialog({
                            data: data, 
                      methods: {
                        confirmedInternal() {
                          this.show = false
                          this.confirmed()
                        }
                      }
                 }).$mount();
                 document.getElementsByTagName('body')[0].appendChild(dialog.$el);
             }
             el.addEventListener('click', el.handleClick);
        },
        unbind(el) {
            el.removeEventListener('click', el.handleClick);
        }
    });
    

    然后在单击yes 按钮时调用confirmedInternal

     <button class="uk-button uk-button-danger uk-margin-small-right" @click="confirmedInternal">Yes</button>
    

    演示:https://jsfiddle.net/guqc2src/

    【讨论】:

    • 没问题!快乐的编码:D
    【解决方案2】:

    Vue 文档有pretty good example of modal
    关键选项是$emit('close')。您可以在方法成功时致电$emit('close')

    // register modal component
    Vue.component('modal', {
      template: '#modal-template'
    })
    
    // start app
    new Vue({
      el: '#app',
      data: {
        showModal: false
      }
    })
    .modal-mask {
      position: fixed;
      z-index: 9998;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, .5);
      display: table;
      transition: opacity .3s ease;
    }
    
    .modal-wrapper {
      display: table-cell;
      vertical-align: middle;
    }
    
    .modal-container {
      width: 300px;
      margin: 0px auto;
      padding: 20px 30px;
      background-color: #fff;
      border-radius: 2px;
      box-shadow: 0 2px 8px rgba(0, 0, 0, .33);
      transition: all .3s ease;
      font-family: Helvetica, Arial, sans-serif;
    }
    
    .modal-header h3 {
      margin-top: 0;
      color: #42b983;
    }
    
    .modal-body {
      margin: 20px 0;
    }
    
    .modal-default-button {
      float: right;
    }
    
    /*
     * The following styles are auto-applied to elements with
     * transition="modal" when their visibility is toggled
     * by Vue.js.
     *
     * You can easily play with the modal transition by editing
     * these styles.
     */
    
    .modal-enter {
      opacity: 0;
    }
    
    .modal-leave-active {
      opacity: 0;
    }
    
    .modal-enter .modal-container,
    .modal-leave-active .modal-container {
      -webkit-transform: scale(1.1);
      transform: scale(1.1);
    }
    <script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
    <!-- template for the modal component -->
    <script type="text/x-template" id="modal-template">
      <transition name="modal">
        <div class="modal-mask">
          <div class="modal-wrapper">
            <div class="modal-container">
    
              <div class="modal-header">
                <slot name="header">
                  default header
                </slot>
              </div>
    
              <div class="modal-body">
                <slot name="body">
                  default body
                </slot>
              </div>
    
              <div class="modal-footer">
                <slot name="footer">
                  default footer
                  <button class="modal-default-button" @click="$emit('close')">
                    OK
                  </button>
                </slot>
              </div>
            </div>
          </div>
        </div>
      </transition>
    </script>
    
    <!-- app -->
    <div id="app">
      <button id="show-modal" @click="showModal = true">Show Modal</button>
      <!-- use the modal component, pass in the prop -->
      <modal v-if="showModal" @close="showModal = false">
        <!--
          you can use custom content here to overwrite
          default content
        -->
        <h3 slot="header">custom header</h3>
      </modal>
    </div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      相关资源
      最近更新 更多