我已经在React类组件中这样做了,但我需要在React函数组件中这样做,因为我想学习将类组件转换为函数组件。
onSortByPlatformAsc = () => {
var sortByPlatform = this.state.listGames.sort((a, b) =>
a.platform.localeCompare(b.platform)
);
this.setState({ listGames: sortByPlatform });
};
onSortByPlatformDesc = () => {
var sortByPlatform = this.state.listGames.sort((a, b) =>
a.platform.localeCompare(b.platform)
);
this.setState({ listGames: sortByPlatform.reverse() });
};
在功能组件中这样做几乎是相同的,除了您设置状态的部分。您将拥有一个状态值和一个使用useState钩子设置状态的函数,如下所示:
const [games, setGames] = useState({
listGames:[]
})
然后你所需要做的就是调用setGames函数并设置你想要设置的值,如下所示
onSortByPlatformAsc = () => {
var sortByPlatform = this.state.listGames.sort((a, b) =>
a.platform.localeCompare(b.platform)
);
setGames({ listGames: sortByPlatform });
};
onSortByPlatformDesc = () => {
var sortByPlatform = this.state.listGames.sort((a, b) =>
a.platform.localeCompare(b.platform)
);
setGames({ listGames: sortByPlatform.reverse() });
};
希望这能回答你的问题。
为了在功能组件中使用状态,你应该使用useState()
钩子。功能成分中没有this
关键字
import { useState } from 'react';
const [listGames, setListGames] = useState([])
onSortByPlatformAsc = () => {
var sortByPlatform = listGames.sort((a, b) =>
a.platform.localeCompare(b.platform)
);
setListGames(sortByPlatform);
};
onSortByPlatformDesc = () => {
var sortByPlatform = listGames.sort((a, b) =>
a.platform.localeCompare(b.platform)
);
setListGames(sortByPlatform.reverse());
}
坦率地说,这并没有太大的不同。
这种情况下的差异主要有:
this
不再相关- 函数需要像普通函数或const一样声明。
state
不再是一个对象,虽然它可以是如果你想,但也可以是独立的状态块,由内置的useState
钩子声明。
你发布的代码应该是这样的:
import { useState } from 'react';
function MyComponent() {
const [listGames, setListGames] = useState([]);
const onSortByPlatformAsc = () => {
var sortByPlatform = state.listGames.sort((a, b) =>
a.platform.localeCompare(b.platform)
);
setListGames(sortByPlatform);
};
const onSortByPlatformDesc = () => {
var sortByPlatform = state.listGames.sort((a, b) =>
a.platform.localeCompare(b.platform)
);
setListGames(sortByPlatform.reverse());
};
}
如果还有问题,请尽管问。
Array.prototype.sort
和Array.prototype.reverse
都进行就地排序和排序。换句话说,他们变异数组操作结束。如果你在React状态下调用它,它会改变状态,这是React中的一个主要反模式。
假设您已经将类组件this.state.listGames
转换并存储为函数组件listGames
useState
React hook:
const [listGames, setListGames] = React.useState([]);
我建议将代码分解一点来创建排序和逆排序比较器函数:
const sortComparator = (a, b) => a.platform.localeCompare(b.platform);
const inverseSortComparator = (a, b) => sortComparator(b, a);
使用功能状态更新访问前一个状态,创建一个副本,然后使用比较器对其排序。
const onSortByPlatformAsc = () => {
setListGames(listGames => listGames.slice().sort(sortComparator));
};
要执行反向排序,再次使用函数状态更新,创建副本,然后使用反向排序比较器函数交换排序顺序。
const onSortByPlatformDesc = () => {
setListGames(listGames => listGames.slice().sort(inverseSortComparator));
};