One of React’s core concepts is reusability through composable components. Components allow splitting complex UI into separate, reusable pieces. However, for components to communicate, they need a way to pass data to each other. Enter props.

Props allow passing data from a parent component to a child component. They are like function parameters, but for React components.

Let’s look at a simple example:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// Parent component
const Parent = () => {
  return (
    <Child 
      color="blue"
      onClick={handleClick} 
    />
  );
}

// Child component
const Child = (props) => {
  return <div>{props.color}</div> 
}

The parent component Parent passes two props to the child component Child - a color string and an onClick event handler.

The child component receives these as a props object and can access them as props.color and props.onClick.

Defining Props in a Component

To specify the props a component expects, you can define them in the component function or class:

1
2
3
4
5
6
7
8
9
// Function component
const MyComponent = (props) => {
  // ...
}

// Class component 
class MyComponent extends React.Component {
  // ...
}

React will check that components are passed all the props they expect. This helps catch bugs early.

You can also set default values for props:

1
2
3
4
const MyComponent = (props) => {
  const color = props.color || 'blue'; 
  // ...
}

Passing Props When Rendering Components

When rendering a component, you pass props like function arguments:

1
2
3
4
5
6
// Parent component
<MyComponent
  title={title}
  content={content}
  author={author}
/>

Access these in the child component through props.

Props are read-only in the child component. The child can’t modify the props - this keeps the data flow unidirectional.

PropTypes for Validation

It’s a good idea to validate props being passed to a component. React provides a PropTypes module to specify prop types:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import PropTypes from 'prop-types';

const MyComponent = (props) => {
  // ...
}

MyComponent.propTypes = {
  title: PropTypes.string.isRequired,
  content: PropTypes.string.isRequired,
  author: PropTypes.shape({
    name: PropTypes.string.isRequired,
    avatar: PropTypes.string
  })
}

This validates props passed to MyComponent. If invalid props are passed, a warning will appear in the console.

When to Use Props vs State

While props allow passing data into a component, state is used to track changes within a component.

Use props for:

  • Data that doesn’t change
  • Initializing component state
  • Passing data from parent to child components

Use state for:

  • Data that changes over time
  • UI state based on user interaction
  • Re-rendering components when data changes

Getting the distinction right takes practice - misusing props and state is a common source of bugs in React.

Conclusion

Props allow different components to work together by passing data between them. Define props a component expects, then pass them when rendering:

1
2
3
4
5
6
7
// Parent
<Child title="Hello" /> 

// Child
const Child = (props) => {
  <h1>{props.title}</h1>
}

Props allow a unidirectional data flow between parents and children. Combined with state to manage changing data, they make building reusable components much easier in React.