data = {toggleFilter? Products.sort ((a, b) => a.precoFinal - b.precoFinal): Products}
Сортировка массива приведет к изменению существующего массива. Так что, если toggleFilter
истинно, вы постоянно изменяете то, что в Products
, то рендеринг это. Когда вы переключаете toggleFilter
в false, вы используете Products
как есть, но из-за предыдущих рендеров это теперь отсортированный массив.
Вам нужно будет скопировать массив перед сортировкой:
export default () => {
const [toggleFilter, setToggleFilter] = useState(toggleFilter);
useEffect(() => {
setToggleFilter(false);
}, []);
const toggleOrdem = () => {
setToggleFilter(!toggleFilter);
};
const sortedArray = toggleFilter
? [...Products].sort((a, b) => a.precoFinal - b.precoFinal)
: Products;
return (
<ProductList>
<Header />
<Button title="toggle" onPress={toggleOrdem} />
<FlatList
keyExtractor={(item, index) => index.toString()}
showsVerticalScrollIndicator={false}
data={sortedArray}
renderItem={({ item }) => <Product data={item} />}
/>
</ProductList>
);
};
По соображениям производительности вы можете захотеть запомнить сортировку вместо сортировки каждый раз при рендеринге. Это можно сделать с помощью useMemo следующим образом:
const sortedArray = useMemo(() => {
return toggleFilter
? [...Products].sort((a, b) => a.precoFinal - b.precoFinal)
: Products;
}, [Products, toggleFilter]);
PS, этот эффект очень странный:
useEffect(() => {
setToggleFilter(false)
}, [])
Если вы хотите, чтобы переключение начиналось как ложное, удалите эффект и инициализировать состояние с const [toggleFilter, setToggleFilter] = useState(false);