How to fix Cannot read properties of null (reading "props") in React

ReactINTERMEDIATEHIGHUpdated Dec 10, 2025· 151 views

This error occurs when React tries to access the "props" property on a null or undefined object, typically due to uninitialized state, missing null checks, or accessing components after they've unmounted.

Quick fix

Fixes TypeError

// Bad - no null check
function UserProfile({ user }) {
  return <div>{user.name}</div>; // Crashes if user is null
}

// Good - conditional rendering
function UserProfile({ user }) {
  if (!user) {
    return <div>Loading...</div>;
  }
  return <div>{user.name}</div>;
}

// Good - optional chaining
function UserProfile({ user }) {
  return <div>{user?.name ?? 'Unknown'}</div>;
}
  1. Add null checks and conditional rendering
  2. Initialize state with proper default values
  3. Fix class component context binding
  4. Prevent updates on unmounted components
react — error
// Bad - no null check
function UserProfile({ user }) {
return <div>{user.name}</div>; // Crashes if user is null
}
// Good - conditional rendering
function UserProfile({ user }) {
if (!user) {
return <div>Loading...</div>;
}
return <div>{user.name}</div>;
}
// Good - optional chaining
function UserProfile({ user }) {
return <div>{user?.name ?? 'Unknown'}</div>;
}
Cannot read properties of null (reading "props")

What this error means

This TypeError indicates that your React application is attempting to read the "props" property from a null or undefined object. This commonly happens when a component or React element hasn't been properly initialized, when accessing component internals incorrectly, or when trying to interact with a component after it has been unmounted from the DOM. The error typically surfaces in several scenarios: accessing props before they're available, destructuring from null objects, incorrect context binding in class components, or race conditions where asynchronous operations complete after a component has unmounted. Understanding the component lifecycle and proper null handling is crucial to preventing this error.

Typical symptoms

  • Application crashes with "Cannot read properties of null (reading 'props')" error
  • Component fails to render and displays error boundary or blank screen
  • Error occurs during component mounting or initial render
  • Error appears after data fetching completes or state updates
  • Console shows TypeError with null reference in stack trace
  • Error happens when navigating away from a page before async operations complete

Common causes

  1. Accessing props or state properties without null checks or conditional rendering
  2. Initial state or props set to null instead of proper default values
  3. Attempting to access component internals after component has unmounted
  4. Destructuring properties from null or undefined objects in function parameters
  5. Incorrect context binding in class component methods (this keyword is undefined)
  6. Race conditions where setState is called after component unmounts
  7. Passing null or undefined props to child components without proper validation
  8. Asynchronous data loading completes but data is null/undefined

How to fix "Cannot read properties of null (reading "props")"

1Add null checks and conditional rendering

Before accessing nested properties, ensure the parent object exists using optional chaining or conditional rendering.

jsx
// Bad - no null check
function UserProfile({ user }) {
  return <div>{user.name}</div>; // Crashes if user is null
}

// Good - conditional rendering
function UserProfile({ user }) {
  if (!user) {
    return <div>Loading...</div>;
  }
  return <div>{user.name}</div>;
}

// Good - optional chaining
function UserProfile({ user }) {
  return <div>{user?.name ?? 'Unknown'}</div>;
}
2Initialize state with proper default values

Always initialize state with appropriate default values instead of null, especially for objects and arrays.

jsx
// Bad - null initialization
const [data, setData] = useState(null);

// Good - proper default values
const [data, setData] = useState({});
const [items, setItems] = useState([]);
const [user, setUser] = useState({ name: '', email: '' });

// For data fetching, use a loading flag
const [user, setUser] = useState(null);
const [isLoading, setIsLoading] = useState(true);

useEffect(() => {
  fetchUser().then(data => {
    setUser(data);
    setIsLoading(false);
  });
}, []);

if (isLoading) return <div>Loading...</div>;
if (!user) return <div>User not found</div>;
return <div>{user.name}</div>;
3Fix class component context binding

For class components, ensure methods are properly bound to maintain correct "this" context.

jsx
// Bad - method loses context
class MyComponent extends React.Component {
  handleClick() {
    console.log(this.props); // this is undefined
  }

  render() {
    return <button onClick={this.handleClick}>Click</button>;
  }
}

// Good - arrow function property
class MyComponent extends React.Component {
  handleClick = () => {
    console.log(this.props); // this is correctly bound
  }

  render() {
    return <button onClick={this.handleClick}>Click</button>;
  }
}

