2017-10-15 6 views
-1

データグリッドコンポーネントで遊んでいて、という名前の新しい列を追加しました。ブール値はブール値です。Vue 2による配列の再レンダリングを禁止しますか?

この列でソートしたい場合や、ソート後に値を変更した場合は([いいえ]をクリックします)、直ちにデータを並べ替えて、望ましくない位置に切り替えるようにします(別のクリック)。

すぐに並べ替えるのを防ぐ/ビューでテーブルを再レンダリングしないようにすることはできますか?

私はまた、Vueがインデックスによって配列の変更を登録していないことを読んだことがありますが、なんらかの理由でhereがありますか?

// register the grid component 
 
Vue.component('demo-grid', { 
 
    template: '#grid-template', 
 
    props: { 
 
    data: Array, 
 
    columns: Array, 
 
    filterKey: String 
 
    }, 
 
    data: function() { 
 
    var sortOrders = {} 
 
    this.columns.forEach(function (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 
 
    } 
 
    } 
 
}) 
 

 
// bootstrap the demo 
 
var demo = new Vue({ 
 
    el: '#demo', 
 
    data: { 
 
    searchQuery: '', 
 
    gridColumns: ['name', 'power', 'cool'], 
 
    gridData: [ 
 
     { name: 'Chuck Norris', power: Infinity, cool: true }, 
 
     { name: 'Bruce Lee', power: 9000, cool: true }, 
 
     { name: 'Jackie Chan', power: 7000, cool: false }, 
 
     { name: 'Jet Li', power: 8000, cool: false } 
 
    ] 
 
    }, 
 
    methods: { 
 
    \t notTrue() { 
 
    \t this.gridData[0].cool = !this.gridData[0].cool; 
 
    } 
 
    } 
 
})
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; 
 
}
<script src="https://unpkg.com/[email protected]/dist/vue.js"></script> 
 
<!-- component template --> 
 
<script type="text/x-template" id="grid-template"> 
 
    <table> 
 
    <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"> 
 
      {{entry[key]}} 
 
     </td> 
 
     </tr> 
 
    </tbody> 
 
    </table> 
 
</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> 
 
    
 
    <a @click="notTrue()">Not true</a> 
 
</div>

答えて

0

計算した変数は、その変更されたときに再計算されています。それが変化したときにfilteredDataを再計算しません場合

ので、あなたは、filteredDataにデータ

を入れて、注文データを作成する方法を作成し、filteredData

を配置する必要がありますthをクリックしたときにその関数をトリガするようにしてください。

+0

私は分かりません。あなたは詳細を教えていただけますか? – Runnick

関連する問題