Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么数组在React钩子中排序后不更新?_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 为什么数组在React钩子中排序后不更新?

Javascript 为什么数组在React钩子中排序后不更新?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我是新来的。处于状态的数组仅在排序函数之后更新一次。为什么在第二次触发排序功能后它不会再次更新 const [cases, setCases] = useState([1, 2, 3, 4, 5]); let sortDown = true let sorted = [] function sort(){ const copy = [...cases] if(sortDown){ sorted = copy.sort(funct

我是新来的。处于状态的数组仅在排序函数之后更新一次。为什么在第二次触发排序功能后它不会再次更新

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)
    }


您应该使用状态变量来决定sortType

否则,它将在每次渲染时重新初始化

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

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

当道具或状态改变时,React重新启动组件。在本例中,您声明
排序的
数组,然后将其传递给setCases。因此,setCases第一次采用排序的数组,这是一个新的值。然后再次对值进行排序,并对排序后的
数组进行变异,然后再次将其传递给setcase。但是SETASSE不考虑<代码>排序作为一个新的数组,因为它被修改了,所以引用没有改变。对于React,它仍然是第一次传递的相同数组。您需要返回新数组,然后将其传递给
设置案例

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

    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
        }

请显示完整的代码,并调用
sort()
sort直接操作数组。您不需要将已排序的数组保存到新数组中。
copy
数组已排序。因此,请改用
setCases(copy)
。如果不说明如何调用此函数,任何人都无法回答“为什么会触发两次排序”。您做了哪些更改?请解释您的答案sortDown现在是状态变量。当您使用方向可以是1或-1时,排序可以变得更简单:
[…cases]。排序((a,b)=>(a-b)*方向)
设置排序(!sortDown);-避免这种情况