Preventing Unnecessary Renders with useRef

Show the use of useRef to store current state without causing re-renders and compare it to useState to highlight how useRef can prevent unnecessary component updates.
import React, { useState, useRef } from 'react';

function App() {
  // Using useState, changes cause re-renders
  const [count, setCount] = useState(0);

  // Using useRef, changes do not cause re-renders
  const countRef = useRef(0);

  const incrementCount = () => {
    setCount(count + 1); // This will re-render the component

  const incrementCountRef = () => {
    countRef.current += 1; // This will not re-render the component

  return (
      <p>Count: {count}</p>
      <p>CountRef: {countRef.current}</p>
      <button onClick={incrementCount}>Increment Count</button>
      <button onClick={incrementCountRef}>Increment CountRef</button>

export default App;
In this example, we have a React component called App with two counters. One uses useState and the other uses useRef to store the current count. The `incrementCount` function updates the state using `setCount`, which triggers a re-render of the component to reflect the new value. In contrast, `incrementCountRef` function increases the value of `countRef.current` without re-rendering because changes to `ref.current` do not notify React of the change.