Wii Pointer #1 Tilt Normal
본문 바로가기
📁 𝐫𝐮𝐧𝐭𝐢𝐦𝐞𝐄𝐧𝐯𝐢𝐫𝐨𝐧𝐦𝐞𝐧𝐭/React.js

[React] React's State Management

by 개발자_후니 2024. 2. 15.
728x90
반응형
- React 상태 관리
  • useState Hook

함수형 컴포넌트에서 상태를 관리하는 가장 기본적인 방법.
컴포넌트 내에서 간단한 상태를 다룰 때 사용됩니다.

 

import React, { useState } from 'react';

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

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
  • useReducer Hook

복잡한 상태 로직을 다룰 때 유용.
컴포넌트 내에서 여러 상태를 관리하거나, 상태 갱신이 이전 상태에 의존적일 때 사용됩니다.

 

import React, { useReducer } from 'react';

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    default:
      throw new Error();
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, { count: 0 });

  return (
    <>
      Count: {state.count}
      <button onClick={() => dispatch({ type: 'decrement' })}>-</button>
      <button onClick={() => dispatch({ type: 'increment' })}>+</button>
    </>
  );
}
  • Context API

상태를 전역적으로 관리할 수 있도록 하는 React의 API.
여러 컴포넌트 간에 상태를 공유할 때 사용됩니다.

 

import React, { createContext, useContext, useState } from 'react';

const MyContext = createContext();

function MyProvider({ children }) {
  const [myState, setMyState] = useState(initialState);

  return (
    <MyContext.Provider value={{ myState, setMyState }}>
      {children}
    </MyContext.Provider>
  );
}

function useMyState() {
  const context = useContext(MyContext);
  if (!context) {
    throw new Error('useMyState must be used within a MyProvider');
  }
  return context;
}
  • Redux

상태 관리를 위한 라이브러리로, 컴포넌트의 상태를 중앙 집중적으로 관리.
큰 규모의 애플리케이션 또는 여러 컴포넌트 간에 상태를 효율적으로 관리할 때 사용됩니다.

 

// actions.js
export const increment = () => ({
  type: 'INCREMENT',
});

export const decrement = () => ({
  type: 'DECREMENT',
});

// reducers.js
const counter = (state = { count: 0 }, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    case 'DECREMENT':
      return { count: state.count - 1 };
    default:
      return state;
  }
};

export default counter;

 

// store.js
import { createStore } from 'redux';
import counter from './reducers';

const store = createStore(counter);

export default store;

 

// App.js
import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import Counter from './Counter';

function App() {
  return (
    <Provider store={store}>
      <Counter />
    </Provider>
  );
}

export default App;
728x90
반응형