reactjs - React.js:如何根据 API 调用正确排序?
问题描述
我正在学习React.js并且第一次遇到这个。我正在获取API 数据,并希望能够根据卡片本身的属性对数据进行排序。所以,我使用Switch来处理多重排序。当我第一次单击时,它似乎可以工作,但是当我再次单击另一个按钮时,应用程序停止响应并且没有错误以找出问题所在。它只是停止工作。我也尝试过useMemo ,但没有区别。任何帮助将不胜感激。这是我的代码结构:
import { useState, useEffect} from 'react'
export default function useCountries(search: string, activeFilter: any) {
const [data, setData] = useState<any[]>([])
const [savedCountries, setSavedCountries] = useState<any[]>([])
const fetchData = () => {
fetch('https://restcountries.eu/rest/v2/all')
.then((res) => res.json())
.then((result) => {
setData(result)
setSavedCountries(result)
})
.catch((err) => console.log(err))
}
useEffect(() => {
const result = [...savedCountries].filter((item: any) =>
item.name.toLowerCase().includes(search.toLowerCase())
)
setData(result)
}, [search, savedCountries])
useEffect(() => {
fetchData()
}, [])
const sortCountry = (countries: any) => {
const filter = activeFilter.toLowerCase()
switch (filter) {
case 'flag':
const sortByFlag = [...countries].sort((a: any, b: any) =>
a.flag.localeCompare(b.flag)
)
setData(sortByFlag)
break
case 'region':
const sortByRegion = [...countries].sort((a: any, b: any) =>
a.region.localeCompare(b.region)
)
setData(sortByRegion)
break
case 'language':
const sortByLanguages = [...countries].sort((a: any, b: any) =>
a.languages[0].name.localeCompare(b.languages[0].name)
)
setData(sortByLanguages)
break
case 'population':
const sortPopulation = [...countries].sort(
(a: any, b: any) => a.population - b.population
)
setData(sortPopulation)
break
case 'name':
const sortByName = [...countries].sort((a: any, b: any) =>
a.name.localeCompare(b.name)
)
setData(sortByName)
break
}
}
useEffect(() => {
sortCountry(data)
}, [activeFilter, data, sortCountry])
return [data]
}
onClick 组件
import React from 'react'
/* import { HeaderProps } from '../../types'
*/
import './Header.scss'
export default function Header({ setActiveFilter }: any) {
return (
<div className="header">
<ul className="HeadTableRow">
<li>
<button onClick={() => setActiveFilter('flag')}>Flag</button>
</li>{' '}
<li>
<button onClick={() => setActiveFilter('name')}>Name</button>
</li>
<li>
<button onClick={() => setActiveFilter('language')}>Language</button>
</li>
<li>
<button onClick={() => setActiveFilter('population')}>
Population
</button>
</li>
<li>
<button onClick={() => setActiveFilter('region')}>Region</button>
</li>
</ul>
</div>
)
}
解决方案
推荐阅读
- google-apps-script - 如何从连字符分隔的列表中提取文本,单元格内可能有新行(因此有多个条目)?
- r - 循环遍历 R 中的变量名
- c# - 通过 SqlCommand 创建登录 - 未替换的参数
- c - 为什么使用整数来存储 4 个字符?有什么实际好处吗?
- ruby-on-rails - 身份验证响应中的 HTTP 错误 422
- c# - Visual Studio 2017 不支持面向 .NET Core 3.0
- ansible - 在 AWX 中的变量中搜索值
- java - Spring-RMI 事件导致 java.io.InvalidClassException: filter status: REJECTED
- google-sheets - 如何在谷歌表格中对列表进行排序,因为当新值键入时,它显示在查询公式的底部列表中?
- python - 过滤 pandas DataFrame 的重复行