Create Project
C:\react>npx create-react-app demo-project
Run
C:\react\my-app> npm start
Install React Router Dom
https://www.npmjs.com/package/react-router-dom
C:\react\my-app>npm i react-router-dom --save
Install Axios
https://www.npmjs.com/package/axios
C:\react\my-app>npm install axios --save
C:\react\demo-project\src\App.js
//C:\react\demo-project\src\App.j
import React from 'react'
import "./App.css";
import { useEffect, useRef, useState } from "react";
import axios from "axios";
const App = () => {
// fetching data
const [users, setusers] = useState([]);
const fetchUsers = async () => {
const response = await axios.get(
//"https://jsonplaceholder.typicode.com/users"
"http://localhost/react/api/"
);
setusers(response.data);
};
useEffect(() => {
fetchUsers();
}, []);
// filter users
const [filtered, setfiltered] = useState([]);
const [search, setsearch] = useState("");
const searchRef = useRef();
useEffect(() => {
setfiltered(
users.filter((item) =>
item.name.toLowerCase().includes(search.toLowerCase())
)
);
}, [search]);
return (
<div className="app">
<div className="searchbox">
<form className="form-wrapper">
<input
type="text"
id="search"
placeholder="Search for..."
onChange={(e) => setsearch(e.target.value)}
ref={searchRef}
/>
<input type="submit" value="go" id="submit"/>
</form>
{search.length > 0 && (
<div className="dropdown">
{filtered.length > 0 ? (
filtered.map((item, index) => {
return (
<div
className="card"
key={index}
onClick={(e) => {
searchRef.current.value = item.name;
setsearch("");
}}>
<p>{item.name}</p>
</div>
);
})
) : (
<p>no match</p>
)}
</div>
)}
</div>
</div>
);
};
export default App;
C:\react\demo-project\src\App.css
//C:\react\demo-project\src\App.css
.app {
width:100%;
}
.searchbox {
width: 450px;
border-radius: 16px;margin:100px;
}
input {
border: none;
outline: none;
background-color: transparent;
}
.dropdown {
display: flex;background-color: #f6f6f6;
flex-direction: column;text-align:left;
}
.card {
padding: 0 8px;
}
.card:hover {
background: rgb(211, 210, 210);
}
body {
background: #eee;
font: 12px Lucida sans, Arial, Helvetica, sans-serif;
color: #333;
text-align: center;
}
a {
color: #2A679F;
}
/*========*/
.form-wrapper {
background-color: #f6f6f6;
background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#eae8e8));
background-image: -webkit-linear-gradient(top, #f6f6f6, #eae8e8);
background-image: -moz-linear-gradient(top, #f6f6f6, #eae8e8);
background-image: -ms-linear-gradient(top, #f6f6f6, #eae8e8);
background-image: -o-linear-gradient(top, #f6f6f6, #eae8e8);
background-image: linear-gradient(top, #f6f6f6, #eae8e8);
border-color: #dedede #bababa #aaa #bababa;
border-style: solid;
border-width: 1px;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
-webkit-box-shadow: 0 3px 3px rgba(255,255,255,.1), 0 3px 0 #bbb, 0 4px 0 #aaa, 0 5px 5px #444;
-moz-box-shadow: 0 3px 3px rgba(255,255,255,.1), 0 3px 0 #bbb, 0 4px 0 #aaa, 0 5px 5px #444;
box-shadow: 0 3px 3px rgba(255,255,255,.1), 0 3px 0 #bbb, 0 4px 0 #aaa, 0 5px 5px #444;
overflow: hidden;
padding: 8px;
width: 450px;
}
.form-wrapper #search {
border: 1px solid #CCC;
-webkit-box-shadow: 0 1px 1px #ddd inset, 0 1px 0 #FFF;
-moz-box-shadow: 0 1px 1px #ddd inset, 0 1px 0 #FFF;
box-shadow: 0 1px 1px #ddd inset, 0 1px 0 #FFF;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
color: #999;
float: left;
font: 16px Lucida Sans, Trebuchet MS, Tahoma, sans-serif;
height: 20px;
padding: 10px;
width: 320px;
}
.form-wrapper #search:focus {
border-color: #aaa;
-webkit-box-shadow: 0 1px 1px #bbb inset;
-moz-box-shadow: 0 1px 1px #bbb inset;
box-shadow: 0 1px 1px #bbb inset;
outline: 0;
}
.form-wrapper #search:-moz-placeholder,
.form-wrapper #search:-ms-input-placeholder,
.form-wrapper #search::-webkit-input-placeholder {
color: #999;
font-weight: normal;
}
.form-wrapper #submit {
background-color: #0483a0;
background-image: -webkit-gradient(linear, left top, left bottom, from(#31b2c3), to(#0483a0));
background-image: -webkit-linear-gradient(top, #31b2c3, #0483a0);
background-image: -moz-linear-gradient(top, #31b2c3, #0483a0);
background-image: -ms-linear-gradient(top, #31b2c3, #0483a0);
background-image: -o-linear-gradient(top, #31b2c3, #0483a0);
background-image: linear-gradient(top, #31b2c3, #0483a0);
border: 1px solid #00748f;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
-webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.3) inset, 0 1px 0 #FFF;
-moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.3) inset, 0 1px 0 #FFF;
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.3) inset, 0 1px 0 #FFF;
color: #fafafa;
cursor: pointer;
height: 42px;
float: right;
font: 15px Arial, Helvetica;
padding: 0;
text-transform: uppercase;
text-shadow: 0 1px 0 rgba(0, 0 ,0, .3);
width: 100px;
}
.form-wrapper #submit:hover,
.form-wrapper #submit:focus {
background-color: #31b2c3;
background-image: -webkit-gradient(linear, left top, left bottom, from(#0483a0), to(#31b2c3));
background-image: -webkit-linear-gradient(top, #0483a0, #31b2c3);
background-image: -moz-linear-gradient(top, #0483a0, #31b2c3);
background-image: -ms-linear-gradient(top, #0483a0, #31b2c3);
background-image: -o-linear-gradient(top, #0483a0, #31b2c3);
background-image: linear-gradient(top, #0483a0, #31b2c3);
}
.form-wrapper #submit:active {
-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5) inset;
-moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5) inset;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5) inset;
outline: 0;
}
.form-wrapper #submit::-moz-focus-inner {
border: 0;
}
C:\xampp\htdocs\react\api\index.php
//C:\xampp\htdocs\react\api\index.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
header("Access-Control-Allow-Methods: *");
include 'DbConnect.php';
$objDb = new DbConnect;
$conn = $objDb->connect();
$method = $_SERVER['REQUEST_METHOD'];
switch($method) {
case "GET":
$sql = "SELECT * FROM users";
$stmt = $conn->prepare($sql);
$stmt->execute();
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($users);
break;
}
C:\xampp\htdocs\react\api\DbConnect.php
//C:\xampp\htdocs\react\api\DbConnect.php
<?php
class DbConnect {
private $server = 'localhost';
private $dbname = 'reactDB';
private $user = 'root';
private $pass = '';
public function connect() {
try {
$conn = new PDO('mysql:host=' .$this->server .';dbname=' . $this->dbname, $this->user, $this->pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
} catch (\Exception $e) {
echo "Database Error: " . $e->getMessage();
}
}
}
?>
Run C:\react\my-app>npm start
