context & redux 비교
props drilling
context API(리액트 자체 API. Redux 불편해서 나온거)
Redux(클라이언트 사이드, propsDrilling 개선하기위해)
Zustand, Recoil(리덕스 작성의 불편함을 개선)
Reactquery(목적 차원에서 리덕스가 해결해주기 어려운 부분을 해결해주기위해) (서버사이드)
자식에 있는 스테이트를 끌어올리고, 자식도 써야하니까 다시그걸 props로 내려줌
context API
Provider
이걸 작성할때는 const {AContext}.Provider(대문자로)
HelloContext.Provider value = {}
export function ProfileProvider({ children }) {
.
.
.
return (
<ProfileContext.Provider value={value}>{children}</ProfileContext.Provider>
);
=> 직접렌더링 하는게 아니라..
아래 들어갈것들을 children 으로 받았으니 App이 리렌더링 되지 않게 하면돼.
App{
<AuthProvider>
<HomePage />
<AuthProvider />
}
따로 뺴서 쓰면 AutoProvider만 리렌더링돼.
내가 구독한 값이 변할때에만 redux를 사용
isLoggedIn 과 바뀌는 userId 의 구조일때,
store
reducer 안에는 작업타입들이 있음...(Action.type)
매번 지시서 쓰면 불편하니까 , action create(작업지시서 작성)를 공장에서 줘.
그래서 컴포넌트는 action에 type, payload 를 넣어서 dispatch(요청)해.
immer.produce( 남자1, (draft) => {
draft.hobbies
.find((hobby) => hobby.name === "코딩")
.stories.find(())
.images.push();
...
})
하면 마음대로 조작가능한 draft를 사용할 수 있어. (객체의 내용을 변경하는 방식을 사용하되) 기존 객체의 내용을 변경하지 않게 해줌.
새로운 객체 상태를 만들어주기 위해서 예전에는 다 펼쳐주고 했는데,
immer js 에 기존 상태를 넣으면 immerjs 가 draft(초안)을 준다. 펼칠 필요가 없어서 ...찍고 변경하고, 가져와서 쓰면됨
produce(변경하고싶은값, 레시피가될 callback 함수)
import { createSlice } from '@reduxjs/toolkit'
const initialState = { value: 0 }
const counterSlice = createSlice({
name: 'counter',
initialState,
reducers: {
increment(state) {
state.value++
},
decrement(state) {
state.value--
},
incrementByAmount(state, action) {
state.value += action.payload
},
},
})
export const { increment, decrement, incrementByAmount } = counterSlice.actions
export default counterSlice.reducer