Почему в моем React Native FlatList есть ключи с одинаковым значением?

Я не всегда получаю это предупреждение о ключах с одинаковым значением, но часто. Чаще всего это происходит при первом поиске.

Вот мой код:

const ITEMS_PER_PAGE = 5 

export default class SearchForm extends Component {

    state = {
        allStates: [],
        states: [],
        page: 1,
        displayStatesList: false,
    }

    componentDidMount = async () => {
        await fetch('https://servicodados.ibge.gov.br/api/v1/localidades/estados', {
            method: 'GET',
            headers: {
                Accept: 'application/json',
                'Content-Type': 'application/json',
            },
        })
        .then(res => res.json())
        .then(res => this.setState({ allStates: res, states: res.slice(0, ITEMS_PER_PAGE -1) })) 
    }

    updateSearch = search => {
        let { allStates } = this.state
        this.setState({ 
            states: allStates.filter(res => res.nome.includes(search)),
            displayStatesList: true,
            search: search,
        })       
    }

    loadMore = () => {
        const { page, states, allStates, search } = this.state
        const start = page*ITEMS_PER_PAGE
        const end = (page+1)*ITEMS_PER_PAGE-1
        const newData = allStates.slice(start, end).filter(res => res.nome.includes(search))
        console.info(allStates.length)
        this.setState({
            states: [...states, ...newData],
            page: page + 1,
        })
    }

    selectItem = (nome) => {
        console.info('press', nome)
        this.setState({
            search: nome,
            displayStatesList: false,
        })
    }

    renderItem = ({ item }) => {
        return (
            <View>
                <ListItem
                    title = {item.nome}  
                    onPress = {() => this.selectItem(item.nome)}                  
                />
            </View>
        );
    }

    render() {

        const {
            search,
            states,
            displayStatesList,
        } = this.state

        return (
            <View style = {styles.container}>
                <SearchBar
                    placeholder = "Type Here..."
                    onChangeText = {this.updateSearch}
                    value = {search}
                    lightTheme
                />
                <View style = {styles.listContainer}>
                    {displayStatesList && <FlatList
                        data = {states}
                        keyExtractor = {item => item.id.toString()}
                        renderItem = {this.renderItem}
                        onEndReached = {this.loadMore}
                        onEndReachedThreshold = {0.7}
                    />}    
                </View>
            </View>
        )
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        alignSelf: 'stretch',
        backgroundColor: '#fff',
    },
    listContainer: {
        height: 200
    },
})

Может быть, я делаю то, что не рекомендуется, и это вызывает ошибку? А может .slice не правильный?

Наблюдение: Если API не работает, могу выложить json файл для проверки.

Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
0
0
921
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте использовать эта удобная функция, чтобы убедиться, что в вашем массиве объектов нет дубликатов.

404 Не Найдено

FortuneCookie 22.03.2021 05:58
Ответ принят как подходящий

Возможно, есть дублирование в ответе API или с вашей стороны при добавлении новых данных в метод loadMore.

Вы можете попробовать изменить этот keyExtractor = {(item,index)=> index.toString()}

и добавьте это в самый первый компонент renderItem key = {index} в качестве реквизита.

Это гарантирует, что ключ, предоставляемый каждому элементу в `Flatlist', уникален.

это решает предупреждение, но не решает тот факт, что у меня есть повторяющиеся значения

Vencovsky 30.01.2019 01:29

вы можете попробовать console.info в методе loadMore перед this.setState для состояний и новых данных, проверьте, есть ли дублирование или нет.

Jaydeep Galani 30.01.2019 05:46

Другие вопросы по теме