Open In App

How to add SearchBar in React Native ?

Last Updated : 10 May, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

In this article, we'll add search functionality in React-Native. This can be regarded as a continuation of the React native flatlist component. In the article above, we created a flatlist using the Flatlist component. Let's make it searchable using the SearchBar component. To add a SearchBar to your Flatlist, the basic syntax looks like the following. Let's watch a demo video of what we are going to develop.

Demo Video


Syntax

<SearchBar
placeholder="Type Here..."
onChangeText={this.updateSearch}
value={search}
/>

Approach

The above syntax adds a standard platform-specific search bar in your application, which is usually a rectangular box with space for input. Upon scrolling to the implementation section, you'd notice that we add a prop placeholder that specifies the default value that the search bar displays when opened. Also, we want the search bar to be light-themed with rounded edges, hence the following props. Now, when we want to search a value, we'd want to display that value being entered in the search bar, for that we add an object search value from the Search class, by default it is empty, but as we type, it is modified and stores our present text input. Since the search values are custom, we turn off the auto Correct option and invoke the search Function as soon as the text is entered in the search field.

Prop

Description

cancelButtonProps

It specifies various props passed to cancel Button, which can customize its color, button style, text color, etc.

cancelButtonTitle

It is used to customize the title of the cancel button present on the right side.

cancelIcon

This prop allows you to override the Icon props or use a custom component, also, this is specific to the Android platform.

clearIcon

This prop allows you to override the Icon props or use a custom component. Values such as null or false can be used to hide the icon.

containerStyle

The container of the SearchBar can be stylised using this prop.

inputContainerStyle

This prop is used to style the container where the text is input.

inputStyle

This prop is used to stylize the input text.

leftIconContainerStyle

Style the icon container on the left side.

lightTheme

This prop changes the theme to light theme.

loadingProps

This prop is passed to ActivityIndicator.

onCancel

This prop lets the callback fire when pressing the cancel button (IOS) or the back icon (Android).

onChangeText

This prop invokes the method that should fire when text is changed.

onClear

This specifies the method to fire when input is cleared.

placeholder

This prop is used to set the placeholder text.

placeholderTextColor

This prop sets the color of the placeholder text.

platform

This prop specifies the look and feel of the search bar. The values to choose from are "default", "IOS", "Android".

rightIconContainerStyle

We can style the icon container on the right side using this prop.

round

This prop is used to change the TextInput styling to rounded corners.

searchIcon

This prop allows you to override the Icon props or use a custom component. Use null or false to hide the icon.

showCancel

If this propis set to true, the cancel button will stay visible even after blur events.

showLoading

This propshows the loading ActivityIndicator effect.

underlineColorAndroid

This prop specifies a transparent underline color, other than the default one.


Step-by-Step Implementation

Step 1: Create a React Native Project

Now, create a project with the following command.

npx create-expo-app app-name --template

Note: Replace the app-name with your app name for example : react-native-demo-app

Next, you might be asked to choose a template. Select one based on your preference as shown in the image below. I am selecting the blank template because it will generate a minimal app, as clean as an empty canvas in JavaScript.


It completes the project creation and displays a message: "Your Project is ready!" as shown in the image below.


Now go into your project folder, i.e., react-native-demo

cd app-name

Project Structure:


Step 2: Run  Application

Start the server by using the following command.

npx expo start

Then, the application will display a QR code.

  • For the Android users,
    • For the Android Emulator, press "a" as mentioned in the image below.
    • For the Physical Device, download the "Expo Go" app from the Play Store. Open the app, and you will see a button labeled "Scan QR Code." Click that button and scan the QR code; it will automatically build the Android app on your device.
  • For iOS users, simply scan the QR code using the Camera app.
  • If you're using a web browser, it will provide a local host link that you can use as mentioned in the image below.


Step 3: Start Coding

Now let's see the implementation of how to add a search bar using the above approach.

- Import libraries: Import required libraries at the top of the file.

JavaScript
// Import React and Component from react library
import React from "react"; 
// Import necessary components from react-native
import { StyleSheet, Text, View, FlatList } from "react-native"; 
// Import SearchBar component from react-native-elements library
import { SearchBar } from "react-native-elements";


- StyleSheet: Create a StyleSheet to style components like container, item, and itemText.

JavaScript
// Styles for the components
const styles = StyleSheet.create({
  container: {
    flex: 1, // Take up the full screen
    marginTop: 30, // Margin from the top
    padding: 10, // Padding inside the container
  },
  item: {
    backgroundColor: "green", // Background color for each item
    padding: 20, // Padding inside each item
    marginVertical: 8, // Vertical margin between items
    marginHorizontal: 16, // Horizontal margin between items
    borderRadius: 8, // Rounded corners for each item
  },
  itemText: {
    color: "white", // Text color
    fontSize: 18, // Font size for the text
  },
});


- Sample Data: This is the list of data that is displayed on the screen using FlatList.

