index.html 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <script src="../../dist/vue.js"></script>
  2. <link rel="stylesheet" href="style.css">
  3. <link rel="stylesheet" href="demo.css">
  4. <div id="el">
  5. <h1>
  6. Rendering Large Datasets With Vue {{renderTime}}
  7. </h1>
  8. <form>
  9. <strong>Filter Data</strong>:
  10. <input type="text" v-model="filter">
  11. <!--
  12. If the user is filtering the data, we want to offer some insight into
  13. the breadth of the filtering.
  14. -->
  15. <span v-if="filter">
  16. &mdash;
  17. Filtering <strong>{{ filter }}</strong>
  18. over {{ dataPoints }} data points,
  19. {{ visibleCount() }} found.
  20. </span>
  21. <!-- Provide tooling to unmount and remount the grid. -->
  22. <!-- <a v-if="grid.length" v-on="click:unmountGrid">Unmount Grid</a> -->
  23. <a @click="remountGrid">Remount Grid</a>
  24. </form>
  25. <table width="100%" cellspacing="2" :class="{ filtered: filter }">
  26. <tr v-for="row in grid">
  27. <th>{{ row.id }}</th>
  28. <td v-for="item in row.items"
  29. class="item"
  30. :class="{ hidden: !matches(item) }">
  31. {{ item.value }}
  32. </td>
  33. </tr>
  34. </table>
  35. </div>
  36. <script>
  37. function generateGrid( rowCount, columnCount ) {
  38. var valuePoints = [
  39. "Daenerys", "Jon", "Sansa", "Arya", "Stannis", "Gregor", "Tyrion",
  40. "Theon", "Joffrey", "Ramsay", "Cersei", "Bran", "Margaery",
  41. "Melisandre", "Daario", "Jamie", "Eddard", "Myrcella", "Robb",
  42. "Jorah", "Petyr", "Tommen", "Sandor", "Oberyn", "Drogo", "Ygritte"
  43. ];
  44. var valueIndex = 0;
  45. var grid = [];
  46. for ( var r = 0 ; r < rowCount ; r++ ) {
  47. var row = {
  48. id: r,
  49. items: []
  50. };
  51. for ( var c = 0 ; c < columnCount ; c++ ) {
  52. row.items.push({
  53. id: ( r + "-" + c ),
  54. value: valuePoints[ valueIndex ]
  55. });
  56. if ( ++valueIndex >= valuePoints.length ) {
  57. valueIndex = 0;
  58. }
  59. }
  60. grid.push( row );
  61. }
  62. return( grid );
  63. }
  64. var grid = generateGrid(1000, 10)
  65. var s = window.performance.now()
  66. console.profile('a')
  67. var vm = new Vue({
  68. el: '#el',
  69. data: {
  70. renderTime: 0,
  71. grid: Object.freeze(grid),
  72. dataPoints: grid.length * grid[0].items.length,
  73. filter: ''
  74. },
  75. methods: {
  76. updateFilter (e) {
  77. this.filter = e.target.value.toLowerCase()
  78. },
  79. matches (item) {
  80. return item.value.toLowerCase().indexOf(this.filter) > -1
  81. },
  82. visibleCount () {
  83. var count = 0
  84. var grid = this.grid
  85. for (var i = 0, l = grid.length; i < l; i++) {
  86. var row = grid[i].items
  87. for (var j = 0, k = row.length; j < k; j++) {
  88. var item = row[j]
  89. var matched = !this.filter || this.matches(item)
  90. if (matched) {
  91. count++
  92. }
  93. }
  94. }
  95. return count
  96. },
  97. unmountGrid: function () {
  98. this.grid = []
  99. },
  100. remountGrid: function () {
  101. this.grid = generateGrid(1000, 10)
  102. console.profile('unmount')
  103. Vue.nextTick(function () {
  104. console.profileEnd('unmount')
  105. })
  106. }
  107. }
  108. })
  109. console.profileEnd('a')
  110. setTimeout(function () {
  111. vm.renderTime = window.performance.now() - s
  112. }, 0)
  113. </script>