You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决ag-grid-vue中postSortRows结合lodash sortBy无法实现自定义状态排序的问题

问题根源

你遇到的问题其实和_.sortBy是否异步完全无关——ag-grid的postSortRows要求你直接修改传入的rowNodes数组本身,而不是重新赋值一个新数组。

_.sortBy的特性是返回一个新的排序后的数组,你代码里的rowNodes = _.sortBy(...)只是把局部变量指向了新数组,并没有改变params.nodes这个原数组的内容。ag-grid内部是基于原数组的变化来更新表格的,所以自然不会生效。而官方示例里的splice操作是直接在原rowNodes数组上进行修改,所以能被ag-grid正确识别。

解决方法

你只需要把_.sortBy返回的新数组内容替换到原数组中,而不是重新赋值变量。这里有两种可行的方式:

方法一:修改原数组内容(推荐)

先通过_.sortBy得到排序后的新数组,然后清空原数组并把新数组的元素添加进去,这样原数组的引用不变,但内容已经是排序后的结果:

created() { 
  this.postSortRows = (params) => { 
    const rowNodes = params.nodes; 
    const order = ['Atrasado', 'Pendente', 'Pronto', 'Entregue']; 
    // 得到排序后的新数组
    const sortedRows = _.sortBy(rowNodes, obj => _.indexOf(order, obj.data.status));
    // 清空原数组,再把新数组元素全部加进去
    rowNodes.splice(0, rowNodes.length, ...sortedRows);
  } 
}

方法二:直接使用原生数组的sort方法(无需lodash)

如果不想额外依赖lodash,也可以直接用原生的Array.sort方法,它会直接修改原数组:

created() { 
  this.postSortRows = (params) => { 
    const rowNodes = params.nodes; 
    const order = ['Atrasado', 'Pendente', 'Pronto', 'Entregue']; 
    rowNodes.sort((a, b) => {
      const indexA = order.indexOf(a.data.status);
      const indexB = order.indexOf(b.data.status);
      return indexA - indexB;
    });
  } 
}

为什么官方示例有效?

官方代码里的splice操作是直接在原rowNodes数组上进行元素的移动,整个过程中数组的引用没有改变,只是内部元素的顺序被调整了,所以ag-grid能够检测到这个变化并更新表格的显示。

内容的提问来源于stack exchange,提问作者Guilherme Souza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:02:41