JavaScript
// Sample data to display in the FlatList
const DATA = [
  { id: "1", title: "Data Structures" },
  { id: "2", title: "STL" },
  { id: "3", title: "C++" },
  { id: "4", title: "Java" },
  { id: "5", title: "Python" },
  { id: "6", title: "CP" },
  { id: "7", title: "ReactJs" },
  { id: "8", title: "NodeJs" },
  { id: "9", title: "MongoDb" },
  { id: "10", title: "ExpressJs" },
  { id: "11", title: "PHP" },
  { id: "12", title: "MySql" },
];


- SearchBar: This Component is used to take input from the user and search for the user's requested item in the list.

JavaScript
{/* SearchBar component for user input */}
<SearchBar
    placeholder="Search Here..." // Placeholder text for the search bar
    lightTheme // Use light theme for the search bar
    round // Make the search bar round
    value={searchValue} // Bind the search value to the state
    onChangeText={searchFunction} // Call searchFunction on text change
    autoCorrect={false} // Disable auto-correct
    backgroundColor="white" // Background color of the search bar
    containerStyle={{
        backgroundColor: "white", // Background color of the container
        borderTopWidth: 0, // Remove top border
        borderBottomWidth: 0, // Remove bottom border
        padding: 10, // Padding around the container
        borderColor: "black", // Border color
    }}
    inputContainerStyle={{
        backgroundColor: "lightgrey", // Background color of the input container
        borderRadius: 10, // Rounded corners for the input container
    }}
    inputStyle={{
        backgroundColor: "white", // Background color of the input field
        borderRadius: 10, // Rounded corners for the input field
        padding: 10, // Padding inside the input field
    }}
    searchIcon={{ size: 24, color: "black" }} // Style for the search icon
    clearIcon={{ size: 24, color: "black" }} // Style for the clear icon
    cancelIcon={{ size: 24, color: "black" }} // Style for the cancel icon
/>


- FlatList: This Component is used to display a list of data in a vertically or horizontal scrollable list.

JavaScript
{/* FlatList to display the filtered data */}
<FlatList
    data={data} // Data to display in the list
    renderItem={({ item }) => <Item title={item.title} />} // Render each item using the Item component
    keyExtractor={(item) => item.id} // Unique key for each item
/>


- Item: This functional component is used to render each item in Flatlist with respective style like background color, padding, border radius ,text color, etc.

JavaScript
// Functional component to render each item in the FlatList
const Item = ({ title }) => (
  <View style={styles.item}> {/* Style for each item */}
    <Text style={styles.itemText}>{title}</Text> {/* Display the title */}
  </View>
);


- arrayholder: It holds the original data so that we can filter it based on the search input.

JavaScript
const arrayholder = React.useRef(DATA); 


- searchFunction: This function is the business logic for search functionality.

JavaScript
// Function to handle search functionality
const searchFunction = (text) => {
    const updatedData = arrayholder.current.filter((item) => {
        const itemData = item.title.toUpperCase(); // Convert item title to uppercase
        const textData = text.toUpperCase(); // Convert search text to uppercase
        return itemData.includes(textData); // Check if item title includes the search text
    });
    setData(updatedData); // Update the filtered data
    setSearchValue(text); // Update the search value
};


- useState: This is used to manage the state of the filter Data and the search input value.

JavaScript
// State to manage the filtered data and search input
const [data, setData] = React.useState(DATA);
// State to manage the search input value
const [searchValue, setSearchValue] = React.useState(""); 


- App Component: Wrap the SearchBar and FlatList with a View and return that inside the App function to render and place the useState, arrayholder inside the App function, also make sure to export the App.

JavaScript
export default Search = () => {
  // State to manage the filtered data and search input
  const [data, setData] = React.useState(DATA);
  // State to manage the search input value
  const [searchValue, setSearchValue] = React.useState(""); 
  // Ref to hold the original data
  const arrayholder = React.useRef(DATA); 

  // Function to handle search functionality
  const searchFunction = (text) => {
    const updatedData = arrayholder.current.filter((item) => {
      const itemData = item.title.toUpperCase(); // Convert item title to uppercase
      const textData = text.toUpperCase(); // Convert search text to uppercase
      return itemData.includes(textData); // Check if item title includes the search text
    });
    setData(updatedData); // Update the filtered data
    setSearchValue(text); // Update the search value
  };

  return (
    <View style={styles.container}> {/* Main container style */}
      {/* SearchBar component for user input */}
      <SearchBar
        placeholder="Search Here..." // Placeholder text for the search bar
        lightTheme // Use light theme for the search bar
        round // Make the search bar round
        value={searchValue} // Bind the search value to the state
        onChangeText={searchFunction} // Call searchFunction on text change
        autoCorrect={false} // Disable auto-correct
        backgroundColor="white" // Background color of the search bar
        containerStyle={{
          backgroundColor: "white", // Background color of the container
          borderTopWidth: 0, // Remove top border
          borderBottomWidth: 0, // Remove bottom border
          padding: 10, // Padding around the container
          borderColor: "black", // Border color
        }}
        inputContainerStyle={{
          backgroundColor: "lightgrey", // Background color of the input container
          borderRadius: 10, // Rounded corners for the input container
        }}
        inputStyle={{
          backgroundColor: "white", // Background color of the input field
          borderRadius: 10, // Rounded corners for the input field
          padding: 10, // Padding inside the input field
        }}
        searchIcon={{ size: 24, color: "black" }} // Style for the search icon
        clearIcon={{ size: 24, color: "black" }} // Style for the clear icon
        cancelIcon={{ size: 24, color: "black" }} // Style for the cancel icon
      />
      {/* FlatList to display the filtered data */}
      <FlatList
        data={data} // Data to display in the list
        renderItem={({ item }) => <Item title={item.title} />} // Render each item using the Item component
        keyExtractor={(item) => item.id} // Unique key for each item
      />
    </View>
  );
};


