vue grid表格

grid.js

 

// register the grid component

Vue.component('demo-grid', {

  template: '#grid-template',

  replace: true,

  props: {

    data: Array,

    columns: Array,

    filterKey: String

  },

  data: function () {

    var sortOrders = {}

    //console.log("data function ")

    this.columns.forEach(function (key) {

      //console.log(key)

      sortOrders[key] = 1

 

    })

    return {

      sortKey: '',

      sortOrders: sortOrders

    }

  },

  computed: {

  filteredData: function () {

      var sortKey = this.sortKey

      var filterKey = this.filterKey && this.filterKey.toLowerCase()

      var order = this.sortOrders[sortKey] || 1

      var data = this.data

      if (filterKey) {

        data = data.filter(function (row) {

          return Object.keys(row).some(function (key) {

            return String(row[key]).toLowerCase().indexOf(filterKey) > -1

          })

        })

      }

      if (sortKey) {

        data = data.slice().sort(function (a, b) {

          a = a[sortKey]

          b = b[sortKey]

          return (a === b ? 0 : a > b ? 1 : -1) * order

        })

      }

      return data

    }

  },

  filters: {

    capitalize: function (str) {

      return str.charAt(0).toUpperCase() + str.slice(1)

    }

  },

  methods: {

    sortBy: function (key) {

      this.sortKey = key

      this.sortOrders[key] = this.sortOrders[key] * -1

    },

    test:function(){

       console.log("test function")

       var data = this.data

       var filterKey="a"

       var order=-1

       var sortKey="power"

       //console.log(data)

      //  data = data.filter(function (row) {

      //   console.log(Object.keys(row))

      //   return Object.keys(row).some(function (key) {

         

      //     return String(row[key]).toLowerCase().indexOf(filterKey) > -1

      //   })

      // })

     

 

    }

  }

})

 

// bootstrap the demo

var demo = new Vue({

  el: '#demo',

  data: {

    searchQuery: '',

    gridColumns: ['name', 'power'],

    gridData: [

      { name: 'Chuck Norris', power: Infinity },

      { name: 'Bruce Lee', power: 9000 },

      { name: 'Jackie Chan', power: 7000 },

      { name: 'Jet Li', power: 800 },

      { name: 'La Voiture Noire', power: 80000 }

 

    ]

  }

})

 

 

index.html

 

<!DOCTYPE html>

<html lang="en">

  <head>

    <meta charset="utf-8">

    <title>Vue.js grid component example</title>

    <link rel="stylesheet" href="style.css">

    <!-- Delete ".min" for console warnings in development -->

    <script src="../../dist/vue.min.js"></script>

    </head>

  <body>

 

    <!-- component template -->

    <script type="text/x-template" id="grid-template">

     

      <table v-if="filteredData.length">

        <thead>

          <tr>

            <th v-for="key in columns"

              @click="sortBy(key)"

              :class="{ active: sortKey == key }">

              {{ key | capitalize }}

              <span class="arrow"  :class="sortOrders[key] > 0 ? 'asc' : 'dsc'">

              </span>

            </th>

          </tr>

        </thead>

        <tbody>

          <tr v-for="entry in filteredData">

            <td v-for="key in columns"  @click="test()">

              {{entry[key]}}

            </td>

          </tr>

        </tbody>

      </table>

      <p v-else>No matches found.</p>

    </script>

 

    <!-- demo root element -->

    <div id="demo">

      <form id="search">

        Search <input name="query" v-model="searchQuery">

      </form>

      <demo-grid

        :data="gridData"

        :columns="gridColumns"

        :filter-key="searchQuery">

      </demo-grid>

    </div>

 

    <script src="grid.js"></script>

 

  </body>

</html>

 

style.css

body {

  font-family: Helvetica Neue, Arial, sans-serif;

  font-size: 14px;

  color: #444;

}

 

table {

  border: 2px solid #42b983;

  border-radius: 3px;

  background-color: #fff;

}

 

th {

  background-color: #42b983;

  color: rgba(255,255,255,0.66);

  cursor: pointer;

  -webkit-user-select: none;

  -moz-user-select: none;

  -ms-user-select: none;

  user-select: none;

}

 

td {

  background-color: #f9f9f9;

}

 

th, td {

  min-width: 120px;

  padding: 10px 20px;

}

 

th.active {

  color: #fff;

}

 

th.active .arrow {

  opacity: 1;

}

 

.arrow {

  display: inline-block;

  vertical-align: middle;

  width: 0;

  height: 0;

  margin-left: 5px;

  opacity: 0.66;

}

 

.arrow.asc {

  border-left: 4px solid transparent;

  border-right: 4px solid transparent;

  border-bottom: 4px solid #fff;

}

 

.arrow.dsc {

  border-left: 4px solid transparent;

  border-right: 4px solid transparent;

  border-top: 4px solid #fff;

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值