ivew | element ui- 关于table组件自定义sortMethod排序不生效或错误问题处理

最近项目需求需要,需要对表格列进行自定义排序,用的是iview的组件,看了文档,table 排序这部分,但是没有给出相关例子。以为不难搞的,是不难搞,就是折腾了好一会。。。

Iview table 排序

 data () {
            return {
                columns5: [
                    {
                        title: ‘Date‘,
                        key: ‘date‘,
                        sortable: true,

                    },
                    {
                        title: ‘Name‘,
                        key: ‘name‘
                    },
                    {
                        title: ‘Age‘,
                        key: ‘age‘,
                        sortable: true,
                        sortMethod:function(a,b,type) {
                           if (type == ‘asc‘) {
                               return a > b? -1 : 1
                           } else {
                               return a > b? -1 : 1
                           }
                        }

                    },
                    {
                        title: ‘Address‘,
                        key: ‘address‘
                    }
                ],
                data5: [
                    {
                        name: ‘John Brown‘,
                        age: 18,
                        address: ‘New York No. 1 Lake Park‘,
                        date: ‘2016-10-03‘
                    },
                    {
                        name: ‘Jim Green‘,
                        age: 24,
                        address: ‘London No. 1 Lake Park‘,
                        date: ‘2016-10-01‘
                    },
                    {
                        name: ‘Joe Black‘,
                        age: 30,
                        address: ‘Sydney No. 1 Lake Park‘,
                        date: ‘2016-10-02‘
                    },
                    {
                        name: ‘Jon Snow‘,
                        age: 26,
                        address: ‘Ottawa No. 2 Lake Park‘,
                        date: ‘2016-10-04‘
                    }
                ]
            }
        },
        methods: {

        }           

注意: 返回必须是-1 ,1

Element UI table 排序

远程排序

<script src="//unpkg.com/vue/dist/vue.js"></script>
<script src="//unpkg.com/[email protected]/lib/index.js"></script>
<div id="app">
<template>
  <el-table
    :data="tableData"
    style="width: 100%"
    :default-sort = "{prop: ‘date‘, order: ‘descending‘}"
    @sort-change="sortChange"
    >
    <el-table-column
      prop="date"
      label="日期"
      sortable=‘custom‘

      width="180">
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      sortable
      width="180">
    </el-table-column>
    <el-table-column
      prop="address"
      label="地址"
      :formatter="formatter">
    </el-table-column>
  </el-table>
</template>
</div>

js部分

var Main = {
    data() {
      return {
        tableData: [{
          date: ‘2016-05-02‘,
          name: ‘王小虎‘,
          address: ‘上海市普陀区金沙江路 1518 弄‘
        }, {
          date: ‘2016-05-04‘,
          name: ‘王小虎‘,
          address: ‘上海市普陀区金沙江路 1517 弄‘
        }, {
          date: ‘2016-05-01‘,
          name: ‘王小虎‘,
          address: ‘上海市普陀区金沙江路 1519 弄‘
        }, {
          date: ‘2016-05-03‘,
          name: ‘王小虎‘,
          address: ‘上海市普陀区金沙江路 1516 弄‘
        }]
      }
    },
    methods: {
      formatter(row, column) {
        return row.address;
      },
      sortChange(column, key, order) {
        console.log(column, key, order)
       }
    }
  }
