Search code examples
restreact-nativereact-native-elements

Search bar in React Native not updating or filtering


I'm trying to set up data filtering by SearchBar from react-native-elements. I'm returning some data from the server in a JSON format so it arrives in this form of an Array of Objects.

This is what I have so far:

export default function AktList() {
  const [akt, setAkt] = useState([]);
  const [temp, setTemp] = useState([]);

  async function request() {
    fetch("http://192.168.5.12:5000/aktprikaz", {
      method: "get"
    })
      .then(res => res.json())
      .then(res => setAkt(res))
      .then(temp => setTemp(akt));
  }
  useEffect(() => {
    request();
  }, []);
  function Item({ title, selected }) {
    return (
      <TouchableOpacity
        onPress={() => console.log(temp)}
        style={[
          styles.item,
          { backgroundColor: selected ? "#6e3b6e" : "#f9c2ff" }
        ]}
      >
        <Text style={styles.title}>{title}</Text>
      </TouchableOpacity>
    );
  }
  function contains(text) {
    const newData = temp.filter(item => {
      const itemData = {title};

      const textData = text.toUpperCase();

      return itemData.indexOf(textData) > -1;
    });
    setAkt(newData);
  }
  return (
    <SafeAreaView style={styles.container}>
      <Header />
      <SearchBar onChangeText={text => contains(text)} />
      <FlatList
        data={akt}
        renderItem={({ item }) => <Item title={item.title} />}
        keyExtractor={item => item.id}
      />
    </SafeAreaView>
  );
}

Currently, nor is the text updating nor is it filter anything. I've tried following this tutorial online (tho it is written using classes not functions). What am I doing wrong here?


Solution

  • Check below example which i created using flatlist and TextInput. Items are displayed in the form of a dropdown list when you search items. i think this will help you.

    import React, { Component } from 'react';
    import { View, Text, FlatList, TextInput, ListItem } from 'react-native';
    
    class FlatListDropDown extends Component {
      constructor(props) {
        super(props);
    
        this.state = {
          data: [],
          value: '',
        };
    
        this.arrayNew = [
          { name: 'Robert' },
          { name: 'Bryan' },
          { name: 'Vicente' },
          { name: 'Tristan' },
          { name: 'Marie' },
          { name: 'Onni' },
          { name: 'sophie' },
          { name: 'Brad' },
          { name: 'Samual' },
          { name: 'Omur' },
          { name: 'Ower' },
          { name: 'Awery' },
          { name: 'Ann' },
          { name: 'Jhone' },
          { name: 'z' },
          { name: 'bb' },
          { name: 'cc' },
          { name: 'd' },
          { name: 'e' },
          { name: 'f' },
          { name: 'g' },
          { name: 'h' },
          { name: 'i' },
          { name: 'j' },
          { name: 'k' },
          { name: 'l' },
        ];
      }
    
      renderSeparator = () => {
        return (
          <View
            style={{
              height: 1,
              width: '100%',
              backgroundColor: '#CED0CE',
            }}
          />
        );
      };
    
      searchItems = text => {
        const newData = this.arrayNew.filter(item => {
          const itemData = `${item.name.toUpperCase()}`;
          const textData = text.toUpperCase();
          return itemData.indexOf(textData) > -1;
        });
        this.setState({
          data: newData,
          value: text,
        });
      };
    
      renderHeader = () => {
        return (
          <TextInput
            style={{ height: 60, borderColor: '#000', borderWidth: 1 }}
            placeholder="   Type Here...Key word"
            onChangeText={text => this.searchItems(text)}
            value={this.state.value}
          />
        );
      };
    
      render() {
        return (
          <View
            style={{
              flex: 1,
              padding: 25,
              width: '98%',
              alignSelf: 'center',
              justifyContent: 'center',
            }}>
            <FlatList
              data={this.state.data}
              renderItem={({ item }) => (
                <Text style={{ padding: 10 }}>{item.name} </Text>
              )}
              keyExtractor={item => item.name}
              ItemSeparatorComponent={this.renderSeparator}
              ListHeaderComponent={this.renderHeader}
            />
          </View>
        );
      }
    }
    
    export default FlatListDropDown;
    

    Feel free for doubts.