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);-避免这种情况