【问题标题】:Having trouble using infinite FlatList together with a search将无限 FlatList 与搜索一起使用时遇到问题
【发布时间】:2021-01-05 20:36:14
【问题描述】:

所以我正在使用 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)
})

但是现在当我搜索某些内容然后擦除搜索时,它不会回到我列表的初始状态。有人可以帮我吗?或者至少给我指明一个方向。

【问题讨论】:

    标签: android reactjs react-native mobile react-native-flatlist


    【解决方案1】:

    因为这里

    setReferencesList([...referencesList, ...response.data.results])
    

    您正在将新结果附加到整个现有列表中,而不是对其进行重复数据删除。

    看起来你想要的只是

    setReferencesList(response.data.results)
    

    除非你想缓存以前返回的结果,这需要一些额外的逻辑。

    【讨论】:

    • 是的,我知道它是附加的,我需要它才能使分页工作,但我也需要搜索工作,所以我有点陷入这个问题。
    • 哦,我明白了。当搜索输入发生变化时(在进行 api 调用之前)清除列表会解决问题吗?
    • 它确实解决了它。 api调用遇到了一些麻烦,但我会调查一下,如果没有任何效果,也许我会发布另一个问题
    猜你喜欢
    • 2013-03-20
    • 2021-07-15
    • 2013-06-19
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多