【问题标题】:sorting a filtered table as computed property将过滤后的表排序为计算属性
【发布时间】:2020-12-12 05:57:29
【问题描述】:

我有一个 md 表,当然我可以在其中按名称过滤行,过滤器工作正常,但只要我点击列名,行就不会排序

您应该能够像在这个沙盒中那样对它们进行排序 https://codesandbox.io/s/n7l7o742qm?module=App.vue

但是如果你试试我的代码 https://codesandbox.io/s/vue-material-search-and-empty-state-forked-6bb48?file=/App.vue

排序功能不起作用

HTML

<md-table
  v-model="filteredRepetitions"
  md-sort="corso"
  md-sort-order="asc"
  md-card
  md-fixed-header
>
  <md-table-toolbar>
    <h1 class="md-title">With auto select and alternate headers</h1>
    <md-field md-clearable class="md-toolbar-section-end">
      <md-input placeholder="Search by course..." v-model="search"/>
    </md-field>
  </md-table-toolbar>


  <md-table-row
    class="md-primary"
    slot="md-table-row"
    slot-scope="{ item }"
  >
    <md-table-cell md-label="Corso" md-sort-by="corso">{{ item.corso }}</md-table-cell>
    <md-table-cell md-label="Docente" md-sort-by="docente">{{ item.docente }}</md-table-cell>
    <md-table-cell md-label="Data" md-sort-by="timeSlot.data">{{ item.timeSlot.data }}</md-table-cell>
    <md-table-cell
      md-label="Fascia oraria"
      md-sort-by="timeSlot.fasciaOraria"
    >{{ item.timeSlot.fasciaOraria }}</md-table-cell>
    <md-table-cell md-label="Stato" md-sort-by="stato">{{ item.stato }}</md-table-cell>
  </md-table-row>
</md-table>

JS

const toLower = text => text.toString().toLowerCase();
export default {
    data() {
        return {
            search: '',
            repetitions2: [
                {
                    corso: 'Programmazione 3',
                    docente: 'Liliana Aridissono',
                    timeSlot: {
                        fasciaOraria: '15:00-16:00',
                        data: '2020-09-17'
                    },
                    stato: 'attiva'
                },
                {
                    corso: 'Python',
                    docente: 'Marco Amedura',
                    timeSlot: {
                        fasciaOraria: '17:00-18:00',
                        data: '2020-03-17'
                    },
                    stato: 'noattiva',
                },
                {
                    corso: 'Matematica Discreta',
                    docente: 'Vincenzo Bellomo',
                    timeSlot: {
                        fasciaOraria: '16:00-17:00',
                        data: '2020-02-17'
                    },
                    stato: 'noattiva',
                },
                {
                    corso: 'Algoritmi',
                    docente: 'Patti Viviana',
                    timeSlot: {
                        fasciaOraria: '16:00-17:00',
                        data: '2020-10-17'
                    },
                    stato: 'attiva',
                },
                {
                    corso: 'Analisi',
                    docente: 'Pinco Pallo',
                    timeSlot: {
                        fasciaOraria: '18:00-19:00',
                        data: '2020-10-26'
                    },
                    stato: 'attiva',
                }
            ]
        }
    },
    methods: {
    },
    computed: {
        filteredRepetitions: {
            get: function () {
                return this.repetitions2.filter(item => toLower(item.corso).includes(toLower(this.search)))
            },
            set: function (array) {
               // what should i say?
            }
        }
    },
}

额外问题: 是否可以仅针对特定属性进行过滤(例如,现在我只能按课程名称进行过滤)

【问题讨论】:

  • 当您尝试将某些东西分配给计算属性时,您只需要一个 setter,而您似乎没有这样做(您没有在代码中的任何地方分配给 filteredRepetitions . 你能解释一下预期的功能吗?你想达到什么目的?
  • vuematerial.io/components/table 从文档中读取可以通过按列名对表进行排序,我想这是因为我将一个计算属性传递给 v-model不能很好地使用该组件的排序功能
  • 不,计算的工作就像表格源一样好,它们可以按你喜欢的方式排序、过滤。此外,如图here 所示,您可以编辑计算中的项目,并且 Vue 不会丢失跟踪。你的问题似乎很经典XY problem。让我们忘记 Y(即documented here),专注于 X。请明确定义您要实现的目标。如有必要,请提供包含问题的minimal reproducible example
  • 我希望能够根据我点击codesandbox.io/s/…这里的沙盒的列标签对表格进行排序,如果你按任何标题,行不会排序
  • 我上面链接的沙箱已经做到了,但在单击标题时却没有(因为您在我发布后提出了请求)。首先,更新您的问题,以便任何想要回答它的人都不必通过上面的评论来找出您真正想要的内容。从问题中应该很清楚。其次,我建议您查看我提供的代码并尝试自己映射单击事件。如果别人替你做,你只会耽误学习。而且,如果你打算编码,你会一次又一次地需要这个。您想要的是在标题单击时更改 reversedsearchColumn

标签: vue.js computed-properties vue-material


【解决方案1】:

在玩了&lt;md-table&gt; 之后,事实证明您实际上不需要为sortColumnsortOrder 计算。不过,您确实需要使用 .sync 修饰符,如文档中所述。

并且你必须提供一个空的settermd-table 将尝试分配给计算的当它改变时)。但是,您不需要分配任何内容,因为 sortColumnsortOrder 会相应更改,并且您的 getter 会对这些更改做出反应。

我添加了一个watch,每次更改sortColumn 时都会重置sortOrder - 除此之外,它非常干净。

working demo.

相关代码:

import { sortBy } from 'lodash-es';

{ 
  data: () => ({
    searchTerm: "",
    searchColumn: "corso",
    sortColumn: "corso",
    sortOrder: "asc",
    items: [...]
  }),
  computed: {
    filteredItems() {
      return this.items.filter(
        item => this.searchColumn
          .split(".")
          .reduce((obj, prop) => obj[prop], item)
          .toLowerCase()
          .indexOf(this.searchTerm.toLowerCase()) > -1
      );
    },
    orderedItems: {
      get: function() {
        return sortBy(this.filteredItems, this.sortColumn);
      },
      set: () => {}
    }
  },
  watch: {
    sortColumn() {
      this.$nextTick(() => (this.sortOrder = "desc"));
    }
  },
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 2018-05-04
    • 1970-01-01
    • 2017-10-22
    • 2013-01-02
    • 2019-04-24
    • 2018-12-13
    • 2015-08-21
    相关资源
    最近更新 更多