Skip to main content

What is React?

React is a JavaScript library for building user interfaces, particularly single-page applications. It was developed by Facebook (now Meta) and is maintained by both Facebook and a community of individual developers and companies. React allows developers to create large web applications that can change data without reloading the page.
React is not a full-fledged framework like Angular or Vue. It’s focused specifically on the view layer of an application, making it more flexible but requiring additional libraries for full application development.

Why Use React?

Component-Based

React is built around the concept of reusable components, making it easier to manage complex UIs and promote code reuse.

Virtual DOM

React uses a virtual DOM to optimize rendering performance by minimizing direct manipulation of the actual DOM.

Declarative Syntax

React’s declarative approach makes your code more predictable and easier to debug.

Strong Ecosystem

React has a vast ecosystem of libraries, tools, and community support.

Getting Started with React

Setting Up a React Project

The easiest way to start a new React project is using Create React App, a tool that sets up a modern React application with a good default configuration:

React Project Structure

A typical Create React App project structure looks like this:

Core React Concepts

Components

Components are the building blocks of React applications. They are reusable pieces of code that return React elements describing what should appear on the screen.

Function Components

Class Components

Function components are now preferred over class components in modern React development, especially with the introduction of Hooks.

JSX

JSX (JavaScript XML) is a syntax extension for JavaScript that looks similar to HTML but allows you to write HTML-like code in your JavaScript files.
JSX is transformed into regular JavaScript function calls by tools like Babel:

Props

Props (short for properties) are inputs to React components. They are passed from parent to child components and are read-only.

State

State is a built-in object that contains data or information about the component. Unlike props, state can be changed.

State with Hooks (Function Components)

State with Class Components

Lifecycle and Effects

React components have a lifecycle - they are created (mounted), updated, and destroyed (unmounted). You can hook into these phases to run code at specific times.

Lifecycle with Hooks (Function Components)

Lifecycle with Class Components

React Hooks

Hooks are functions that let you “hook into” React state and lifecycle features from function components. They were introduced in React 16.8.

Basic Hooks

useState

useEffect

useContext

Additional Hooks

useReducer

useMemo and useCallback

Handling Events

React events are named using camelCase and passed as functions rather than strings.

Forms in React

React provides two approaches to handling forms: controlled and uncontrolled components.

Controlled Components

In controlled components, form data is handled by React state.

Uncontrolled Components

Uncontrolled components maintain their own state in the DOM.

Styling in React

React offers several approaches to styling components:

CSS Stylesheets

Inline Styles

CSS Modules

CSS-in-JS Libraries

React Router

React Router is the standard routing library for React applications, enabling navigation between different components.

State Management

For complex applications, you might need more advanced state management solutions beyond React’s built-in state.

Context API

For simpler applications or when prop drilling becomes an issue:

Redux

For larger applications with complex state management needs:

Testing React Applications

Testing is an essential part of developing robust React applications. Common testing libraries include Jest and React Testing Library.

Best Practices

  • Use function components with hooks instead of class components
  • Keep components small and focused on a single responsibility
  • Use prop types or TypeScript for type checking
  • Lift state up to the nearest common ancestor when multiple components need the same data
  • Use keys when rendering lists to help React identify which items have changed
  • Avoid using indexes as keys when the list can reorder
  • Memoize expensive calculations with useMemo and useCallback
  • Use React.lazy and Suspense for code-splitting
  • Follow the container/presentational pattern to separate logic from UI
  • Use error boundaries to catch and handle errors gracefully

Next Steps

Now that you understand the basics of React, you can: