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

React应用中如何按对象属性值对返回的大学对象列表排序?

解决方案

核心思路

通过React状态记录用户选择的排序方向,在前端对大学数组做排序处理后再渲染,无需后端重新查询。

具体实现步骤

1. 定义排序状态

在你的组件中添加状态跟踪当前排序方向:

import React from 'react';

const UniversityContainer = ({ data }) => {
  // 'desc' 代表降序(点赞数从高到低),'asc' 代表升序(点赞数从低到高)
  const [sortDirection, setSortDirection] = React.useState('desc');

2. 实现排序逻辑

用useMemo优化性能,仅在原数据或排序方向变化时重新计算排序结果:

// 生成排序后的大学数组
  const sortedUniversities = React.useMemo(() => {
    // 处理数据未加载的边界情况
    if (!data?.universityByMajor) return [];
    
    // 复制原数组,避免修改原始props数据
    const universitiesCopy = [...data.universityByMajor];
    
    // 根据排序方向执行排序
    return universitiesCopy.sort((a, b) => {
      if (sortDirection === 'asc') {
        return a.upvoteCount - b.upvoteCount; // 升序:低点赞数优先
      } else {
        return b.upvoteCount - a.upvoteCount; // 降序:高点赞数优先
      }
    });
  }, [data?.universityByMajor, sortDirection]);

3. 渲染排序后的列表

将原渲染逻辑中的data.universityByMajor替换为排序后的数组:

return (
    <div>
      {/* 排序控制按钮 */}
      <div className="sort-controls">
        <button 
          onClick={() => setSortDirection('desc')}
          disabled={sortDirection === 'desc'}
        >
          点赞数从高到低
        </button>
        <button 
          onClick={() => setSortDirection('asc')}
          disabled={sortDirection === 'asc'}
        >
          点赞数从低到高
        </button>
      </div>

      {/* 渲染排序后的大学卡片 */}
      {sortedUniversities.map((university) => (
        <div className="home-box" key={university._id}>
          <UniversityList
            _id={university._id}
            university_name={university.university_name}
            university_img={university.university_image}
            upvotes={university.upvoteCount}
          />
        </div>
      ))}
    </div>
  );
};

export default UniversityContainer;

关键注意事项

  • 禁止修改原始数据:排序时必须复制原数组,直接修改data.universityByMajor会破坏React的不可变数据原则,引发状态异常。
  • 正确设置组件key:始终用university._id作为组件的key,不要使用upvoteCount或数组索引,确保排序后组件能正确复用和更新。
  • 性能优化:useMemo缓存了排序结果,避免每次组件渲染都重复执行排序逻辑。

内容的提问来源于stack exchange,提问作者Claire Cashmore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:32:47