将无限 FlatList 与搜索一起使用时遇到问题
Having trouble using infinite FlatList together with a search
所以我正在使用 FlatList 列出一些 D&D 生物,并且我正在尝试实现一个搜索栏,用户可以在其中直接找到他们正在寻找的内容。
function LandingPage() {
const [referencesList, setReferencesList] = useState([])
const [search, setSearch] = useState('')
const [page, setPage] = useState(1)
const renderItem = ({ item }) => (
<ReferenceItem name={`${item.name} CR: ${item.challenge_rating}`} key={item.slug} index={item.slug}/>
)
useEffect(() => {
api.get('/', {
params: {
fields: ['slug', 'name', 'challenge_rating'].join(),
limit: 100,
ordering: 'slug',
search,
page
}
}).then( response => {
setReferencesList([...referencesList, ...response.data.results])
}).catch( error =>
console.log(error)
)
}, [search, page])
return (
<View style={styles.container}>
<PageHeader title="Monsters List">
<SearchReferences search={setSearch}/>
</PageHeader>
<FlatList
data={referencesList}
renderItem={renderItem}
keyExtractor={item => item.slug}
onEndReachedThreshold={40}
onEndReached={() => setPage(page + 1)}
/>
</View>
)
}
export default LandingPage
问题是,每次我尝试搜索某些内容时,它实际上都会将结果添加到我已有的列表中。我试过这样解决这个问题:
.then( response => {
let referencesResults = search === '' ? response.data.results : [...referencesList, ...response.data.results]
setReferencesList(referencesResults)
})
但现在当我搜索某些内容然后清除我的搜索时,它不会返回到我列表的初始状态。有人可以帮我吗?或者至少给我指明方向。
那是因为这里
setReferencesList([...referencesList, ...response.data.results])
您正在将新结果附加到整个现有列表,但没有对其进行重复数据删除。
看起来你想要的只是
setReferencesList(response.data.results)
除非您想缓存以前返回的结果,这需要一些额外的逻辑。
所以我正在使用 FlatList 列出一些 D&D 生物,并且我正在尝试实现一个搜索栏,用户可以在其中直接找到他们正在寻找的内容。
function LandingPage() {
const [referencesList, setReferencesList] = useState([])
const [search, setSearch] = useState('')
const [page, setPage] = useState(1)
const renderItem = ({ item }) => (
<ReferenceItem name={`${item.name} CR: ${item.challenge_rating}`} key={item.slug} index={item.slug}/>
)
useEffect(() => {
api.get('/', {
params: {
fields: ['slug', 'name', 'challenge_rating'].join(),
limit: 100,
ordering: 'slug',
search,
page
}
}).then( response => {
setReferencesList([...referencesList, ...response.data.results])
}).catch( error =>
console.log(error)
)
}, [search, page])
return (
<View style={styles.container}>
<PageHeader title="Monsters List">
<SearchReferences search={setSearch}/>
</PageHeader>
<FlatList
data={referencesList}
renderItem={renderItem}
keyExtractor={item => item.slug}
onEndReachedThreshold={40}
onEndReached={() => setPage(page + 1)}
/>
</View>
)
}
export default LandingPage
问题是,每次我尝试搜索某些内容时,它实际上都会将结果添加到我已有的列表中。我试过这样解决这个问题:
.then( response => {
let referencesResults = search === '' ? response.data.results : [...referencesList, ...response.data.results]
setReferencesList(referencesResults)
})
但现在当我搜索某些内容然后清除我的搜索时,它不会返回到我列表的初始状态。有人可以帮我吗?或者至少给我指明方向。
那是因为这里
setReferencesList([...referencesList, ...response.data.results])
您正在将新结果附加到整个现有列表,但没有对其进行重复数据删除。
看起来你想要的只是
setReferencesList(response.data.results)
除非您想缓存以前返回的结果,这需要一些额外的逻辑。