// Good - bind in constructor
class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    console.log(this.props); // this is correctly bound
  }

  render() {
    return <button onClick={this.handleClick}>Click</button>;
  }
}
4Prevent updates on unmounted components

Clean up side effects and prevent state updates after component unmounts to avoid accessing null references.

jsx
function MyComponent() {
  const [data, setData] = useState(null);

  useEffect(() => {
    let isMounted = true;

    fetchData().then(result => {
      if (isMounted) {
        setData(result);
      }
    });

    // Cleanup function
    return () => {
      isMounted = false;
    };
  }, []);

  return data ? <div>{data.value}</div> : <div>Loading...</div>;
}

// For timers and intervals
function TimerComponent() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const timer = setInterval(() => {
      setCount(c => c + 1);
    }, 1000);

    // Clear timer on unmount
    return () => clearInterval(timer);
  }, []);

  return <div>{count}</div>;
}
5Validate props with PropTypes or TypeScript

Add prop validation to catch null/undefined props early in development.

jsx
// Using PropTypes
import PropTypes from 'prop-types';

function UserCard({ user }) {
  return <div>{user.name}</div>;
}

UserCard.propTypes = {
  user: PropTypes.shape({
    name: PropTypes.string.isRequired,
    email: PropTypes.string.isRequired
  }).isRequired
};

// Using TypeScript
interface User {
  name: string;
  email: string;
}

interface UserCardProps {
  user: User;
}

function UserCard({ user }: UserCardProps) {
  return <div>{user.name}</div>;
}

// With optional props
interface UserCardProps {
  user?: User | null;
}

function UserCard({ user }: UserCardProps) {
  if (!user) return <div>No user data</div>;
  return <div>{user.name}</div>;
}
6Add Error Boundaries for graceful error handling

Implement Error Boundaries to catch and display errors gracefully instead of crashing the entire app.

jsx
class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false, error: null };
  }

  static getDerivedStateFromError(error) {
    return { hasError: true, error };
  }

  componentDidCatch(error, errorInfo) {
    console.error('Error caught by boundary:', error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      return (
        <div>
          <h2>Something went wrong</h2>
          <p>{this.state.error?.message}</p>
        </div>
      );
    }

    return this.props.children;
  }
}

// Usage
function App() {
  return (
    <ErrorBoundary>
      <MyComponent />
    </ErrorBoundary>
  );
}

Advanced notes

Component Lifecycle Considerations: In class components, be especially careful with lifecycle methods like componentWillUnmount. If you have ongoing async operations (API calls, timers), store references to them and cancel/cleanup in componentWillUnmount to prevent accessing component internals after unmounting.

React Strict Mode: When using React.StrictMode in development, components are intentionally double-mounted to help identify side effects. This can expose null reference issues that might not appear in production. Use this to your advantage by fixing these issues during development.

Module Federation and Multiple React Instances: If using micro-frontends or Module Federation, ensure you're not loading multiple versions of React. This can cause "Cannot read properties of null (reading 'useState')" errors. Use singleton patterns in webpack configuration to share React instances.

HOC and Ref Forwarding: When using Higher-Order Components (HOCs) that wrap your component, ensure refs are properly forwarded using React.forwardRef. Without proper ref forwarding, attempting to access component methods or properties through refs will result in null references.

Testing Considerations: When writing tests with react-test-renderer or @testing-library/react, ensure you're waiting for async operations to complete before assertions. Use waitFor or findBy queries to avoid accessing null components during async state updates.

Frequently asked questions

What does "TypeError" mean?
This TypeError indicates that your React application is attempting to read the "props" property from a null or undefined object. This commonly happens when a component or React element hasn't been properly initialized, when accessing component internals incorrectly, or when trying to interact with a component after it has been unmounted from the DOM. The error typically surfaces in several scenarios: accessing props before they're available, destructuring from null objects, incorrect context binding in class components, or race conditions where asynchronous operations complete after a component has unmounted.
How do I fix "TypeError"?
This error occurs when React tries to access the "props" property on a null or undefined object, typically due to uninitialized state, missing null checks, or accessing components after they've unmounted.
What causes "TypeError"?
Accessing props or state properties without null checks or conditional rendering Initial state or props set to null instead of proper default values Attempting to access component internals after component has unmounted
Is the "TypeError" error serious?
Yes. This is a high-severity error that usually blocks work until it is fixed, but the steps above resolve it.

Official resources & further reading