javascript - 对组件列表进行 react 排序

标签 javascript reactjs

我正在尝试更新 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) 时,React 会简单地忽略它,因为它与之前的数组引用相同(没有引用变化)。

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 - 对组件列表进行 react 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73799379/

相关文章:

javascript - 使用javascript更改不同形状的颜色

javascript - Google 放置附近搜索() 返回 invalid_request

javascript - 谷歌云存储图像公共(public)链接到 img src

javascript - 如何在 ajax 调用后在 javascript 上以相同的顺序显示数组 id 和 name 值?

javascript - 收到有关对象作为 React 子对象无效的错误

javascript - 多行刷卡器无法从 swiper.js 使用react

java - 将 ReactJS 前端添加到我的 REST API

Javascript通过单击同一个按钮一个一个地切换多个div

reactjs - 如何分析 Next Js 包的大小和内容

javascript - 使用通量架构在 reactjs 中获取数据的正确模式是什么?