多个模态弹出窗口vue.js

Pro*_*oke 3 javascript jquery angularjs vue.js

我目前正在研究工作中使用Vue.JS.

目前我主要从事前端方面的工作.我有一个包含几个条目的表,并且在单击该行时,我想要一个模态弹出窗口以显示该行的更多详细信息.

我只是想让多个弹出窗口正常工作,并且一旦正常工作,它将处理每个弹出窗口中的动态内容.

目前,第一行的工作方式如下所示:

<tr class="activate-popupmodal-tr" @click="showmodal = true">
                      <td>01/01/2016

                        <modal :show.sync="showmodal">

                          <h3 slot="header">
                            Bug #1 - <span> 04/07/2016 </span>

                            <img src="files/cross.jpg" @click="showmodal = false" />
                          </h3>


                          <div slot="body">
                          </div>

                          <div slot="footer">
                         </div>

                        </modal>
</tr>
Run Code Online (Sandbox Code Playgroud)

使用app.js:

Vue.component('modal', {
  template: '#dashboard-popup-template',
  props: {
    show: {
      type: Boolean,
      required: true,
      twoWay: true
    }
  }
})

new Vue({
  el: '.activate-popupmodal-tr',
  data: {
    showmodal: false
  }
})
Run Code Online (Sandbox Code Playgroud)

这有效,但只在一行.关于如何让它工作的任何想法?

表:https://jsfiddle.net/a6n04o3t/

Chr*_*itz 6

Vue非常灵活,因此您可以通过多种不同的方式显示模态.这是我经常使用的方法之一.

可以在webpackbin上找到一个工作演示(包括一些丑陋的样式).

首先,我从一个父vue实例开始,该实例将保存我的列表组件,模态组件和我的项目列表(实际上在这种情况下,项目列表可以存储在父组件或列表组件中,但可能是你'我希望它在父母中):

// in main.js

new Vue({
  el: 'body',
  components:{
    list: List,
    modal: Modal
  },
  data:{
    items:[
      {name: 'foo'},
      {name: 'bar'},
      {name: 'baz'}
    ]
  },
  events:{
    showModal: function(item){
      this.$broadcast('showModal', item)
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

它还包含一个桥接事件,即一个事件,其目的是监听$dispatch来自子组件的ed事件,并立即$broadcasts将相应的事件发送到不同的子组件,并在需要时传递数据.我们稍后会详细介绍这一点.

我的索引文件将包含将被每个相应组件的模板替换的listmodal组件的占位符:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <style>
        ...
    </style>
  </head>
  <body>
    <div class="list-container">
      <list :items="items"></list>
    </div>

    <modal></modal>

    <script src="main.js"></script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

注意这一行<list :items="items"></list>.这里我们items将父组件传递给list组件.

然后我创建我的列表组件,将显示我的列表:

// also in main.js

var List = Vue.component('list',{
  props:['items'],
  template: `
<div class="list-row" v-for="item in items" @click="showModal(item)">
  <span>{{ item.name }}</span>
</div>
`,
  methods:{
    showModal: function(item){
      this.$dispatch('showModal', item)
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

列表组件将items属性作为属性,以便它可以v-for="item in items"在列表组件的模板中显示每个项目.

对于在列表中呈现的每一行,我附加一个调用该方法的click事件showModal并将当前值传递item给它.然后该方法将showModal事件调度到父级.

这是父母的桥接事件进入的地方.父母的showModal事件从列表中听到调度,并立即showModal向所有孩子广播一个事件,并将当前项目随之传递.

唯一具有事件侦听showModal器的子modal组件是:

// also in main.js 

var Modal = Vue.component('modal',{
  template:`
<div class="modal-container" v-show="visible">
  <div class="modal-body">
    <div clas="modal-content">
      {{ item | json }}  
    </div>
    <button @click="closeModal">Close</button>
  </div>
</div>
`,
  data: function(){
    return {
      item: null,
      visible: false
    }
  },
  events:{
    showModal: function(item){
      this.item = item
      this.visible = true
    }
  },
  methods:{
    closeModal: function(){
      this.visible = false
      this.item = null
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

当模态组件检测到showModal已经从父节点向下广播时,它会触发它的showModal事件逻辑,该事件逻辑将传入的项目设置为本地prop(它给模态的模板访问它)并将可见性设置为true.

我做这种模式来显示模态,加载蒙版,通知等.

如果您对此方法有任何疑问,请与我们联系.

  • 这正是我想要的!感谢您抽出时间回答我的问题. (2认同)