javascript - 在 Vuetify 中折叠展开的 v-data-table 时触发方法

标签 javascript vue.js vuejs2 vue-component vuetify.js

我尝试构建一个 v-data-table 并在观察 expanded.sync 值时观察到非常奇怪的行为。第一层expanded.sync值看起来正常,但是第二层expanded.sync有3条连续相同的记录。

我打算观察这个值,在折叠展开的项目时做一些事情。是否有任何解决方案来检测展开的项目何时折叠?

顶层代码

<template>
  <v-data-table
    :headers="headers"
    :items="desserts"
    item-key="name"
    :expanded.sync="itemExpanded"
    show-expand>
  >
    <template v-slot:top>
      <v-toolbar height="38" falt color="#cddde1">
        <v-toolbar-title dense> Test </v-toolbar-title>
      </v-toolbar>
    </template>
      <template v-slot:expanded-item="{headers}">
        <td :colspan="headers.length">
          <Show2></Show2>
        </td> 
      </template>
  </v-data-table>
</template>
<script>
import Show2 from "./ShowTest2.vue";
export default {
  name: "Show1",
   components: {
      Show2
  },
   data: () => ({
     itemExpanded:[],
    desserts: [
      {
        name: 'Show 1 - item 1',
        calories: 237,
        fat: 9.0,
        carbs: 37,
        protein: 4.3,
        iron: '1%',
      },
      {
        name: 'Show 1 - item 2',
        calories: 262,
        fat: 16.0,
        carbs: 23,
        protein: 6.0,
        iron: '7%',
      },
    
    ],
    headers: [
      {
        text: 'Dessert (100g serving)',
        align: 'start',
        sortable: false,
        value: 'name',
      },
      { text: 'Calories', value: 'calories' },
      { text: 'Fat (g)', value: 'fat' },
      { text: 'Carbs (g)', value: 'carbs' },
      { text: 'Protein (g)', value: 'protein' },
      { text: 'Iron (%)', value: 'iron' },
      { text: "details", value: "data-table-expand"  },
    ],
  }),
  watch: {
     itemExpanded(newVal,val){
      console.log('layer 1', newVal);
    },
  },
};
</script>

第二层代码

<template>
  <v-data-table
    :headers="headers"
    :items="desserts"
    item-key="name"
    :expanded.sync="itemExpanded2"
    show-expand>
  >
    <template v-slot:top>
      <v-toolbar>
        <v-toolbar-title dense> Test2</v-toolbar-title>
      </v-toolbar>
    </template>
      <template v-slot:expanded-item="{headers}">
        <td :colspan="headers.length">
            
        </td> 
      </template>
  </v-data-table>
</template>
<script>
export default {
  name: "Show2",
   data: () => ({
     itemExpanded2:[],
    desserts: [
      {
        name: 'Show 2 - item 1',
        calories: 159,
        fat: 6.0,
        carbs: 24,
        protein: 4.0,
        iron: '1%',
      },
      {
        name: 'Show 2 - item 2',
        calories: 262,
        fat: 16.0,
        carbs: 23,
        protein: 6.0,
        iron: '7%',
      },
    ],
    headers: [
      {text: 'Dessert (100g serving)',align: 'start', sortable: false, value: 'name',},
      { text: 'Calories', value: 'calories' },
      { text: 'Fat (g)', value: 'fat' },
      { text: 'Carbs (g)', value: 'carbs' },
      { text: 'Protein (g)', value: 'protein' },
      { text: 'Iron (%)', value: 'iron' },
      { text: "details", value: "data-table-expand"  },
    ],
  }),
  watch: {
     itemExpanded2(newVal,val){
       console.log('layer2', newVal);
    },
  },
};
</script>

Console.log 结果在每一层上一次展开 + 一次折叠。

layer 1 [__ob__: Observer]
ShowTest.vue?cc9a:66 layer 1 [{…}, __ob__: Observer]
ShowTest2.vue?5475:56 layer2 [{…}, __ob__: Observer]
ShowTest2.vue?5475:56 layer2 [{…}, __ob__: Observer]
ShowTest2.vue?5475:56 layer2 [{…}, __ob__: Observer]
ShowTest2.vue?5475:56 layer2 [__ob__: Observer]
ShowTest2.vue?5475:56 layer2 [__ob__: Observer]
ShowTest2.vue?5475:56 layer2 [__ob__: Observer]

非常感谢!

最佳答案

您应该监听为此目的提供的 item-expanded 事件,而不是使用 watch

<v-data-table
  :headers="headers"
  :items="desserts"
  item-key="name"
  :expanded.sync="itemExpanded"
  show-expand
  @item-expanded="onExpand"
>
methods: {
  onExpand({ item, value }) {
    console.log(item, value);
  }
}

此事件返回一个具有 itemvalue 属性的对象。 item 是该行的数据,value 是该行现在是否展开。

关于javascript - 在 Vuetify 中折叠展开的 v-data-table 时触发方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65760643/

相关文章:

javascript - 异步如何真正工作以及如何在 node.js (node-webkit) 中正确使用它

javascript - 如何在一行或剑道网格中添加数据

vue.js - nuxt js中的自定义指令

vue.js - @change 不触发以编程方式更改的值

javascript - 在 umbraco 7.2.5 中实现标签云和唯一名称验证

javascript - Flexslider 在 IE9 中不工作

javascript - 将项目推送到数组似乎对旧对象有反应

javascript - 未捕获( promise )TypeError : undefined is not a function (Vue. js,Electron)

vue.js - vue 和 vue-material : how to start?

vue.js - 使用 Vue 访问选择元素的选定文本(而不是值)