React

[React] 17. Redux

qweasd5123 2025. 1. 2. 22:45

Redux 장점

props 없이 state를 공유할 수 있게 도와주는 라이브러리

js 파일 하나에 state를 보관하고, 모든 component에서 직접 꺼내 사용한다.

 

Redux 설치

npm install @reduxjs/toolkit@1.8.1 react-redux

 

Redux 세팅

//store.js
import { configureStore } from '@reduxjs/toolkit'

export default configureStore({
  reducer: { }
})
//index.js

import { Provider } from "react-redux";
import store from './store.js'

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <Provider store={store}>
      <BrowserRouter>
        <App />
      </BrowserRouter>
    </Provider>
  </React.StrictMode>
);

 

Redux에 state 보관하기

//store.js
import { configureStore, createSlice } from '@reduxjs/toolkit'

let user = createSlice({
  name : 'user',
  initialState : 'kim'
})

export default configureStore({
  reducer: {
    user : user.reducer
  }
})

 

Redux store에 있던 state 가져오기

//cart.js

import { useSelector } from "react-redux"

function Cart(){
  //let state = useSelector((state) => { return state } )
  let state = useSelector((state) =>  state.user);
  console.log(state)

  return (생략)
}

 

store의 state 변경

state 수정하는 함수를 store.js에 만들어두고, 이 함수를 component에서 원할 때 실행

 

state 변경 함수

//store.js
let user = createSlice({
  name : 'user',
  initialState : 'kim',
  reducers : {
    changeName(state){
      return 'john ' + state
    }
  }
  
})
export let { changeName } = user.actions

 

state 변경 함수 사용

//cart.js
import { useDispatch, useSelector } from "react-redux"
import { changeName } from "./../store.js"

function Cart() {
	let dispatch = useDispatch()
	<button onClick={()=>{
  		dispatch(changeName())
	}}>버튼</button> 
}

 

redux state가 array/object인 경우 변경

let user = createSlice({
  name : 'user',
  initialState : {name : 'kim', age : 20},
  reducers : {
    changeName(state){
      return {name : 'park', age : 20}
    }
  }
}) 

또는

let user = createSlice({
  name : 'user',
  initialState : {name : 'kim', age : 20},
  reducers : {
    changeName(state){
      state.name = 'park'
    }
  }
})

 

state 변경함수가 여러개 필요한 경우

let user = createSlice({
  name : 'user',
  initialState : {name : 'kim', age : 20},
  reducers : {
    increase(state, a){
      state.age += a.payload
    }
  }
})

'React' 카테고리의 다른 글

[React] 19. if문 작성패턴  (0) 2025.01.05
[React] 18. localStorage  (0) 2025.01.05
[React] 16. Context API  (0) 2025.01.02
[React] 15. ajax  (0) 2025.01.02
[React] 14. useEffect  (0) 2025.01.02