javascript - 为什么在 React Hooks 中排序后数组不更新?

标签 javascript reactjs react-hooks

我是 React 的新手。状态数组在排序功能后仅更新一次。为什么第二次触发排序功能后不再更新?

const [cases, setCases] = useState([1, 2, 3, 4, 5]);

let sortDown = true
let sorted = []

    function sort(){
        const copy = [...cases]
        if(sortDown){
            sorted = copy.sort(function(a, b){
                return b - a 
            })
        } else {
            sorted = copy.sort(function(a, b){
                return a - b
            })
        }
        sortDown = !sortDown
        setCases(sorted)
    }

最佳答案

当 props 或 state 改变时,React 会重新渲染组件。在您的情况下,您声明 sorted数组,然后将其传递给 setCases。所以第一次 setCases 需要 sorted数组,这是新的值(value)。然后再次对值进行排序并改变 sorted数组并将其再次传递给 setCases。但是 setCases 不考虑 sorted作为一个新数组,因为它发生了变异,所以引用没有改变。对于 React,它仍然是您第一次传递的同一个数组。您需要返回新数组,然后将其传递给 setCases .

您应该做的另一件事是将 sortDown 存储在状态中。否则它将在每次渲染时重新初始化。
以下代码应该适用于您的情况:

    const [cases, setCases] = useState([1, 2, 3, 4, 5]);
    const [sortDown, setSortDown] = useState(true)

        function sort(){
            const copy = [...cases] // create copy of cases array (new array is created each time function is called)
            if(sortDown){
                copy.sort(function(a, b){ // mutate copy array
                    return b - a 
                })
            } else {
                copy.sort(function(a, b){
                    return a - b
                })
            }
            setSortDown(!sortDown); // set new value for sortDown
            setCases(copy); // pass array to setCases
        }

关于javascript - 为什么在 React Hooks 中排序后数组不更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61139829/

相关文章:

reactjs - React hook 依赖函数作为 props

javascript - 我应该用 useCallback 或 useMemo 包装每个 prop,什么时候使用这个钩子(Hook)?

javascript - 检查对象和属性是否存在

asp.net - 关于Asp.net core和react的认证

javascript - JavaScript 中的斜体而不使用 variableName.italics() 创建变量?

javascript - React 与 dom 交互

javascript - 从另一个组件打开模态点击 react js

javascript - 收到警告 : Maximum update depth exceeded when filtering a list

javascript - 简单的 Kendo 网格单元格模板以无包装方式显示单元格数据,结尾为 '...' 和一个按钮

javascript - 如何使用 javascript/jQuery 重新选择文本区域中选定的文本?