Это связано с проблемой объема.У вас есть код, выполняющийся в асинхронном режиме, и код, выполняемый после этого в зависимости от асинхронного результата.Это не сработает для вас.
В функции searchFilter есть несколько проблем.
Когда вы создаете newData
, setState записывается в фильтр после оператора return.Он никогда не будет вызван, поэтому вы никогда не обновляете свое состояние.
Вы также, что кажется ненужным, вызываете setState несколько раз.Я думаю, вам нужно позвонить только дважды.Один раз, когда данные были загружены, и один раз, когда данные не удается загрузить.
Вот обновленный searchFilterFunction
, это должно дать вам некоторые идеи о том, как вы могли бы исправить свой код.
searchFilterFunction = text =>{
console.log(text);
fetch(
...
)
.then((response) => response.json())
.then((responseData) => {
const filteredData = responseData.data.filter(item => {
const itemData = `${item.post_title}`;
const textData = text;
return itemData.indexOf(textData) > -1;
});
this.setState({
data: filteredData,
text
});
})
.catch(error => {
this.setState({ error, loading: false, text });
});
}
Я удалил setState для текстав начале вам нужно установить его здесь, так как это вызовет повторную визуализацию.
В .then((responseData) => ... )
я обновил его, чтобы вы сразу выполнили фильтр наresponseData.data
, затем сохраните filteredData
и text
в состояние.
Я удалил настройку this.arrayholder
Я не думаю, что вам это действительно нужно, если только выИспользуем это в другом месте.
В вашем FlatList я бы добавил extraData
prop
Свойство маркера, чтобы сообщить списку для повторного рендеринга (так как он реализует PureComponent)
<FlatList
...
extraData={this.state}
...
>
Надеюсь, этого будет достаточно для исправления вашего кода.