var Ctor = Vue.extend(Main)
new Ctor().$mount(‘#app‘)

控制台截图:

 自定义排序 -- sort-method

html部分:

<script src="//unpkg.com/vue/dist/vue.js"></script>
<script src="//unpkg.com/[email protected]/lib/index.js"></script>
<div id="app">
<template>
  <el-table
    :data="tableData"
    style="width: 100%"
    :default-sort = "{prop: ‘date‘, order: ‘descending‘}"

    >
    <el-table-column
      prop="date"
      label="日期"
      :sortable="true"
      :sort-method="sortMethod"  //只需写方法名,不能把添加参数括号的写法如:sortMethod(a,b)

      width="180">
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      sortable
      width="180">
    </el-table-column>
    <el-table-column
      prop="address"
      label="地址"
      :formatter="formatter">
    </el-table-column>
  </el-table>
</template>
</div>

js部分:

var Main = {
    data() {
      return {
        tableData: [{
          date: ‘2016-05-02‘,
          name: ‘王小虎‘,
          address: ‘上海市普陀区金沙江路 1518 弄‘
        }, {
          date: ‘2016-05-04‘,
          name: ‘王小虎‘,
          address: ‘上海市普陀区金沙江路 1517 弄‘
        }, {
          date: ‘2016-05-01‘,
          name: ‘王小虎‘,
          address: ‘上海市普陀区金沙江路 1519 弄‘
        }, {
          date: ‘2016-05-03‘,
          name: ‘王小虎‘,
          address: ‘上海市普陀区金沙江路 1516 弄‘
        }]
      }
    },
    methods: {
      formatter(row, column) {
        return row.address;
      },
      sortMethod(obj1, obj2) {
        console.log(obj1, obj2)
      }
    }
  }
var Ctor = Vue.extend(Main)
new Ctor().$mount(‘#app‘)

控制台截图:

方法自动带有data里面前后的数据行对象,可以根据array.sort()https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort 的写法进行自定义排序的方式

不如我自己写的排序,想默认点击排序字段,然后先是降序,然后再点击再是升序。如下:

sortMethod(a, b) {
  console.log(a, b)
  var at = Date.parse(a.date)
  var bt = Date.parse(b.date)
  console.log( bt, at)
  if (at > bt) {
      console.log(1)
      return -1
 } else {
      console.log(-1)
      return 1
 }}

这样会有个问题,不能都在点击排序字段列的时候,就拿到该字段,现在只能是在函数方法里面通过obj.date的获取属性的方式获取。如果整个表格很多个字段要这样排序,就麻烦了。

改进版写法:

<el-table-column
      prop="date"
      label="日期"
      :sortable="true"
      :sort-method="(a,b) => sortMethod(a ,b , ‘date‘)"

      width="180">
    </el-table-column>
sortMethod(obj1, obj2, column) {
// console.log(obj1, obj2, column)  var at = obj1[column]  var bt = obj2[column]  // console.log(at, bt)

  if (at > bt) {      return -1  } else {      return 1  }
}

可以采用js的箭头函数写法,传一个自定义的字段名进去,然后由当前两个对比的数据行对象获取,从而进行比较即可。

原文地址:https://www.cnblogs.com/smallyi/p/11125493.html

时间: 2024-08-30 10:56:17

ivew | element ui- 关于table组件自定义sortMethod排序不生效或错误问题处理的相关文章

element ui table组件自定义合计栏,后台给的数据

合计的数据是后台传的,所以用table组件自定义一行用来合计 <el-table border fit v-loading.body="listLoading" element-loading-text="拼命加载中" :data="getChannelData" style="width: 100%" :default-sort = "{prop: 'date', order: 'descending'}&q

elment-ui table组件 -- 远程筛选排序

elment-ui table组件 -- 远程筛选排序 基于 elment-ui table组件 开发,主要请求后台实现筛选 排序的功能. 需求 排序 筛选 是对后台整个数据进行操作,而不是对当前页面的数据进行操作 若是其关联的下一级页面,(eg:点击查看编辑时,再返回当前页面时,保留之前筛选,或排序条件),否则清空 先上一份源码, 直接使用官网的(修改了一小部分参数,可以忽略) <el-table :data="tableData" style="width: 100

vue+element UI实现分页组件

1.前言 在web页面中,常常需要将后台查询到的数据以表格形式展示出来,而这些数据量往往会非常庞大,如果将所有要展示的数据一次性请求获取并展示到页面上,那页面长度势必会变得非常的长,很不美观.更重要的是,如果数据量过于大,在页面加载时一次性请求全部数据将会耗费大量网络资源,性能极低.但是,如果我们可以将数据分页展示,这样页面首先不会变的冗长,另外只有用户点击页码才会发出请求并且每次请求的数据量也不会很大,这就极大的节省了网络资源,提高了性能.本文就以vue结合element UI实现一个数据分页

在使用element ui时 select组件获取label问题

最近在工作的时候需要实现多个条件联合查询,这个其实就是一条sql语句.但是,我们数据库中存储的是根据前端传来id的值所对应的值,而不是直接存的id,使用select组件时,却只能取到value值,无法作为后台查询的条件. 我们需要的是select 组件的label值,而不是看不见的value值. 首先,根据element ui select组件使用手册,给组件添加'change'方法 1 @change=changeValue 再根据Array 的 find方法找出对应的值即可. 1 chang

Element ui 的树形组件使用的 jsx 写法无法运行。

传统后台开发人员.最近写管理后台使用了element-ui .在tree这这个组件的自定义节点上碰到问题了.官方文档在这里:http://element-cn.eleme.io/#/zh-CN/component/tree源代碼: 文档提示: 使用render-content指定渲染函数,该函数返回需要的节点区内容即可.渲染函数的用法请参考 Vue 文档.注意:由于 jsfiddle 不支持 JSX 语法,所以本例在 jsfiddle 中无法运行.但是在实际的项目中,只要正确地配置了相关依赖,就

基于element ui 实现七牛云自定义key上传文件,并监听更新上传进度

借助上传Upload 上传组件的 http-request 覆盖默认的上传行为,可以自定义上传的实现 <el-upload multiple ref="sliderUpload" :data="uploadData" :action="uploadData.url" list-type="picture-card" accept="image/png,image/jpeg,image/jpg" :au

饿了么Element UI之Upload组件图片上传【原创】

图片文件换汤不换药,只要注意前端的写法即可 1.饿了么组件可以利用 http-request 的属性对上传进行自定义 :http-request="uploadFile" 2.设置文件FormData对象传入请求 const formdata = new FormData(); const file = params.file; formdata.append("file", file); 3.全部代码 <template> <div style=

element ui dialog 父子组件传值

最近在做课设的时候?用到了Elementui?中的dialog的组件,但在将dialog作为一个子组件的时候,传值出现了问题.当关闭dialog的时候应该怎么传值? ? 一开始的时候的想法比较简单,就是父组件直接传值来作为子组件的show/hidden的值. 然而这样的问题是当子组件close的时候,他会直接直接改变他的值,但是子组件不能直接改变props的值,因此可以通过子组件触发事件给父组件. ? 子组件在关闭时候的事件,通过阅读官方文档,我们发现他提供了一个关闭的时候的回调事件. 我们可以

使用element中的table组件,如何单击某一行数据时选中对应的复选框

<el-table @row-click="clickRow" ref="moviesTable" :data="insertModel.tableData" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55"/> <el-table-