Complete Source Code

App.js

javascript
// Import React and Component from react library
import React from "react"; 
// Import necessary components from react-native
import { StyleSheet, Text, View, FlatList } from "react-native"; 
// Import SearchBar component from react-native-elements library
import { SearchBar } from "react-native-elements"; 

// Sample data to display in the FlatList
const DATA = [
  { id: "1", title: "Data Structures" },
  { id: "2", title: "STL" },
  { id: "3", title: "C++" },
  { id: "4", title: "Java" },
  { id: "5", title: "Python" },
  { id: "6", title: "CP" },
  { id: "7", title: "ReactJs" },
  { id: "8", title: "NodeJs" },
  { id: "9", title: "MongoDb" },
  { id: "10", title: "ExpressJs" },
  { id: "11", title: "PHP" },
  { id: "12", title: "MySql" },
];

// Functional component to render each item in the FlatList
const Item = ({ title }) => (
  <View style={styles.item}> {/* Style for each item */}
    <Text style={styles.itemText}>{title}</Text> {/* Display the title */}
  </View>
);

export default Search = () => {
  // State to manage the filtered data and search input
  const [data, setData] = React.useState(DATA);
  // State to manage the search input value
  const [searchValue, setSearchValue] = React.useState(""); 
  // Ref to hold the original data
  const arrayholder = React.useRef(DATA); 

  // Function to handle search functionality
  const searchFunction = (text) => {
    const updatedData = arrayholder.current.filter((item) => {
      const itemData = item.title.toUpperCase(); // Convert item title to uppercase
      const textData = text.toUpperCase(); // Convert search text to uppercase
      return itemData.includes(textData); // Check if item title includes the search text
    });
    setData(updatedData); // Update the filtered data
    setSearchValue(text); // Update the search value
  };

  return (
    <View style={styles.container}> {/* Main container style */}
      {/* SearchBar component for user input */}
      <SearchBar
        placeholder="Search Here..." // Placeholder text for the search bar
        lightTheme // Use light theme for the search bar
        round // Make the search bar round
        value={searchValue} // Bind the search value to the state
        onChangeText={searchFunction} // Call searchFunction on text change
        autoCorrect={false} // Disable auto-correct
        backgroundColor="white" // Background color of the search bar
        containerStyle={{
          backgroundColor: "white", // Background color of the container
          borderTopWidth: 0, // Remove top border
          borderBottomWidth: 0, // Remove bottom border
          padding: 10, // Padding around the container
          borderColor: "black", // Border color
        }}
        inputContainerStyle={{
          backgroundColor: "lightgrey", // Background color of the input container
          borderRadius: 10, // Rounded corners for the input container
        }}
        inputStyle={{
          backgroundColor: "white", // Background color of the input field
          borderRadius: 10, // Rounded corners for the input field
          padding: 10, // Padding inside the input field
        }}
        searchIcon={{ size: 24, color: "black" }} // Style for the search icon
        clearIcon={{ size: 24, color: "black" }} // Style for the clear icon
        cancelIcon={{ size: 24, color: "black" }} // Style for the cancel icon
      />
      {/* FlatList to display the filtered data */}
      <FlatList
        data={data} // Data to display in the list
        renderItem={({ item }) => <Item title={item.title} />} // Render each item using the Item component
        keyExtractor={(item) => item.id} // Unique key for each item
      />
    </View>
  );
};


// Styles for the components
const styles = StyleSheet.create({
  container: {
    flex: 1, // Take up the full screen
    marginTop: 30, // Margin from the top
    padding: 10, // Padding inside the container
  },
  item: {
    backgroundColor: "green", // Background color for each item
    padding: 20, // Padding inside each item
    marginVertical: 8, // Vertical margin between items
    marginHorizontal: 16, // Horizontal margin between items
    borderRadius: 8, // Rounded corners for each item
  },
  itemText: {
    color: "white", // Text color
    fontSize: 18, // Font size for the text
  },
});

Output



Next Article

Similar Reads