为什么 ReactJS 中的 UseState 会阻止布尔值更新?

Why is UseState in ReactJS preventing a boolean from updating?

所以我有一个代码,用于重新排列按名称打印在 table 上的用户列表。当我只是简单地 console.log() 排列的数组时,它工作得很好。一旦我引入 useState,它就会更新一次。

所以这是原始的工作代码

 import React from 'react'
import { useState } from 'react'


export const Table = () => {

 
 // ///////////////////UseState Array //
 let asc = true
 var newArr
 const [Array2,SetArray] = useState([
     {rank:1,name:'Sam', age:25, gender:true},
     {rank:2,name:'Bill', age:35, gender:true},
     {rank:3,name:'John', age:22, gender:true},
     {rank:4,name:'Sarah', age:19, gender:false}]
 )
 const Alpha2 = ()=>{
    console.log(asc)


if (asc===true){
     newArr = [...Array2].sort((a,b) => (a.name> b.name) ? 1 : ((b.name > a.name) ? -1 : 0))
    asc = false 

    console.log('cond 1')
  
    }
   
else if(asc=== false ){
     newArr = [...Array2].sort((a,b) => (b.name> a.name) ? 1 : ((a.name > b.name) ? -1 : 0))
     asc = true 
     console.log('cond 2')
    
}
console.log(newArr)



}


//                  
    return (
        <div className="Table">
              
            </div>
             <h3>Table 2</h3>
             <div className="Standings">
<div className="column">
                <div> <h3>Rank</h3></div>
               <div onClick= {()=>Alpha2()}> <h3 >Name</h3></div>
                <div> <h3 onClick= {()=>Numa()}>Age</h3></div>
                <div> <h3>Gender</h3></div>
</div>
            {Array2.map((profile)=>(
            <div key={profile.rank} className="column">
                 <div> <h3>{profile.rank}</h3></div>
                <div> <h3>{profile.name}</h3></div>
                <div> <h3>{profile.age}</h3></div>
                <div> <h3>{profile.gender?'male': 'female'}</h3></div>
                 
                                          
            </div>
        
     ))}

             </div>
        </div>
    )
}


export default Table

它在奇数次点击后将控制台记录为

: {rank: 2, name: 'Bill', age: 35, gender: true}
1: {rank: 3, name: 'John', age: 22, gender: true}
2: {rank: 1, name: 'Sam', age: 25, gender: true}
3: {rank: 4, name: 'Sarah', age: 19, gender: false}

在偶数次点击后为

0: {rank: 4, name: 'Sarah', age: 19, gender: false}
1: {rank: 1, name: 'Sam', age: 25, gender: true}
2: {rank: 3, name: 'John', age: 22, gender: true}
3: {rank: 2, name: 'Bill', age: 35, gender: true}

这是我想要的,因为它每次都按字母顺序重新排列(一次按降序排列,另一次按升序排列)。 asc 变量一直在 true 和 false 之间轮换

但是当我通过像这样修改 Alpha2 函数来使用 useState 函数 SetArray 时

 const Alpha2 = ()=>{
    console.log(asc)


if (asc===true){
     newArr = [...Array2].sort((a,b) => (a.name> b.name) ? 1 : ((b.name > a.name) ? -1 : 0))
    asc = false 

    console.log('cond 1')
  
    }
   
else if(asc=== false ){
     newArr = [...Array2].sort((a,b) => (b.name> a.name) ? 1 : ((a.name > b.name) ? -1 : 0))
     asc = true 
     console.log('cond 2')
    
}
SetArray(newArr)

console.log(newArr)



}

只把数组改成

一次
rank: 2, name: 'Bill', age: 35, gender: true}
1: {rank: 3, name: 'John', age: 22, gender: true}
2: {rank: 1, name: 'Sam', age: 25, gender: true}
3: {rank: 4, name: 'Sarah', age: 19, gender: false}

但它之后保持不变,因为 asc 变量永远不会像在早期版本的函数中那样从 false 变回 true

所以这是怎么回事?我做错了什么?

发生这种情况的原因是 useState 重新呈现页面,而只是将变量 'asc' 从 true 更改为 false 不会。

基本上,无论何时调用 useState,它都会刷新页面,并在这样做时将任何硬编码变量重置回其原始值。

更改此设置的唯一方法是像这样为 'asc' 变量使用挂钩

 const [asc, setAsc] = useState(true)

然后改成

setAsc(false)

应该可以解决问题。