最近在項目中使用vue遇到了一個問題,就是在使用vue sort排序時發現無效,一直無法實現按照指定的順序進行排序。
在排查問題的過程中,我發現了幾個可能導致vue sort排序無效的原因。
1. 對原數組的修改不會影響到Vue實例中的數據,從而無法觸發數據的響應式更新。解決方法是使用Vue.set或者splice方法對數組進行修改。
2. sort方法是基于現有數組進行排序的,所以如果要實現按照指定順序排序,需要先將指定順序中的key值按照需要的順序排列并存儲,然后在sort中以該數組的順序進行排序操作。
3. sort方法是基于引用實現的,所以如果指定的順序數組是引用類型,需要先將其復制一份再進行操作。
其中最常見的就是第一種情況,對數組進行修改時需要使用Vue提供的修改方法來觸發數據響應式更新。
// example 1:
// 無法觸發數據響應式更新
this.array.reverse();
// example 2:
// 可以觸發數據響應式更新
this.array.splice(0, this.array.length, ...this.array.reverse());
// 或者
Vue.set(this, 'array', this.array.reverse());
而針對第二種情況,為了能夠實現按照指定順序排序,需要先將指定順序中的key值按照需要的順序排列并存儲。比如,假設現在需要按照["c", "b", "a"]的順序對數據進行排序。
const order = ["c", "b", "a"];
array.sort((a,b) =>order.indexOf(a.key) - order.indexOf(b.key));
這樣就可以根據指定的key值進行排序了。
最后需要注意的是,如果指定的順序數組是引用類型,需要先將其復制一份再進行操作。否則,操作會直接修改原數組。
// example 1:
// 操作會修改原數組
const order = this.order;
this.array.sort((a,b) =>order.indexOf(a.key) - order.indexOf(b.key));
// example 2:
// 操作不會修改原數組
const order = this.order.slice();
this.array.sort((a,b) =>order.indexOf(a.key) - order.indexOf(b.key));
綜上,如果在vue sort排序的時候遇到問題,需要思考以上幾個問題,解決掉之后才能順利實現按照指定順序排序。