React Library (2)
React Library (2)
------------------------------------------------------------------------
- Download and Install React and Babel library for your project
react.developement.js
react-dom.development.js
babel.js
Ex: Home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/@babel/standalone/babel.js"></script>
<script type="text/babel">
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render("Welcome to React Home");
</script>
</head>
<body>
<div id="root"></div>
</body>
</html>
Note: "render()" of virtual DOM can render plain text content [RC Data Type]
or a component.
Component Rule
- It can be a function or class
- It must return markup
Syntax:
function Login()
{
return ( <markup> </markup> )
}
root.render(<Login />);
Ex: Home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/@babel/standalone/babel.js"></script>
<script type="text/babel">
function Login(){
return (
<div>
<h2>User Login</h2>
<dl>
<dt>User Name</dt>
<dd><input type="text" /></dd>
<dt>Password</dt>
<dd><input type="password"/></dd>
</dl>
<button>Login</button>
</div>
)
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Login/>);
</script>
</head>
<body>
<div id="root"></div>
</body>
</html>
Ex:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/@babel/standalone/babel.js"></script>
<script type="text/babel">
const Login = () => (
<div>
<h2>User Login</h2>
<dl>
<dt>User Name</dt>
<dd><input type="text" /></dd>
<dt>Password</dt>
<dd><input type="password"/></dd>
</dl>
<button>Login</button>
</div>
)
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Login></Login>);
</script>
</head>
<body>
<div id="root"></div>
</body>
</html>
- Open Terminal
>npm start
http://localhost:3000
Class
Class Members
- Property
- Accessor
- Method
- Constructor
Inheritance
Inheritance Rule:
- The derived class constructor must be called a super class constructor.
- Newly extended class is called a derived class.
- Existing class is called super.
class Super
{
constructor() { }
}
class Derived extends Super
{
constructor() {
super();
}
}
let obj = new Derived();
Ex:
<script>
class Super
{
constructor(){
document.write("Super Class Constructor<br>");
}
}
class Derived extends Super
{
constructor(){
super();
document.write("Derived Class Constructor");
}
}
let obj = new Derived();
</script>
Polymorphism
- Poly means many
- Morphos means Forms
- Configuring a component to work in different situations and with different behaviors is referred to
as Polymorphism.
Ex:
<script>
class Employee
{
FirstName;
LastName;
Designation;
Print(){
document.write(`${this.FirstName} ${this.LastName} - ${this.Designation}<br>`);
}
}
class Developer extends Employee
{
FirstName = "Raj";
LastName = "Kumar";
Designation = "Developer";
Role = "Developer Role : Build, Debug, Test, Deploy";
Print(){
super.Print();
document.write(this.Role);
}
}
class Admin extends Employee
{
FirstName = "Kiran";
LastName = "Kumar";
Designation = "Admin";
Role = "Admin Role : Authorization, Authentication";
Print(){
super.Print();
document.write(this.Role);
}
}
class Manager extends Employee
{
FirstName = "Tom";
LastName = "Hanks";
Designation = "Manager";
Role = "Manager Role : Approvals";
Print(){
super.Print();
document.write(this.Role);
}
}
let employees = new Array(new Developer(),new Admin(), new Manager());
var designation = prompt("Enter Designation");
for(var employee of employees)
{
if(employee.Designation==designation) {
employee.Print();
}
}
</script>
Summary
- JavaScript Language Basics
Variables
Data Types
Operators
Statements
Functions
- JavaScript OOP
- Modules
- Class
- Properties
- Methods
- Constructor
- Accessors
- Inheritance
- Polymorphism
React
- JavaScript library for building UI.
- React or React JS
- React is used in building UI for SPA. [Single Page Application]
- React is used in PWA [Progressive Web Application] - Mobile
- PWA are built by using React and React Native [iOS, Android].
Features of React
- Virtual DOM
- Modular
- Component Based
- AOT [JIT]
<head>
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></
script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></
script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
const root = ReactDOM.createRoot(document.getElementById("container"));
root.render("Hello ! from React");
</script>
</head>
<body>
<h1>React-Web-Application Home</h1>
<div id="container"></div>
</body>
</html>
React upto 17
<script type="text/babel">
</script>
React 18+
<script type="text/babel">
const root = ReactDOM.createRoot(document.getElementById("container"));
root.render("Hello ! from React");
</script>
>npx create-react-app shopping-react
>npm start
http://localhost:3000
2. The request is processed on "Web Server - HttpServer"
7. If requested is not available in the route table then it returns 404 : Not Found.
FAQ: How index.html is able to access the scripts without linking the script files?
Ans: By using "WebPack".
FAQ: What is the source for Index.html? From where index.html is accessing scripts?
Ans : src/index.js
index.html
<div id="root"> </div>
index.js
React Components
- Component is a template that comprises of
a) Presentation
b) Styles
c) Logic
- Presentation is defined using HTML
- Styles are defined by using CSS
- Logic is defined by JavaScript or TypeScript.
- Components are the building block for React Application.
- React components are designed by using
a) Function
b) Class
- Function
* Light weight
* Less memory
* Fast in rendering
* Hard to extend
- Class
* Heavy
* More memory
* Slow in rendering
* Easy to extend
Function Component
- Component function can be parameter less or parameterized.
- Every function component must return a presentation.
Syntax:
function ComponentName(params)
{
return (<markup> </markup>);
}
<h2>Head-1</h2> //invalid
<p> Line-1 </p>
<div>
<h2></h2>
<p></p>
</div>
- Complete presentation must return as one fragment.
<div> </div>
<> </>
<React.Fragment> </React.Fragment>
- JSX will not allow void elements. Every element must have an end tag.
<img> // invalid
<img> </img>
<img />
- You can't bind any content to an attribute, only properties are allowed.
reactflow.png
Designing a Component with Bootstrap Styles
import '../node_modules/bootstrap/dist/css/bootstrap.css';
import '../node_modules/bootstrap-icons/font/bootstrap-icons.css';
login.component.css
form {
width: 300px;
border:2px solid gray;
padding: 20px;
border-radius: 20px;
}
#form-container {
display: flex;
justify-content: center;
align-items: center;
height: 500px;
}
login.component.js
import './login.component.css';
export function LoginComponent()
{
return(
<div id="form-container" className="container-fluid">
<form>
<h2> <span className="bi bi-person-fill"></span> User Login</h2>
<div className="mb-2">
<label className="form-label">User Name</label>
<div>
<input type="text" className="form-control" />
</div>
</div>
<div className="mb-2">
<label className="form-label">Password</label>
<div>
<input type="password" className="form-control" />
</div>
</div>
<div className="mb-2">
<button className="btn btn-primary w-100">Login</button>
</div>
</form>
</div>
)
}
6. Go to "index.js" in src
root.render(
<React.StrictMode>
<LoginComponent />
</React.StrictMode>
);
netflix.zip
Compressed Archive
Data Binding in React
- Data binding is the process of accessing data from source and binding to UI.
- Identifying the changes in UI and updating back to source.
- Data Binding is handled in JavaScript and jQuery by using
a) DOM Methods
b) DOM Events
- React simplifies the data binding.
- Data binding is of 2 types
a) One Way Binding
b) Two Way Binding
Syntax:
var username = "John";
Ex:
data-binding.component.js
collection.map(function(item){
})
Note: Every iterating item which is generated dynamically must have a unique key in React.
Syntax:
collection.map(item=> <li key={item}> { item } </li>)
data-binding.component.js
data-binding.component.js
data-binding.component.js
return(
<div className="container-fluid">
<h2>Select Category</h2>
{
menu.map(item=>
<details key={item.Category}>
<summary>{item.Category}</summary>
<ul>
{
item.Products.map(product=>
<li key={product}>{product}</li>
)
}
</ul>
</details>
)
}
<h2>Shopping Menu</h2>
<ol>
{
menu.map(item=>
<li key={item.Category}>
{item.Category}
<ul>
{
item.Products.map(product=>
<li key={product}>{product}</li>
)
}
</ul>
</li>
)
}
</ol>
<h2>Select Product</h2>
<select>
{
menu.map(item=>
<optgroup label={item.Category} key={item.Category}>
{
item.Products.map(product=>
<option key={product}>{product}</option>
)
}
</optgroup>
)
}
</select>
</div>
)
}
data-binding.component.js
return(
<div className="container-fluid">
<h2>Courses</h2>
<div className="d-flex flex-wrap">
{
courses.map(course=>
<div className="card m-2 p-2">
<img src={course.Poster} className="card-img-top" height="150" />
<div className="card-header">
<h3>{course.Title}</h3>
</div>
<div className="card-body">
<ul>
{
course.Topics.map(topic=>
<li>{topic}</li>
)
}
</ul>
</div>
<div className="card-footer">
<button className="btn btn-primary w-100">Join Course</button>
</div>
</div>
)
}
</div>
</div>
)
}
- Variables are Immutable, so don't use variables for storing data in React.
- Always recommended to use "State".
What is State?
Why we need State?
Syntax:
import {useState} from 'react';
Syntax:
const {getter, setter} = useState(initialValue);
Ex:
import { useState } from "react";
Ex:
import { useState } from "react";
export function DataBindingComponent()
{
const [userName, setUserName] = useState("david");
function HandleUserName(e){
setUserName(e.target.value);
}
return(
<div className="container-fluid">
<h2>Register User</h2>
<dl>
<dt>User Name</dt>
<dd><input type="text" onKeyUp={HandleUserName} /></dd>
</dl>
<p>Hello ! {userName}</p>
</div>
)
}
Ex:
import { useState } from "react";
function NameChange(e){
setName(e.target.value);
}
function PriceChange(e){
setPrice(e.target.value);
}
function CityChange(e){
setCity(e.target.value);
}
function StockChange(e){
setStock(e.target.checked);
}
return(
<div className="container-fluid">
<div className="row">
<div className="col-3">
<h2>Register</h2>
<dl>
<dt>Name</dt>
<dd><input onChange={NameChange} type="text"/></dd>
<dt>Price</dt>
<dd><input onChange={PriceChange} type="number"/></dd>
<dt>City</dt>
<dd>
<select onChange={CityChange}>
<option>Delhi</option>
<option>Hyd</option>
</select>
</dd>
<dt>Stock</dt>
<dd className="form-switch">
<input onChange={StockChange} type="checkbox" className="form-check-input" />
Available
</dd>
</dl>
</div>
<div className="col-9">
<h2>Details</h2>
<dl>
<dt>Name</dt>
<dd>{Name}</dd>
<dt>Price</dt>
<dd>{Price}</dd>
<dt>City</dt>
<dd>{City}</dd>
<dt>Stock</dt>
<dd>{(Stock==true)?"Avaialble":"Out of Stock"}</dd>
</dl>
</div>
</div>
</div>
)
}
- API main role is to make data reachable to any device and any platform.
- Worlds First API is "Ebay".
- API have 3 specifications
a) SOAP
b) REST
c) JSON
- SOAP [Service Oriented Architecture Protocol]
Consumer => XML request
Provider => XML response
- REST [Representational State Transfer]
Consumer => query request
Provider => XML response
- JSON [JavaScript Object Notation]
Consumer => JSON Request
Provider => JSON Response
- Various Distributed Computing Technologies
CORBA
DCOM
RMI
EJB
Web Services
Remoting
},[dependencies]);
Ex: Consuming and Presenting API data using JavaScript Fetch promise
Nasa.component.js
function LoadPhotos(){
fetch("https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?
sol=1000&api_key=DEMO_KEY")
.then(function(response){
return response.json();
})
.then(function(data){
setMars(data.photos);
})
}
useEffect(()=>{
LoadPhotos();
},[]);
return(
<div className="container-fluid mt-3">
<h2>Mars Rover Photos </h2>
<table className="table table-hover">
<thead>
<tr>
<th>Photo Id</th>
<th>Preview</th>
<th>Camera</th>
<th>Rover</th>
</tr>
</thead>
<tbody>
{
mars.map(item=>
<tr key={item.id}>
<td>{item.id}</td>
<td>
<img src={item.img_src} width="100" height="100" />
</td>
<td>{item.camera.full_name}</td>
<td>{item.rover.name}</td>
</tr>
)
}
</tbody>
</table>
</div>
)
}
function LoadPhotos(){
fetch("https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?
sol=1000&api_key=DEMO_KEY")
.then(function(response){
return response.json();
})
.then(function(data){
setMars(data.photos);
})
}
useEffect(()=>{
LoadPhotos();
},[]);
return(
<div className="container-fluid mt-3">
<h2>Mars Rover Photos </h2>
<div className="d-flex flex-wrap">
{
mars.map(item=>
<div className="card m-2 p-2" id="card">
<img src={item.img_src} className="card-img-top" height="200"/>
<div className="card-body">
<dl>
<dt>Camera</dt>
<dd>{item.camera.full_name}</dd>
<dt>Rover</dt>
<dd>{item.rover.name}</dd>
</dl>
</div>
</div>
)
}
</div>
</div>
)
}
- Features
* Reutrns data in JSON
* It can handle any type of data
* No conversions required
* Better in error handling
* Async technique but explicitly
* Handles CORS
* Handle Security issues XSS
Syntax:
$.ajax({
method: "get/post/put/delete",
url: " ",
data: " ",
success: function() { },
error:function() { }
})
- Success function of jQuery returns a response object that contains various response details like
status 404, 200
statusText Not found, OK
data data in file or url
header etc.. request details [method name, host ..]
Ex:
1. Install jQuery
> npm install jquery --save
$.ajax({})
nasa.component.js
function LoadPhotos(){
$.ajax({
method: "get",
url: "https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?
sol=1000&api_key=DEMO_KEY",
success: (response)=>{
setMars(response.photos);
}
})
}
useEffect(()=>{
LoadPhotos();
},[]);
return(
<div className="container-fluid mt-3">
<h2>Mars Rover Photos </h2>
<div className="d-flex flex-wrap">
{
mars.map(item=>
<div key={item.id} className="card m-2 p-2" id="card">
<img src={item.img_src} className="card-img-top" height="200"/>
<div className="card-body">
<dl>
<dt>Camera</dt>
<dd>{item.camera.full_name}</dd>
<dt>Rover</dt>
<dd>{item.rover.name}</dd>
</dl>
</div>
</div>
)
}
</div>
</div>
)
}
3rd Party
- Axios
- Light weight
- Supports both sync and async techniques
- Can handle multiple requests simultaneously at the same time.
axios({
method:"",
url:" ",
data:" "
})
axios({
[
{ method:"", url:"" }, 0
{ method:"", url:"" } 1
]
})
Ex:
1. Install axios
2. Import axios
nasa.component.js
function LoadPhotos(){
axios.get("https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?
sol=1000&api_key=DEMO_KEY")
.then(response=> {
setMars(response.data.photos);
})
.catch(ex=>{
console.log(ex);
})
}
useEffect(()=>{
LoadPhotos();
},[]);
return(
<div className="container-fluid mt-3">
<h2>Mars Rover Photos </h2>
<div className="d-flex flex-wrap">
{
mars.map(item=>
<div key={item.id} className="card m-2 p-2" id="card">
<img src={item.img_src} className="card-img-top" height="200"/>
<div className="card-body">
<dl>
<dt>Camera</dt>
<dd>{item.camera.full_name}</dd>
<dt>Rover</dt>
<dd>{item.rover.name}</dd>
</dl>
</div>
</div>
)
}
</div>
</div>
)
}
http://fakestoreapi.com
shopping.component.js
function LoadProducts(url){
axios.get(url).then(response=> {
setProducts(response.data);
});
}
useEffect(()=>{
LoadCategories();
LoadProducts("http://fakestoreapi.com/products");
},[]);
function handleCategoryChanged(e){
if(e.target.value=="all") {
LoadProducts("http://fakestoreapi.com/products");
} else {
LoadProducts(`http://fakestoreapi.com/products/category/${e.target.value}`);
}
setCategory(e.target.value);
}
return(
<div className="container-fluid">
<header className="bg-dark text-white text-center p-2">
<h2><span className="bi bi-cart"></span> Shopper.</h2>
</header>
<section className="mt-3 row">
<nav className="col-2">
<div>
<label className="form-label">Select Category</label>
<div>
<select onChange={handleCategoryChanged} className="form-select">
{
categories.map(category=>
<option key={category} value={category}>
{category.toUpperCase()}
</option>
)
}
</select>
</div>
</div>
<div className="mt-3">
<label className="form-label">Choose Category</label>
<div>
<ul className="list-unstyled">
{
categories.map(cat=>
<li key={cat}>
<input type="radio" onChange={handleCategoryChanged} name="category"
value={category} /> {cat.toUpperCase()}
</li>
)
}
</ul>
</div>
</div>
</nav>
<main className="col-8 d-flex flex-wrap">
{
products.map(product=>
<div key={product.id} className="card m-2 p-2">
<img src={product.image} className="card-img-top" height="150" />
<div className="card-header">
<p>
{product.title}
</p>
</div>
<div className="card-body">
<dl>
<dt>Price</dt>
<dd>{product.price}</dd>
<dt>Rating</dt>
<dd>
<span className="bi bi-star-fill text-success"></span> {product.rating.rate}
[{product.rating.count}]
</dd>
</dl>
</div>
<div className="card-footer">
<button className="btn btn-danger">
<span className="bi bi-cart4"></span> Add to Cart
</button>
</div>
</div>
)
}
</main>
</section>
</div>
)
}
- Style Binding is the process of configuring inline styles for any element dynamically.
- JSX will not support CSS style attributes directly in any element.
- Styles can bind with HTML elements as JSON object.
Syntax:
<h1 style={ {propertyName:'value', propertyName:'value'} }>
Ex:
<h1 style={{color:'red', textAlign:'center'}}>
Ex:
styledemo.component.js
function handleUserName(e){
if(e.target.value.charCodeAt(0)>=65 && e.target.value.charCodeAt(0)<=90) {
setStyleObject({
border: '2px solid green',
boxShadow: '2px 2px 3px green'
});
setUserError('');
} else {
setStyleObject({
border: '2px solid red',
boxShadow: '2px 2px 3px red'
});
setUserError('Name must start with uppercase letter');
}
}
return(
<div className="container-fluid">
<h2>Register User</h2>
<dl>
<dt>User Name</dt>
<dd><input type="text" style={styleObject} onBlur={handleUserName}/></dd>
<dd className="text-danger">{userError}</dd>
</dl>
</div>
)
}
Ex:
styledemo.component.js
function backgroundChange(e){
setStyleObject({
backgroundColor : e.target.value,
textAlign: styleObject.textAlign
});
}
function alignChange(e){
setStyleObject({
textAlign: e.target.value,
backgroundColor: styleObject.backgroundColor
});
}
return(
<div className="container-fluid">
<h2>Choose Styles</h2>
<dl>
<dt>Background Color</dt>
<dd>
<select onChange={backgroundChange}>
<option value="yellow">Yellow</option>
<option value="green">Green</option>
<option value="red">Red</option>
</select>
</dd>
<dt>Text Align</dt>
<dd>
<select onChange={alignChange}>
<option value="left">Left</option>
<option value="center">Center</option>
<option value="right">Right</option>
</select>
</dd>
</dl>
<h1 style={styleObject}>Sample Text</h1>
</div>
)
}
Class Binding
- It allows to bind any CSS class to HTML element.
<div className="cssClassName">
Ex:
styledemo.component.css
.dark-theme {
background-color: black;
color:white;
}
styledemo.component.js
import { useState } from "react";
import "./styledemo.component.css";
function handleThemeChange(e){
if(e.target.checked) {
setTheme('dark-theme');
} else {
setTheme('');
}
}
return(
<div className="container-fluid d-flex justify-content-center align-items-center"
style={{height:'400px'}}>
<form className={theme}>
<div className="form-switch">
<input type="checkbox" onChange={handleThemeChange} className="form-check-
input"/> Dark Mode
</div>
<h3><span className="bi bi-person-fill"></span>User Login</h3>
<dl>
<dt>User Name</dt>
<dd><input type="text" className="form-control"/></dd>
<dt>Password</dt>
<dd><input type="password" className="form-control"/></dd>
</dl>
<button className="btn btn-dark w-100">Login</button>
</form>
</div>
)
}
Data Binding
Style Binding
Class Binding
Event Binding
Event Binding
Syntax:
function InsertClick() => Subscriber
{
}
SyntheticEvent BrowserEvent
onClick => onclick
- Synthetic Events are categories into various group based on their role and responsibility
1. Mouse Events
onMouseOver
onMouseOut
onMouseDown
onMouseUp
onMouseMove
2. Keyboard Events
onKeyUp
onKeyDown
onKeyPress
3. Button Events
onClick
onDblClick
onContextMenu
4. Form Events
onSubmit
onReset
5. Clipboard Events
onCut
onCopy
onPaste
7. Touch Events
onTouchStart
onTouchEnd
onTouchMove
8. Timer Events
setTimeout()
clearTimeout()
setInterval()
clearInterval()
Syntax:
function handleInsertClick()
{
}
function handleInsertClick(SyntheticEvent)
{
SyntheticEvent.EventArgs
SyntheticEvent.target.ObjectProperties
}
Ex:
Event-Demo.Component.js
function InsertClick(SyntheticEvent)
{
document.write(`
Button Id : ${SyntheticEvent.target.id} <br>
Class Name: ${SyntheticEvent.target.className} <br>
X Position: ${SyntheticEvent.clientX} <br>
Ctrl Key : ${SyntheticEvent.ctrlKey}
`)
}
return(
<div className="container-fluid">
<h2>Events</h2>
Ex:
Event-Demo.Component.js
function AddClick(e){
var result = products.find(product=> product.Id==e.target.id);
document.write(result.Name + "<br>" + result.Id);
}
return(
<div className="container-fluid">
<h2>Products</h2>
<div>
{
products.map(product=>
<div>
<p>{product.Name}</p>
<button id={product.Id} onClick={AddClick}> <span className="bi bi-cart4"></span> Add
to Cart</button>
</div>
)
}
</div>
</div>
)
Mouse Events
React Events
- What is Event?
- What is Event Handler?
- Event Args
- SyntheticEvents
MouseEvents
KeyboardEvents
ButtonEvents
TouchEvents
ElementState Events etc..
MouseEvents
onMouseOver
onMouseOut
onMouseDown
onMouseUp
onMouseMove
Event Args
clientX
clientY
Ex:
event-demo.component.js
import { useState } from "react"
function handleOver(){
setSlide('slide2.PNG');
}
function handleOut(){
setSlide('slide1.PNG');
}
return(
<div className="container-fluid">
<img src={slide} onMouseOver={handleOver} onMouseOut={handleOut} className="w-100"/>
<p>Move mouse over image</p>
</div>
)
Ex: Marquee
event-demo.component.js
function StartMarquee(e){
e.target.start();
}
function StopMarquee(e){
e.target.stop();
}
return(
<div className="container-fluid">
<h2>Mouse Events</h2>
<marquee onMouseOver={StopMarquee} onMouseOut={StartMarquee} scrollamount="10">
<img src="asp.jpg" className="me-2" width="100" height="100"/>
<img src="dm.jpg" className="me-2" width="100" height="100"/>
<img src="ds.jpg" className="me-2" width="100" height="100"/>
</marquee>
</div>
)
function GetPosition(e){
setStyleObject({
position: 'fixed',
top: e.clientY + 'px',
left: e.clientX + 'px'
})
}
return(
<div className="container-fluid" onMouseMove={GetPosition}>
<div style={{height:'1000px'}}>
<p>Move mouse pointer to test</p>
</div>
<img src="flag.gif" style={styleObject} width="50" height="50"/>
</div>
)
function ChangeColor(e){
switch(e.target.id) {
case "red":
setShirt('redShirt.jpg');
break;
case "green":
setShirt('greenShirt.jpg');
break;
case "blue":
setShirt('blueShirt.jpg');
break;
}
}
return(
<div className="container-fluid">
<h2>T-Shirt</h2>
<img src={shirt} width="200" height="200"/>
<p className="mt-3">
<div>
<span id="red" onMouseOver={ChangeColor} style={{backgroundColor:'red', color:'white', cursor:
'grab'}} className="me-2 p-2">Red</span>
<span id="green" onMouseOver={ChangeColor} style={{backgroundColor:'green', color:'white',
cursor: 'grab'}} className="me-2 p-2">Green</span>
<span id="blue" onMouseOver={ChangeColor} style={{backgroundColor:'blue', color:'white',
cursor: 'grab'}} className="me-2 p-2">Blue</span>
</div>
</p>
</div>
)
KeyBoard Events
onKeyUp
onKeyDown
onKeyPress
Args
keyCode
charCode
which
shiftKey
ctrlKey
altKey
Ex: KeyEvents
event-demo.component.js
function VerifyUserId(e){
for(var user of users)
{
if(user.UserId==e.target.value) {
setMsg('User Name Taken - Try Another');
setErrorClass('text-danger');
break;
} else {
setMsg('User Name Available');
setErrorClass('text-success');
}
}
}
return(
<div className="container-fluid">
<h2>Keyboard Events</h2>
<dl>
<dt>User Id</dt>
<dd><input type="text" onKeyUp={VerifyUserId} /></dd>
<dd className={errorClass}>{msg}</dd>
</dl>
</div>
)
function VerifyUserId(e){
for(var user of users)
{
if(user.UserId==e.target.value) {
setMsg('User Name Taken - Try Another');
setErrorClass('text-danger');
break;
} else {
setMsg('User Name Available');
setErrorClass('text-success');
}
}
}
function VerifyPassword(e){
if((e.which >= 65 && e.which <= 90) || (e.keyCode >= 65 && e.keyCode<= 90)) {
setToggle({display:'block'});
} else {
setToggle({display:'none'});
}
}
return(
<div className="container-fluid">
<h2>Keyboard Events</h2>
<dl>
<dt>User Id</dt>
<dd><input type="text" onKeyUp={VerifyUserId} /></dd>
<dd className={errorClass}>{msg}</dd>
<dt>Password</dt>
<dd><input type="password" onKeyPress={VerifyPassword} /></dd>
<dd style={toggle} className="text-warning">
<span className="bi bi-exclamation-triangle"></span> Warning : Caps ON
</dd>
</dl>
</div>
)
Button Events
onClick
onDblClick
onContextMenu
onBlur
onFocus
onChange
onSelect
onSelectStart
Ex:
import { useState } from "react"
function handleUserName(e){
setUserName(e.target.value);
}
function SubmitClick(){
if(userName=="") {
setUserError("User Name Required");
} else {
document.write("Hello ! " + userName + " Your City is " + cityName);
}
if(cityName=="notcity") {
setCityError("Please Select Your City");
}
}
function handleUserBlur(){
if(userName=="") {
setUserError("User Name Required");
} else {
setUserError("");
}
}
function handleUserKeyUp(){
if(userName=="") {
setUserError("User Name Required");
} else {
setUserError("");
}
}
function CityChanged(e){
if(e.target.value=="notcity") {
setCityError("Please Select Your City");
} else {
setCityName(e.target.value);
setCityError("");
}
}
function UserFocus(){
setUserError("Name is Mandatory");
}
return(
<div className="container-fluid">
<h2>Register User</h2>
<dl>
<dt>User Name</dt>
<dd><input type="text" onFocus={UserFocus} onKeyUp={handleUserKeyUp}
onBlur={handleUserBlur} onChange={handleUserName}/></dd>
<dd className="text-danger">{userError}</dd>
<dt>Your City</dt>
<dd>
<select onChange={CityChanged}>
<option value="notcity">Select City</option>
<option value="Delhi">Delhi</option>
<option value="Hyderabad">Hyd</option>
<option value="Chennai">Chennai</option>
</select>
</dd>
<dd className="text-danger">{cityError}</dd>
</dl>
<button onClick={SubmitClick}>Submit</button>
</div>
)
Clipboard Events
- onCut
- onCopy
- onPaste
Ex:
import { useState } from "react"
function handleUserName(e){
setUserName(e.target.value);
}
function SubmitClick(){
if(userName=="") {
setUserError("User Name Required");
} else {
document.write("Hello ! " + userName + " Your City is " + cityName);
}
if(cityName=="notcity") {
setCityError("Please Select Your City");
}
}
function handleUserBlur(){
if(userName=="") {
setUserError("User Name Required");
} else {
setUserError("");
}
}
function handleUserKeyUp(){
if(userName=="") {
setUserError("User Name Required");
} else {
setUserError("");
}
}
function CityChanged(e){
if(e.target.value=="notcity") {
setCityError("Please Select Your City");
} else {
setCityName(e.target.value);
setCityError("");
}
}
function UserFocus(){
setUserError("Name is Mandatory");
}
function handleCut(){
setMsg("Removed and Placed on Clipboard");
}
function handleCopy(){
setMsg("Copied to Clipboard");
}
function handlePaste(){
setMsg("Inserted from Clipboard");
}
return(
<div className="container-fluid">
<h2>Register User</h2>
<dl>
<dt>User Name</dt>
<dd><input type="text" onFocus={UserFocus} onKeyUp={handleUserKeyUp}
onBlur={handleUserBlur} onChange={handleUserName}/></dd>
<dd className="text-danger">{userError}</dd>
<dt>Your City</dt>
<dd>
<select onChange={CityChanged}>
<option value="notcity">Select City</option>
<option value="Delhi">Delhi</option>
<option value="Hyderabad">Hyd</option>
<option value="Chennai">Chennai</option>
</select>
</dd>
<dd className="text-danger">{cityError}</dd>
<dt>Mobile</dt>
<dd><input type="text" onCut={handleCut} onCopy={handleCopy} onPaste={handlePaste}
/></dd>
<dd>{msg}</dd>
</dl>
<button onClick={SubmitClick}>Submit</button>
</div>
)
Touch Events
-onTouchStart
-onTouchEnd
-onTouchMove
Ex:
import { useState } from "react"
function GetPosition(e){
setStyleObject({
position: 'fixed',
left: e.touches[0].clientX + 'px',
top: e.touches[0].clientY + 'px'
});
}
return(
<div className="container-fluid">
<p>Drag and Drop with your touch</p>
<img style={styleObject} onTouchMove={GetPosition} src="shirt.jpg" width="100" height="100"/>
</div>
)
Ex:
import { useState } from "react"
function SelectedCourse(e){
switch(e.target.id){
case "asp":
setMsg("ASP.NET is used for building Server Side Web Apps");
break;
case "aws":
setMsg("AWS is cloud service.");
break;
case "dm":
setMsg("Someting about Digital Marketing..");
break;
}
}
return(
<div className="container-fluid">
<p>Touch the Course banner to view details</p>
<div className="mt-3">
<img id="asp" onTouchStart={SelectedCourse} src="asp.jpg" width="100" height="100"/>
<img id="aws" onTouchStart={SelectedCourse} src="aws.jpg" width="100" height="100"/>
<img id="dm" onTouchStart={SelectedCourse} src="dm.jpg" width="100" height="100"/>
</div>
<p>{msg}</p>
</div>
)
Ex:
import { useState } from "react"
function ZoomImage(){
setStyleObject({
width: '400px',
height: '400px'
});
}
function ZoomOut(){
setStyleObject({
width: '100px',
height: '100px'
});
}
return(
<div className="container-fluid">
<div onTouchEnd={ZoomOut} className="d-flex justify-content-center align-items-center"
style={{height:'500px'}}>
<img style={styleObject} onTouchStart={ZoomImage} src="asp.jpg" width="100" height="100"/>
</div>
</div>
)
Form Events
- onSubmit
- onReset
Ex:
import { useState } from "react"
return(
<div className="container-fluid">
<form onSubmit={SubmitClick}>
<dl>
<dt>User Name</dt>
<dd><input type="text" name="Username"/></dd>
</dl>
<button>Submit</button>
</form>
</div>
)
Note: You can prevent default functionality for any element by using the event args "e.preventDefault()".
Timer Events
setTimeOut()
clearTimeOut()
setInterval()
clearInterval()
Ex:
import { useState } from "react"
function Message1(){
setMsg('Hello !');
}
function Message2(){
setMsg('How are you?');
}
function Message3(){
setMsg('Welcome to React');
}
function HandleClick(){
m1 = setTimeout(Message1, 2000);
m2 = setTimeout(Message2, 4000);
m3 = setTimeout(Message3, 8000);
}
function CancelClick(){
clearTimeout(m2);
}
return(
<div className="container-fluid">
<button onClick={HandleClick}>Show Message</button>
<button onClick={CancelClick}>Cancel Message-2</button>
<h2 className="text-center">{msg}</h2>
</div>
)
}
setInterval() It loads the task into memory and releases into process without
deleting from memory.
The task can execute at regular time intervals.
setTimeout()
clearTime()
setInterval()
clearInterval()
Ex:
import { useEffect, useState } from "react"
function LoadTime(){
var now = new Date();
setTime(now.toLocaleTimeString());
}
var timer;
useEffect(()=>{
timer = setInterval(LoadTime,1000);
},[]);
function handleStopClick(){
alert("Stop Clicked");
clearInterval(timer);
}
return(
<div className="container-fluid">
<div className="text-center">
<h2 className="mt-4">{time}</h2>
<button onClick={handleStopClick} className="me-2">
<span className="bi bi-stop-fill"></span>
</button>
<button>
<span className="bi bi-play-fill"></span>
</button>
</div>
</div>
)
}
function AmountChange(e){
setAmount(e.target.value);
}
function YearChange(e) {
setYears(e.target.value);
}
function RateChange(e){
setRate(e.target.value);
}
function CalculateClick(){
var principal = amount;
var r = rate/(12*100);
var n = years * 12;
var emi = (principal * r * Math.pow(r+1,n))/(Math.pow(1+r,n)-1);
setEmi(emi);
}
return(
<div className="container-fluid">
<h2>Pesonal Loan EMI Calculator</h2>
<div className="row mt-4 border border-dark border-2 p-4 m-3">
<div className="col">
Amount you need ₹ <input type="text" value={amount} />
</div>
<div className="col">
for <input type="text" value={years} size="4"/> years
</div>
<div className="col">
Interest rate <input type="text" value={rate} size="4" /> %
</div>
</div>
<div className="row mt-4 border border-dark border-2 p-4 m-3">
<div className="col">
₹ 50,000 <input type="range" onChange={AmountChange} min="50000"
max="1000000"/> ₹ 10,00,000
</div>
<div className="col">
1 <input type="range" onChange={YearChange} min="1" max="5" /> 5
</div>
<div className="col">
10.25% <input type="range" onChange={RateChange} min="10.25" max="18.25" step="0.1" />
18.25%
</div>
</div>
<div className="mt-3" >
<div className="row">
<div className="col text-center">
<button onClick={CalculateClick} className="btn btn-primary">Calculate</button>
</div>
</div>
</div>
<div className="mt-3">
<h3 className="text-center">Your montly installment is ₹ {Math.round(emi)} for Amount
₹{amount} with Rate {rate}%</h3>
</div>
</div>
)
}
Task: BMI Calculator
function MaleChange(e){
if(e.target.checked) {
setGender(e.target.value);
}
}
function FemaleChange(e){
if(e.target.checked) {
setGender(e.target.value);
}
}
function DetailsClick(){
setSelectedGender(gender);
}
return(
<div className="container-fluid">
<h2>Radio</h2>
<input type="radio" onChange={MaleChange} name="gender" value="Male" /> Male
<input type="radio" onChange={FemaleChange} name="gender" value="Female"/> Female
<br/>
<button onClick={DetailsClick}>Get Details</button>
<p>You selected Gender : {selectedGender}</p>
</div>
)
}
Ex: Slider
return(
<div className="container-fluid">
<h2>Slider</h2>
<div className="progress">
<div className="progress-bar me-1 bg-dark" style={{width:'25%'}}>
Low Weight < 53 kg
</div>
<div className="progress-bar me-1 bg-info" style={{width:'25%'}}>
Normal Weight
</div>
<div className="progress-bar me-1 bg-dark" style={{width:'25%'}}>
OverWeight
</div>
<div className="progress-bar bg-dark" style={{width:'25%'}}>
Obese
</div>
</div>
<div>
<span style={{marginLeft:'35%'}} className="bi bi-triangle-fill"></span>
</div>
</div>
)
}
Component Properties
- Components a build-blocks for application.
- Component provides reusable and customized template.
- Every component is reusable but can't be customized.
- To allow customization of component, you have to use "Properties".
- Every component can have properties.
- Properties are used to modify the component.
Ex: Function
- A function can be parameter less.
- A parameter less function will do the same task everytime.
- A parameterized function can change according to state and situation.
Syntax:
export function Name(props)
{
return(
<div>{props.ref}</div>
);
}
<Name ref="value">
Ex:
1. Add a new component with props
login.component.js
import './login.component.css';
export function LoginComponent(props)
{
return(
<div id="form-container" className="container-fluid">
<form>
<h2> <span className="bi bi-person-fill"></span> {props.title}</h2>
<div className="mb-2">
<label className="form-label">{props.login_id}</label>
<div>
<input type={props.login_type} className="form-control" />
</div>
</div>
<div className="mb-2">
<label className="form-label">Password</label>
<div>
<input type="password" className="form-control" />
</div>
</div>
<div className="mb-2">
<button className="btn btn-primary w-100">Login</button>
</div>
</form>
</div>
)
}
login.component.css
form {
width: 300px;
border:2px solid gray;
padding: 20px;
border-radius: 20px;
}
#form-container {
display: flex;
justify-content: center;
align-items: center;
height: 500px;
}
Ex:
Grid.component.js
properties.component.js
Conditional Rendering
Summary
- React Components
- Function Components
- Data Binding
- Event Binding
- Class and Style Binding
- Properties
Conditional Rendering
- A component template can change according to state and situation.
Ex:
function Name()
{
if(condition) {
return value1;
}
else {
return value2;
}
}
Ex:
1. template-demo.component.js
2. properties.component.js
Syntax:
export class Name
{
}
- Every component class gets the behaviour of component by extending "React.Component" base class.
Syntax:
export class Name extends React.Component
{
}
Syntax:
export class Name extends React.Component
{
render(){
return(
<React.Fragment> </React.Fragment>
)
}
}
Ex: register.component.js
- Every class component in react is defined with built in state. Hence class components are also called as
"Statefull components".
Syntax:
constructor()
{
super();
this.state = {
key : value - any type
}
}
<p> { this.state.key } </p>
Ex:
register.component.js
- If you want to store any data into state then you have to defined by using the method "setState()".
Class and Style Binding
- It is same as function component.
Syntax:
handleClick() {
}
<button onClick={this.handleClick}> </button>
Ex:
import React from "react";
handleCategoryChange(e){
alert(e.target.value);
}
render(){
return(
<div className="container-fluid">
<h2>{this.state.title}</h2>
<dl>
<dt className={this.state.effect}>Name</dt>
<dd>{this.state.product.Name}</dd>
<dt>Price</dt>
<dd>{this.state.product.Price}</dd>
<dt>Stock</dt>
<dd>
{(this.state.product.Stock==true)?"Available":"Out of Stock"}
</dd>
</dl>
<h3>Select Category</h3>
<select onChange={this.handleCategoryChange}>
{
this.state.categories.map(category=>
<option key={category}>{category}</option>
)
}
</select>
</div>
)
}
}
methodName() {
- Event handler in class component must bind to class in order to use state.
- There are 2 ways
constructor()
{
this.handleChange = this.handleChange.bind(this);
}
(or)
Ex:
import React from "react";
handleNameChange(e){
this.setState({
Name: e.target.value,
Price: this.state.Price,
City: this.state.City
});
}
handlePriceChange(e){
this.setState({
Name: this.state.Name,
Price: e.target.value,
City: this.state.City
})
}
handleCityChange(e) {
this.setState({
Name: this.state.Name,
Price: this.state.Price,
City: e.target.value
})
}
handleRegisterClick(){
alert(JSON.stringify(this.state));
}
render(){
return(
<div className="container-fluid">
<div className="row">
<div className="col-3">
<dl>
<dt>Name</dt>
<dd><input type="text" onChange={this.handleNameChange}
className="form-control"/></dd>
<dt>Price</dt>
<dd><input type="text" onChange={this.handlePriceChange.bind(this)} className="form-
control"/></dd>
<dt>City</dt>
<dd>
<select onChange={this.handleCityChange} className="form-select">
<option>Delhi</option>
<option>Hyd</option>
</select>
</dd>
</dl>
<button onClick={this.handleRegisterClick} className="btn btn-primary
w-100">Register</button>
</div>
<div className="col-9">
<dl>
<dt>Name</dt>
<dd>{this.state.Name}</dd>
<dt>Price</dt>
<dd>{this.state.Price}</dd>
<dt>City</dt>
<dd>{this.state.City}</dd>
</dl>
</div>
</div>
</div>
)
}
}
FAQ: If you can't use hooks in class component then how to handle useEffects?
Ans: By using component life cycle hooks.
- Update
* Style Binding
* Class Binding
* Data Binding
* Event Binding
* It is managed by a method
"ComponentWillUpdate()"
- Unmount
* All events are unsubscribed
* Memory allocated for component is destroyed
* Unmount phase will fireup when another component is requested.
Ex:
lifecycle.component.js
componentDidMount(){
alert("Login Component Requested");
}
componentWillUnmount(){
alert("Login Component will unmount");
}
render(){
return(
<div>
<h2>Login</h2>
</div>
)
}
}
class RegisterComponent extends React.Component {
componentDidMount(){
alert("Register Component Requested");
}
componentWillUnmount(){
alert("Register Component will unmount");
}
render(){
return(
<div>
<h2>Register</h2>
</div>
)
}
}
handleLoginClick(){
this.setState({
component: <LoginComponent />
})
}
handleReigsterClick(){
this.setState({
component: <RegisterComponent />
})
}
render(){
return(
<div className="container">
<h2>Life Cycle Hooks</h2>
<div>
<button onClick={this.handleLoginClick}>Login</button>
<button onClick={this.handleReigsterClick}>Register</button>
</div>
<hr />
<div>
{this.state.component}
</div>
</div>
)
}
}
Syntax:
useEffect(()=>{
},[])
Shopping with Class
- Forms and Validations
ReactBasicFlow.png
Image
formvaidation.component.js
function NameChange(e){
setUserDetails({
UserName: e.target.value,
Age: userDetails.Age,
Mobile: userDetails.Mobile,
City: userDetails.City
})
if(userDetails.UserName!==""){
setNameError("");
}
}
function AgeChange(e){
setUserDetails({
UserName: userDetails.UserName,
Age: e.target.value,
Mobile: userDetails.Mobile,
City: userDetails.City
})
if(userDetails.Age!==""){
setAgeError("");
}
if(isNaN(userDetails.Age)){
setAgeError("Age must be a number");
} else {
setAgeError("");
}
}
function MobileChange(e){
setUserDetails({
UserName: userDetails.UserName,
Age: userDetails.Age,
Mobile: e.target.value,
City: userDetails.City
})
}
function CityChange(e){
setUserDetails({
UserName: userDetails.UserName,
Age: userDetails.Age,
Mobile: userDetails.Mobile,
City: e.target.value
})
}
function FormSubmit(e){
e.preventDefault();
if(userDetails.UserName==""){
setNameError("User Name Required");
}
if(userDetails.Age==""){
setAgeError("Age Required");
} else {
if(isNaN(userDetails.Age)){
setAgeError("Age must be a number");
}
}
if(userDetails.Mobile.match(/\+91\d{10}/)){
setMobileError("");
} else {
setMobileError("Invalid Mobile : 91+ and 10 digits");
}
if(userDetails.City=="-1"){
setCityError("Please Select your city");
} else {
setCityError("");
}
}
return(
<div className="container-fluid mt-3">
<form onSubmit={FormSubmit}>
<h2>Register User</h2>
<dl>
<dt>Name</dt>
<dd><input onChange={NameChange} type="text"/></dd>
<dd className="text-danger">{nameError}</dd>
<dt>Age</dt>
<dd><input onChange={AgeChange} type="text"/></dd>
<dd className="text-danger">{ageError}</dd>
<dt>Mobile</dt>
<dd><input onChange={MobileChange} type="text"/></dd>
<dd className="text-danger">{mobileError}</dd>
<dt>City</dt>
<dd>
<select onChange={CityChange}>
<option value="-1">Select Your City</option>
<option value="Delhi">Delhi</option>
<option value="Hyd">Hyd</option>
</select>
</dd>
<dd className="text-danger">{cityError}</dd>
</dl>
<button className="btn btn-primary">Submit</button>
</form>
</div>
)
}
Formik Forms
> npm install formik --save
Ex:
1. Import formik base class
3. formik properties
formkidemo.component.js
return(
<div className="container-fluid mt-3">
<form onSubmit={formik.handleSubmit}>
<h2>Register User</h2>
<dl>
<dt>Name</dt>
<dd><input name="UserName" onChange={formik.handleChange} type="text"/></dd>
<dt>Age</dt>
<dd><input name="Age" onChange={formik.handleChange} type="text"/></dd>
<dt>Mobile</dt>
<dd><input name="Mobile" onChange={formik.handleChange} type="text"/></dd>
<dt>City</dt>
<dd>
<select name="City" onChange={formik.handleChange} >
<option value="-1">Select Your City</option>
<option value="Delhi">Delhi</option>
<option value="Hyd">Hyd</option>
</select>
</dd>
</dl>
<button className="btn btn-primary">Submit</button>
</form>
</div>
)
}
Formik Validation
- Formik can use validation function or validation schema for verifying values.
- Function is configured and designed by developer.
- Schema is configured by using another 3rd party called "Yup"
Validation Function:
function VerifyUserDetails(formData)
{
var errors = { };
logic for verifying form data
return errors;
}
})
Ex:
import { useFormik } from "formik";
function VerifyUserDetails(formData)
{
var errors = {};
if(formData.UserName=="")
{
errors.UserName = "User Name Required";
} else if(formData.UserName.length<4) {
errors.UserName = "Name too short min 4 chars";
} else if(formData.UserName.length>10) {
errors.UserName = "Name too long max 10 chars";
}
if(formData.Age=="") {
errors.Age = "Age Required";
} else if (isNaN(formData.Age)) {
errors.Age = "Age must be a number";
}
if(formData.Mobile.match(/\+91\d{10}/)) {
errors.Mobile = "";
} else {
errors.Mobile = "Invalid Mobile +91 and 10 digits";
}
if(formData.City=="-1") {
errors.City = "Please Select your city";
} else {
errors.City = "";
}
return errors;
}
return(
<div className="container-fluid mt-3">
<form onSubmit={formik.handleSubmit}>
<h2>Register User</h2>
<dl>
<dt>Name</dt>
<dd><input name="UserName" onChange={formik.handleChange} type="text"/></dd>
<dd className="text-danger">{formik.errors.UserName}</dd>
<dt>Age</dt>
<dd><input name="Age" onChange={formik.handleChange} type="text"/></dd>
<dd className="text-danger">{formik.errors.Age}</dd>
<dt>Mobile</dt>
<dd><input name="Mobile" onChange={formik.handleChange} type="text"/></dd>
<dd className="text-danger">{formik.errors.Mobile}</dd>
<dt>City</dt>
<dd>
<select name="City" onChange={formik.handleChange} >
<option value="-1">Select Your City</option>
<option value="Delhi">Delhi</option>
<option value="Hyd">Hyd</option>
</select>
</dd>
<dd className="text-danger">
{formik.errors.City}
</dd>
</dl>
<button className="btn btn-primary">Submit</button>
</form>
</div>
)
}
Syntax:
import required, mix, max, pattern from "yup"
import * as yup from "yup";
Ex:
import { useFormik } from "formik";
import * as yup from "yup";
Mobile : yup.string()
.matches(/\+91\d{10}/,"Invalid Mobile")
.required("Mobile Required")
})
})
return(
<div className="container-fluid mt-3">
<form onSubmit={formik.handleSubmit}>
<h2>Register User</h2>
<dl>
<dt>Name</dt>
<dd><input name="UserName" onChange={formik.handleChange} type="text"/></dd>
<dd className="text-danger">{formik.errors.UserName}</dd>
<dt>Age</dt>
<dd><input name="Age" onChange={formik.handleChange} type="text"/></dd>
<dd className="text-danger">{formik.errors.Age}</dd>
<dt>Mobile</dt>
<dd><input name="Mobile" onChange={formik.handleChange} type="text"/></dd>
<dd className="text-danger">{formik.errors.Mobile}</dd>
<dt>City</dt>
<dd>
<select name="City" onChange={formik.handleChange} >
<option value="-1">Select Your City</option>
<option value="Delhi">Delhi</option>
<option value="Hyd">Hyd</option>
</select>
</dd>
<dd className="text-danger">
{formik.errors.City}
</dd>
</dl>
<button className="btn btn-primary">Submit</button>
</form>
</div>
)
}
Formik Components
- Formik provides pre-defined components for form and validation.
<Formik>
<Form>
<Field>
<ErrorMessage>
- Component provides template design and functionality.
- It is clean in separation and error handling.
Syntax:
<Formik>
<Form>
<Field> </Field>
<ErrorMesage> </ErrorMessage>
</Form>
</Formik>
Syntax:
<Formik initialValues={} validationSchema={} onSubmit={ }>
{
<Form>
<Field name="FieldName" type="text" />
<Field as="select">
<option></option>
</Field>
<ErrorMessage name="FieldName" />
</Form>
}
</Formik>
Ex:
Syntax:
<Formik initialValues={} validationSchema={} onSubmit={}>
{
props => <Form> </Form>
}
</Formik>
EX:
- Routing is technique used in web applications to create or configure user friendly and SEO friendly
URL's.
Without Routing:
http://www.amazon.in/electronics.php?category=mobiles&brand=realme
Routing
http://www.amazon.in/electronics/mobiles/realme
2. React router is not understandable to browser you need a "BrowserRouter" in react, which translates
the navigation mechanism of virtual DOM into actual DOM
............routing configuraiton...........
</BrowserRouter>
<Routes>
....your routes....
</Routes>
Syntax:
<BrowserRouter>
<Routes>
<Route path element> </Route>
<Route path element> </Route>
</Routes>
</BrowserRouter>
http://localhost:3000/home
8. You can use <Link> component which can set path into URL
- Relative link will add the current path to the existing path.
- Absolute link sets a new path.
tutorial.component.js
Note: If client requests any component which is not in the route table, then you can render alternative
using wild card routes.
</BrowserRouter>
</div>
)
}
Ex: Links
</BrowserRouter>
</div>
)
}
Note: Every route path can render element, which can be markup or a component that have markup.
Ex:
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";
import { LoginComponent } from "../login/login.component";
import { RegisterComponent } from "../register/register.component";
</BrowserRouter>
</div>
)
}
Route Parameters
<Route path="category/:catname" element={ } />
<Link to="category/name"> </Link>
useParams Hook