edo1z blog

プログラミングなどに関するブログです

Element UIのtableでsortとpaginationを連動させる

Element UIテーブルはソートとページネーションの相性が悪いらしい。試してみたら確かに悪かった。何が悪いかというと、ソートがページネーションと連動しない。ページ内に表示されているデータがソートされるだけだった。

対策

  • el-table-columnのsortableは使わない。
  • el-table-columnのrender-headerを使って、テーブルのヘッダにソートのcaretとonclickイベントを追加する。
  • ソートのcaretがクリックされたら、el-tableのdataに設定している、データ全体をソートする。

render-header

  • ここに書いてあった。
renderHeader (h, e) {
  return h('div', null, [
    h('span', {class: 'caret-wrapper'}, [
      h('i', {
        class: this.sortCaretAsc(e.column.property),
        on: {
          click: () => this.sortChange(e.column.property, 'asc')
        }
      }, null),
      h('i', {
        class: this.sortCaretDesc(e.column.property),
        on: {
          click: () => this.sortChange(e.column.property, 'desc')
        }
      }, null)
    ]),
    e.column.label
  ])
}

computedでcaretのクラスを設定

sortCaretAsc: function () {
  return function (prop) {
    if (this.sortProp === prop && this.sortOrder === 'asc') {
      return 'sort-caret ascending active'
    }
    return 'sort-caret ascending'
  }
},
sortCaretDesc: function () {
  return function (prop) {
    if (this.sortProp === prop && this.sortOrder === 'desc') {
      return 'sort-caret descending active'
    }
    return 'sort-caret descending'
  }
}

caretがactiveな場合のスタイルを設定

.el-table .sort-caret.ascending.active {
  border-bottom-color: #409eff;
}
.el-table .sort-caret.descending.active {
  border-top-color: #409eff;
}

caretがクリックされたら、ソート条件をdataに格納しつつ、ソート実行

sortChange (prop, order) {
  this.sortProp = prop
  this.sortOrder = order
  this.sortClients({prop: prop, order: order})
},