【问题标题】:Vuetify How to open and close dialogs within a data tableVuetify 如何在数据表中打开和关闭对话框
【发布时间】:2018-09-09 20:20:27
【问题描述】:

我们为一家人力资源公司构建了一个应用程序,管理员可以在其中查看 Vuetify 数据表中的用户。在该表中,我们想要显示用户注释,但它们有时很长并且不适合表格单元格。我们想简单地单击一个按钮并在对话框中打开注释。

问题是,如果我们有 200 个用户,并且我们单击按钮打开“dialogNotes”,每个用户对话框都会打开。我们如何调整我们的代码,以便只打开该用户的对话框?

<template slot="items" slot-scope="props">
                <td>
                <v-checkbox
                  primary
                  hide-details
                  v-model="props.selected"
                ></v-checkbox>
              </td>
                <td>{{props.item.status}}</td>
                <td>
          <img v-if="props.item.photoUrl" :src="props.item.photoUrl" class="user-img">
          <img v-if="!props.item.photoUrl" src="/static/avatar.png" class="user-img">
        </td>
                <td>
                <router-link v-if="props.item.name" v-bind:to="'/staff/' + props.item.id">{{ props.item.name }}</router-link>
        <router-link v-if="!props.item.name" v-bind:to="'/staff/' + props.item.id">{{ props.item.id }}</router-link>
                </td>
                <td>
                <v-btn icon color="primary" small @click.stop="dialogNote = true"><v-icon small>open_in_new</v-icon></v-btn>
                    <v-dialog v-model="dialogNote" scrollable lazy max-width="500" :key="props.item.id">
                    <v-card>
                      <v-card-title>
                        <span>{{ props.item.name }} Note</span>
                      </v-card-title>
                      <v-card-text>
                        {{props.item.note}}
                      </v-card-text>
                      <v-card-actions>
                        <v-btn color="primary" flat @click.stop="dialogNote=false">Close</v-btn>
                      </v-card-actions>
                    </v-card>
                  </v-dialog>
                </td>
                <td>{{props.item.greek}}</td>
                <td>
                <span v-if="props.item.tipsUrl">Yes</span>
              </td>
                <td>{{props.item.waiver}}</td>
                <td>{{props.item.media}}</td>
              <td>{{ props.item.howHear }}</td>
            </template>

数据:

dialogNote: false,

【问题讨论】:

    标签: javascript vue.js dialog vuetify.js


    【解决方案1】:

    在我看来,将 vuetify 用于数据表和对话框是一种更好、更简洁的方式。

    在下面的示例中,当您要编辑每个用户时,该对话框将为每个用户打开。

    Vuetify 提供数据表CRUD Actions,您可以编辑、删除和添加新项目。更多look here

    【讨论】:

      【解决方案2】:

      dialogNote 变成一个对象并使用dialogNote[props.item.id] 来判断该项目是否打开。

      data 中声明它,例如:

      dialogNote: {},
      

      并像这样使用它:

       <v-dialog v-model="dialogNote[props.item.id]" scrollable lazy max-width="500" :key="props.item.id">
      

      并更改打开/关闭按钮。

      • 打开:

        • 来自

          @click.stop="dialogNote = true"
          
        • 收件人:

          @click.stop="$set(dialogNote, props.item.id, true)"
          
      • 关闭:

        • 来自

          @click.stop="dialogNote = false"
          
        • 收件人:

          @click.stop="$set(dialogNote, props.item.id, false)"
          

      您的模板:

      <template slot="items" slot-scope="props">
      <td>
        <v-checkbox primary hide-details v-model="props.selected"></v-checkbox>
      </td>
      <td>{{props.item.status}}</td>
      <td>
        <img v-if="props.item.photoUrl" :src="props.item.photoUrl" class="user-img">
        <img v-if="!props.item.photoUrl" src="/static/avatar.png" class="user-img">
      </td>
      <td>
        <router-link v-if="props.item.name" v-bind:to="'/staff/' + props.item.id">{{ props.item.name }}</router-link>
        <router-link v-if="!props.item.name" v-bind:to="'/staff/' + props.item.id">{{ props.item.id }}</router-link>
      </td>
      <td>
        <v-btn icon color="primary" small @click.stop="$set(dialogNote, props.item.id, true)">
          <v-icon small>open_in_new</v-icon>
        </v-btn>
        <v-dialog v-model="dialogNote[props.item.id]" scrollable lazy max-width="500" :key="props.item.id">
          <v-card>
            <v-card-title>
              <span>{{ props.item.name }} Note</span>
            </v-card-title>
            <v-card-text>
              {{props.item.note}}
            </v-card-text>
            <v-card-actions>
              <v-btn color="primary" flat @click.stop="$set(dialogNote, props.item.id, false)">Close</v-btn>
            </v-card-actions>
          </v-card>
        </v-dialog>
      </td>
      <td>{{props.item.greek}}</td>
      <td>
        <span v-if="props.item.tipsUrl">Yes</span>
      </td>
      <td>{{props.item.waiver}}</td>
      <td>{{props.item.media}}</td>
      <td>{{ props.item.howHear }}</td>
      </template>

      【讨论】:

      • 嗯,这对我不起作用。没有控制台错误,但是当我单击按钮时,什么也没有发生
      • 对不起,我错过了关闭按钮。从@click.stop="dialogNote=false"@click.stop="$set(dialogNote, props.item.id, false)"
      • 太棒了,谢谢!我在按钮中添加了带有“true”的相同代码以打开对话框,并且效果很好
      • 哦,哈哈,现在我知道我也错过了。很高兴你解决了 xD
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多