React is a JavaScript library for building user interfaces, particularly single-page applications. It lets you create reusable UI components that manage their own state.
// Basic functional component
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
// Arrow function component with destructuring
const UserCard = ({ name, email }) => (
<div className="card">
<h2>{name}</h2>
<p>{email}</p>
</div>
);
// Class component with lifecycle methods
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
componentDidMount() {
console.log('Component mounted');
}
render() {
return (
<div>
<p>Count: {this.state.count}</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
Increment
</button>
</div>
);
}
}
// Parent component
function ParentComponent() {
return <ChildComponent name="John" age={30} />;
}
// Child component
function ChildComponent({ name, age }) {
return (
<div>
<p>Name: {name}</p>
<p>Age: {age}</p>
</div>
);
}
// Using useState hook
function StateExample() {
const [count, setCount] = useState(0);
const [user, setUser] = useState({ name: '', email: '' });
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
// useState
const [state, setState] = useState(initialState);
// useEffect
useEffect(() => {
// Side effects here
return () => {
// Cleanup function
};
}, [dependencies]);
// useContext
const value = useContext(MyContext);
// useRef
const inputRef = useRef();
// useMemo
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
// useCallback
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
// React Router setup
import { BrowserRouter, Route, Switch, Link } from 'react-router-dom';
function App() {
return (
<BrowserRouter>
<nav>
<Link to="/">Home</Link>
<Link to="/about">About</Link>
</nav>
<Switch>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
<Route path="/users/:id" component={UserProfile} />
</Switch>
</BrowserRouter>
);
}
// Create context
const ThemeContext = React.createContext();
// Provider
function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
{children}
</ThemeContext.Provider>
);
}
// Consumer
function ThemedButton() {
const { theme, setTheme } = useContext(ThemeContext);
return (
<button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
Toggle Theme
</button>
);
}
// Action
const increment = () => ({
type: 'INCREMENT'
});
// Reducer
const counterReducer = (state = 0, action) => {
switch (action.type) {
case 'INCREMENT':
return state + 1;
default:
return state;
}
};
// Store connection
function Counter({ count, increment }) {
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
</div>
);
}
export default connect(
state => ({ count: state }),
{ increment }
)(Counter);
// React.memo for component memoization
const MemoizedComponent = React.memo(function MyComponent(props) {
return (
<div>
{/* Component content */}
</div>
);
});
// useCallback for memoized callbacks
const memoizedHandler = useCallback(() => {
console.log('Handler called');
}, []);
// useMemo for expensive calculations
const expensiveValue = useMemo(() => {
return computeExpensiveValue(a, b);
}, [a, b]);