vue js 2排序表

时间:2018-05-16 15:33:06

标签: vue.js vuejs2

我在vue.js 2中有两个问题,这里有一个小提琴:https://jsfiddle.net/tmun9cxa/1/

  1. 单击列标题时,为什么我的排序不起作用?解决方案是什么?

  2. 如何让搜索输入字段仅搜索pn列?

  3. 我发现很多例子都在使用vue1并且过时了。

    <input type="text" value="" v-model="search" placeholder="Search">
    
    <table style="text-align: center;">
        <thead>
            <tr>
                <th v-for="column in columns">
                    <a 
                        href="#"
                        v-on:click="sort(column.shortcode)">{{column.label}}
                    </a>
                </th>
            </tr>
        </thead>
        <tbody>
            <tr v-for="(product) in products">
                <td>{{product.pn}}</td>
                <td>{{product.od}}</td>
                <td>{{product.id}}</td>
                <td>{{product.thickness}}</td>
                <td>{{product.lo}}</td>
                <td>{{product.weight}}</td>
            </tr>
        </tbody>
    </table>
    

    javascript here

    var vm = new Vue({
            el: '#app',
            data: {
                currentSort: 'pn',
                currentSortDir: 'asc',
                search: '',
                columns: [
                    { label: 'P/N', shortcode: 'pn' },
                    { label: 'OD (De,mm)', shortcode: 'od' },
                    { label: 'ID (De,mm)', shortcode: 'id' },
                    { label: 'Thickness (De,mm)', shortcode: 'thickness' },
                    { label: 'LO', shortcode: 'lo' },
                    { label: 'Weight (kg/1000)', shortcode: 'weight' },
                ], // columns
                products: [
                    { 
                        pn: 170158,
                        od: 13,
                        id: .44,
                        thickness: 1,
                        lo: .45,
                        weight: .7
                    },{ 
                        pn: 1803561,
                        od: 12,
                        id: .8,
                        thickness: .7,
                        lo: .11,
                        weight: .5
                    },{ 
                        pn: 170149,
                        od: 9,
                        id: .64,
                        thickness: .6,
                        lo: .75,
                        weight: .3
                    },{ 
                        pn: 150149,
                        od: 15,
                        id: .22,
                        thickness: .3,
                        lo: .55,
                        weight: .9
                    },
                ], // products
            },
            methods: {
                sort:function(col) {
                    //console.log( 'current: '+this.currentSort );
                    //console.log( 'col: '+col );
                    //var colthing = col;
    
                    // if you click the same label twice
                    if(this.currentSort == col){
                        console.log( 'same col: '+col );
                        // sort by asc
                        this.products = this.products.sort((a, b) => {
                            return a.col >= b.col;
                        });
                    }else{
                        this.currentSort = col;
                        console.log( 'diff col: '+col );
                        // sort by desc
                        this.products = this.products.sort((a, b) => {
                            return a.col <= b.col;
                        });
                    } // end if
    
                }, // sort
    
            }, // methods
        }); // vue
    

1 个答案:

答案 0 :(得分:2)

如所指出的,列排序无效,因为您需要使用a[col]而不是a.col

此外,您应该考虑使用计算值而不是修改原始数据。这也使得过滤更容易。

这是更新后的脚本(请注意,<tr v-for="(product) in products">需要<tr v-for="(product) in showProducts">才能生效)

var vm = new Vue({
  el: '#app',
  data: {
    currentSort: 'pn',
    currentSortDir: 'asc',
    search: '',
    columns: [
      { label: 'P/N', shortcode: 'pn' },
      /// more columns ...
    ], // columns
    products: [
      //.... objects
    ], // products
  },
  computed: {
    showProducts() {
      return this.products.filter(a => {
        console.log(a.pn)
        return (a.pn + '').includes(this.search)
      })
        .sort((a, b) => {
        if (this.currentSortDir === 'asc') {
	        return a[this.currentSort] >= b[this.currentSort];      
        }
        return a[this.currentSort] <= b[this.currentSort];
      })
    },
  },
  methods: {
    sort:function(col) {
      // if you click the same label twice
      if(this.currentSort == col){
        this.currentSortDir = this.currentSortDir === 'asc' ? 'desc' : 'asc';
      }else{
        this.currentSort = col;
        console.log( 'diff col: '+col );
      } // end if

    }, // sort

  }, // methods
}); // vue

最后,小提琴:https://jsfiddle.net/tmun9cxa/2/