HomeReact
Chapter 16

02 — Advanced React Patterns

Custom Hooks

function useLocalStorage(key, initialValue) {
  const [storedValue, setStoredValue] = useState(() => {
    try {
      const item = window.localStorage.getItem(key);
      return item ? JSON.parse(item) : initialValue;
    } catch (error) {
      return initialValue;
    }
  });
 
  const setValue = (value) => {
    setStoredValue(value);
    window.localStorage.setItem(key, JSON.stringify(value));
  };
 
  return [storedValue, setValue];
}

Context API

const ThemeContext = createContext('light');
 
function App() {
  const [theme, setTheme] = useState('light');
  
  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      <Toolbar />
    </ThemeContext.Provider>
  );
}

Performance Optimization

const MemoizedComponent = memo(({ data }) => {
  return <div>{data}</div>;
});
 
function ExpensiveComponent({ items }) {
  const computed = useMemo(() => expensiveCalculation(items), [items]);
  return <div>{computed}</div>;
}

Error Boundaries

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }
 
  static getDerivedStateFromError(error) {
    return { hasError: true };
  }
 
  componentDidCatch(error, info) {
    logErrorToMyService(error, info);
  }
 
  render() {
    if (this.state.hasError) {
      return <h1>Something went wrong.</h1>;
    }
    return this.props.children;
  }
}

Key Takeaways

  • Custom hooks for reusable logic
  • Context for global state (avoid Redux for simple cases)
  • Memoization for performance
  • Error boundaries for graceful failures