05/17-[오전]

Posted by:

|

On:

|

create react-app 할 때 주의점 : 프로젝트 이름에 대문자 사용불가

npm install -g create-react-app : react 프로젝트 생성하는 create-react-app 명령어 설치. -g 옵션을 한 경우 시스템 공용 폴더에 설치된다.

npm i npx -g : npx로 프로젝트 생성 하고자 한다면 설치해줘야한다

npx : npm의 5.2.0 버전부터 추가된 도구. npm과 비교하는것이 아닌 npm에서 제공해주는 도구 중 하나

npm⊃npx 라고 생각하자

toolkit은 값에 직접 접근해서 수정해도 값이 업데이트가 된다

push와 concat의 차이[splice와 filter도 추가]

push : 배열의 끝에 하나 이상의 요소를 추가하고 그 배열을 반환해줌(기존 배열에 바로 들어감)

concat : 배열의 끝에 하나 이상의 요소를 추가하고 새 배열로 반환함(기존 배열에 바로 들어가지 않음)

splice : 배열의 기존 요소를 삭제,교체,추가 시켜줌 배열이름.splice(시작인덱스,제거할 요소 수(0이면 제거안함), 배열에 추가할 요소) 값은 기존 배열에 바로 적용된다

filter : 배열의 요소 중 조건을 만족하는 값을 새롭게 반환함(기존 배열에 바로 들어가지 않음)

toolkit의 경우 createSlice를 사용한다

사용할 slice.js 부분[slice폴더를 생성하고 안에 넣어줘도 된다. 관리가 편해짐]

import {createSlice} from "@reduxjs/toolkit"으로 createSlice를 사용한다고 알리고

export let 슬라이스이름=createSlice({

name:"이름-비어 있으면 에러창이 나옴",

initlalState:{초기값부분-중괄호는 필수}

reducers:{action함수 생성 부분
예)add:(state)=>{state.value+=1}
예2)delete:(state.action)=>{state.splice(action.payload,1)

여기서 중요한 부분은 action.payload인데 이 값은 고정되어 있다. state에 커서를 가져다 대면 initialState 부분이 보이고 action에 커서를 가져다 대면 payload라고 고정적으로 나온다. 그리고 action 생성 함수가 1개더라도 reducer가 아닌 reducers를 써야 한다.

})

export let {reducers에서 쓴 action함수들}=슬라이스이름.actions;action 생성함수를 쓰기 위해 내보내는 구간. 위의 reducers와 같은 이유로 함수가 1개여도 action이 아닌 actions다.

export default 슬라이스이름.reducer; reducer를 내보내는 구간

/src 에 store.js를 생성한다

import {configureStore} from "@reduxjs/toolkit"

import 슬라이스이름 from 해당슬라이스위치

export default configureStore({ reducer:{정해준이름:슬라이스이름,여러개면,로 구분}})

로 작성하면 provider에서 store에 넣어주면 된다. 슬라이스 만들기 전에 생성해서 reducer 부분을 비워도 에러는 생기지 않는다.

index.js에서

import {Provider} from 'react-redux'; 와 import store from './store'로 불러오고

<App/> 을 <Provider store={store}>로 감싼다

store.js를 먼저 만들고 index.js에서 provider와 store로 만든 뒤 slice들과 jsx를 생성해서 만들어주면 좋다. index.js의 경우 더이상 건드릴 부분이 없어지고, store.js는 slice가 추가되면 추가할 slice를 import 하고 reducer에 넣어주는 간단한 과정만 있다.

jsx에서 dispatch(action함수(변수값)) 부분 중 변수값을 여러개 들고 올 수 있다. 배열로 들고오기 때문에 reducer에서 사용하기 위해서는 action.payload.변수값 형태로 불러와야 한다.

useSelector로 각각의 slice의 값에 접근해서 비교도 가능하다. 예를 들어
A.map((memo)=>(---<p>{B.find((like)=>like.id === memo.id}</p>처럼 밖에서 memo로 지정한 A의 배열은 안의 B배열의 find 함수 안에서 그대로 사용된다.

각각의 slice에서 만든 action 함수의 경우 dispatch() 안에서 쓰다보면 밑에 나오는데 그 부분을 클릭하면 자동으로 import가 만들어진다. 만약 잊어버렸다면 지우고 다시 쓰거나 import로 추가해줘야 한다

import {useSelector,useDispatch} from 'react-redux'

import 후 바로 useSelector를 적어도 나타나지 않을 수 있으므로 import {} from 'react-redux' 를 먼저 쓰고 난 후 괄호 안에 적어주면 나타난다

let 정해줄이름=useSelector((state)=>(state.slice에서 작성한 이름))

let dispatch=useDispatch(); 무조건 dispatch일 필요는 없지만 헷갈리지 않게 이름을 써주면 편하다

{}-중괄호 와 ()-소괄호 사용 구분을 해야한다. 가끔 무의식적으로 막 쓰다가 어떤 경우는 실행 때나 이전에 문제 부분에 알려주는데 알려주지 않고 그대로 실행되는 경우도 나오기 때문에 원하는 값이 안나올 때 원인 찾기가 힘들다.