每次我调用一个函数时,我的状态数组都会被清空

My state array gets emptied every time i call a function

我有这个:

const BillsOverviewScreen = props => {
const { navigation } = props;

const [availableBills, setAvailableBills] = useState([]);

const bills = useSelector(state => state.bills.bills);

useEffect (() => {
    setAvailableBills(bills);
}, [bills]);


const dispatch = useDispatch();

useEffect(() => {
    dispatch(billsActions.loadBills());
}, [dispatch]);

React.useLayoutEffect(() => {
    navigation.setOptions({
        headerRight: () => (   
            <View style={{flexDirection:'row'}}>
                <SortingMenu sortBills={sortBills} />
                <FilterMenu />                   
            </View>                            

        ),
    });
  }, [navigation]);

function sortBills(sortBy) {
    
    switch (sortBy) {
        case 'title': {
             setAvailableBills(availableBills.sort((a, b) => a.title < b.title ? -1 : (a.title > b.title ? 1 : 0)))
            break;
        };
        case 'dateExpiry_up': {
             setAvailableBills(availableBills.sort((a,b) => new Date(b.dateExpiry) - new Date(a.dateExpiry)));  
            break;        
        };
        case 'dateExpiry_down': {
            setAvailableBills(availableBills.sort((a,b) => new Date(a.dateExpiry) - new Date(b.dateExpiry)));  
            break;          
        };
        case 'dateCreated_up': {
            setAvailableBills(availableBills.sort((a,b) => new Date(b.dateCreated) - new Date(a.dateCreated)));
            break;
        };
        case 'dateCreated_down': {
            setAvailableBills(availableBills.sort((a,b) => new Date(a.dateCreated) - new Date(b.dateCreated)));
            break;
        };
        default: 
            return availableBills
            
    }
}

最初,我的状态 availableBills 数组按预期填充了正确的数据,但是一旦我使用我的 sortBills 函数,该数组就为空。奇怪的是,有时当我玩弄它时,它会起作用。但是当我重置我的应用程序时,它又是空的。我真的不知道我做错了什么。尝试了不同的方法但无法解决。

sort 进行就地突变,因此您正在突变状态而不是真正更新它。

sort

The sort() method sorts the elements of an array in place and returns the sorted array.

首先浅复制状态,然后对其进行排序,使用 .slice 轻松创建内联副本。我建议为此使用功能状态更新。功能状态更新通过在回调范围内从先前状态更新为已关闭的 availableBills 值来避免陈旧状态封闭。

setAvailableBills(availableBills => 
  availableBills.slice().sort((a, b) => 
    a.title < b.title ? -1 : (a.title > b.title ? 1 : 0)
));

在所有案例中应用此模式。