managing-local-vs-global-state

📁 djankies/claude-configs 📅 9 days ago
1
总安装量
1
周安装量
#45004
全站排名
安装命令
npx skills add https://github.com/djankies/claude-configs --skill managing-local-vs-global-state

Agent 安装分布

replit 1
junie 1
windsurf 1
trae 1
qoder 1
opencode 1

Skill 文档

Local vs Global State

Decision Flow

Use Local State (useState) when:

  • State only needed in one component
  • State only needed by component + direct children
  • State changes frequently (avoid Context re-renders)
  • State is UI-specific (form input, toggle, etc.)

Use Lifted State when:

  • Two sibling components need to share state
  • Parent coordinates between children
  • Still contained to component subtree

Use Context when:

  • Many components at different nesting levels need state
  • Prop drilling through 3+ levels
  • Global configuration (theme, locale, auth)
  • State changes infrequently

Examples

Local State:

function Counter() {
  const [count, setCount] = useState(0);

  return <button onClick={() => setCount(count + 1)}>Count: {count}</button>;
}

Lifted State:

function Parent() {
  const [filter, setFilter] = useState('all');

  return (
    <>
      <FilterButtons filter={filter} setFilter={setFilter} />
      <ItemList filter={filter} />
    </>
  );
}

Context (React 19 with use()):

import { createContext, use } from 'react';

const ThemeContext = createContext('light');

function App() {
  const [theme, setTheme] = useState('light');

  return (
    <ThemeContext value={{ theme, setTheme }}>
      <Layout />
    </ThemeContext>
  );
}

function DeepComponent() {
  const { theme, setTheme } = use(ThemeContext);

  return <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
    Toggle Theme
  </button>;
}

Anti-Patterns

❌ Context for frequently changing state:

const MousePositionContext = createContext();

function App() {
  const [position, setPosition] = useState({ x: 0, y: 0 });

  useEffect(() => {
    const handler = (e) => setPosition({ x: e.clientX, y: e.clientY });
    window.addEventListener('mousemove', handler);
    return () => window.removeEventListener('mousemove', handler);
  }, []);

  return (
    <MousePositionContext value={position}>
      <App />
    </MousePositionContext>
  );
}

This causes re-render of entire tree on every mouse move!

✅ Local state or ref instead:

function Component() {
  const [position, setPosition] = useState({ x: 0, y: 0 });

  useEffect(() => {
    const handler = (e) => setPosition({ x: e.clientX, y: e.clientY });
    window.addEventListener('mousemove', handler);
    return () => window.removeEventListener('mousemove', handler);
  }, []);

  return <div>Mouse: {position.x}, {position.y}</div>;
}

For comprehensive state management patterns, see: research/react-19-comprehensive.md lines 1293-1342.