【发布时间】:2020-08-31 08:17:54
【问题描述】:
我想获取数据列表并在页面首次加载时对其进行排序,然后我希望能够按 (fName) 或 (lName) 排序。排序在我触发状态更改时起作用,但不是在初始加载时,它按照数据库给我的顺序显示,我想在加载数据后立即触发排序。
我已经尝试了所有我能想到的解决方案,但都没有成功。
sortByfName() 和 sortByName() 作为回调传递给从那里触发。
由于某种原因,排序向后工作,这就是为什么我传递相反的值,但这是我稍后会整理的另一个怪癖:-)
function App() {
const [contacts, setContacts] = useState([]);
const [sortBy, setSortBy] = useState('lName');
// GET DATA FROM SERVER
useEffect(() => {
axios
.get('http://localhost:5000/')
.then((result) => {
setContacts(result.data);
})
.catch((err) => console.log(err));
}, []);
// SORT CONTACTS
useEffect(() => {
const sorted = contacts.sort((a, b) => {
let nameA = a[sortBy].toUpperCase();
let nameB = b[sortBy].toUpperCase();
if (nameA < nameB) return -1;
if (nameA > nameB) return 1;
return 0;
});
setContacts(sorted);
}, [sortBy, contacts]);
const sortByfName = () => setSortBy('lName');
const sortBylName = () => setSortBy('fName');
... A few more functions and then render the JSX
【问题讨论】:
-
在第一次加载时,您首先要进行排序
lName或fName -
fName 我猜,但这并不重要。
-
然后在您的
.then中执行该排序逻辑并设置setContacts然后
标签: reactjs use-effect use-state