我正在try 更新Make,当点击按钮时,功能sortCategories被执行,CategoryRow个组件的列表被排序,但没有任何变化,控制台上没有错误

import React, { useEffect, useState} from 'react';
import './category.css';
import Header from "../Header";
import CategoryRow from "./CategoryRow";


// Clean empty categories
const filtered = window.CATEGORIES.filter(function(value, index, arr) {
    return value.labResults.length > 0;
});



export default function Category() {

    const [categories, setCategories] = useState(filtered)
    const [loading, setLoading] = useState(true)

    useEffect(() => {
        setLoading(false)
    }, []);

    const sortCategories = () => {
        // Order by issues
        categories.sort((a,b) => {
            return b.issues - a.issues;
        });
        setCategories(categories);
    }

    return (
        <>
            <Header></Header>
            <div className="order-button-row">
                <button className="btn btn-primary" onClick={ sortCategories }>Order by issues</button>
            </div>
            <div className="card shadow py-2 mb-2">
                <div className="card-body">
                    {loading ? (
                        <div className={'text-center'}>
                            <span className="fa fa-spin fa-spinner fa-4x"></span>
                        </div>

                    ) : (
                        <div className={'row'}>
                            {categories.map(categoryInformation =>
                                <CategoryRow key={categoryInformation.category.id}
                                             category={categoryInformation.category}
                                             issues={categoryInformation.issues}></CategoryRow>
                            )}
                        </div>
                    )}
                </div>
            </div>
        </>
    )
}

推荐答案

问题

在您的代码中,categories.sort执行就地排序,而当您执行setCategories(categories)时,Reaction简单地忽略它,因为它是与以前相同的数组引用(没有引用更改).

categories.sort((a,b) => {
  return b.issues - a.issues;
});
setCategories(categories);

解决方案1

复制类别,然后对状态进行排序和更新:

const categoriesCopy = [...categories];
categoriesCopy.sort((a,b) => {
    return b.issues - a.issues;
});
setCategories(categoriesCopy);

解决方案2

使用setter函数的回调函数:

setCategories(prevCategories => {
  const categoriesCopy = [...prevCategories];
  categoriesCopy.sort((a, b) => {
    return b.issues - a.issues;
  });
  return categoriesCopy;
});

Javascript相关问答推荐

试图为每支球队生成类似于2024/25年欧洲足联冠军联赛瑞士系统格式的独特比赛配对

访客柜台的风格React.js

在shiny 模块中实现JavaScript

为什么我达到了时间限制!?LeetCode链接列表循环(已解决,但需要解释!)

类型脚本中只有字符串或数字键而不是符号键的对象

我开始使用/url?q=使用Cheerio

Msgraph用户邀请自定义邮箱模板

为什么我的列表直到下一次提交才更新值/onChange

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

无法使用单击按钮时的useState将数据从一个页面传递到另一个页面

类构造函数不能在没有用With Router包装的情况下调用

以编程方式聚焦的链接将被聚焦,但样式不适用

如何确保预订系统跨不同时区的日期时间处理一致?

匹配一个或多个可选重复的特定模式

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

MongoDB中的嵌套搜索

如何修复错误&语法错误:不能在纯react 项目中JEST引发的模块&之外使用导入语句?

每隔3个项目交替显示,然后每1个项目交替显示

为什么我看到的是回复,而不是我的文档?

如何在Jest中模拟函数