inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Slack 클론 코딩[실시간 채팅 with React]

리덕스에서 스토어 부분 질문

385

정지은

작성한 질문수 5

0

안녕하세요. 선생님

선생님 말씀대로 useSelector를 사용해 보려고,
로컬스토리지 관련 코드들은 삭제했습니다.

원하는 구현기능)
질문은 Modal 컴포넌트에서 리듀서에 의해 업데이트된 상태를,
todoItem 컴포넌트로 가져와서 사용이 가능한가요?
todoItem 컴포넌트로 가져와서 todoData에 집어넣고 싶습니다...
그래서 updateReducer에서 ADD_ITEM case를 읽을때 그때 그 상태를
todoItem 컴포넌트로 가져와서 사용이 하고 싶습니다.


질문)
1. 위에 기능을 useSelector만 알면 가능할까요?
2. 리덕스에 4단계 액션, 디스패치, 리듀서, 스토어 중 스토어 부분,
저장했다가 필요할때 꺼내쓰는 부분을 잘 모르겠어요.
어떤 추가적인 개념 공부가 필요할 까요?

const Modal = ({onClick}) =>{

  const [state, dispatch] = useReducer(updateReducer, initialState)

  const handleModalClick = (e) => {
    e.stopPropagation(); // 이벤트 버블링 막기
  };

  //사용자가 입력한 값을 추적하는 함수
  const handleInputChange = (e) =>{
   const {name, value} = e.target;
   dispatch({type: `UPDATE_${name.toUpperCase()}`, payload: value})
  };

  //클릭으로 적은 모든 내용을 한번에 전달
  const addItem = () =>{
  dispatch({type:'ADD_ITEM'});
  };

return(
    <ModalBackGround onClick={onClick}>
    <ModalView onClick={handleModalClick} >
    <div className = "titleContainer">
    <img className="dot" src = {dot} alt="icon"></img> 
    <input value ={state.title} name = "title" className="title" placeholder="메모 제목" onChange={handleInputChange}></input>
    <img onClick={addItem} className="edit" src={edit} alt="icon"></img>
    </div>
    <div className="date">
    <div className='일자'>일자</div>
    <input value ={state.startDate} name ="startDate" className ="start" placeholder="시작일" onChange={handleInputChange}></input>
    <div>~</div>
    <input value ={state.endDate} name= "endDate" className ="end" placeholder="종료일" onChange={handleInputChange}></input>
    </div>
    <div className='contentContainer'>
    <textarea value ={state.content} name ="content" className ="content" placeholder="메모" onChange={handleInputChange}>
    </textarea>
    </div>
    </ModalView>
    </ModalBackGround>
)
};

export default Modal;
export const updateReducer = (state=initialState, action)=>{
  
 switch(action.type){
  case 'UPDATE_TITLE': 
    return{...state, title: action.payload};
  case 'UPDATE_STARTDATE':
    return{...state, startDate: action.payload};
  case 'UPDATE_ENDDATE':
    return{...state, endDate:action.payload};
  case 'UPDATE_CONTENT':
    return {...state, content: action.payload};
  case 'ADD_ITEM':
    return  {...state, id: Number(state.id)+1}
    //여기서 todoItem을 바로 쓸 수 없다. state나 action관련된 변수만 넣어야 한다
   // 배열은 가능하지만, 객체는 전개연산자(...)를 쓸 수 없다
    default:
    return state;
 }
};
const TodoItem = () =>{


   const [state, dispatch] = useReducer(checkReducer, todoItem)
   const [todoData, setTodoData] = useState(todoItem);
   
   const handleCheck = (id) =>{
      dispatch(checkBox(id));
    };
   
return(
   <SeveralItemContainer>
   {
    todoData.map((item)=>{
      return (
      <TodoItemContainer key={item.id}>
      <TitleContainer>
      <img className ="dot" src={dot} alt="icon"></img>
      <div className="title">{item.title}</div>
      <img onClick={ () => {handleCheck(item.id)}} className="noncheck" src = {item.isDone ? check: noncheck} alt="icon"></img>
      </TitleContainer>
      <div className="contentcontainer">
      <div className="content">{item.content}</div>
      </div>
      </TodoItemContainer>
      )
    })
   }
    </SeveralItemContainer>
)
};

export default TodoItem;


   
   

react 웹팩 typescript socket.io babel 클론코딩

답변 1

0

제로초(조현영)

네 useSelector만 있으면 됩니다.

const data = useSelector(state => state.리듀서.값...)

이러면 가져와지는 겁니다.

기본 셋팅과 관련하여

0

92

1

초기 셋팅 back과 front만 남겨두고 다 지운 후 진행 방법

0

96

2

focus 시에만 화면 업데이트 되는 이유 + 해결방법

0

150

2

useEffect 개수 관리

0

110

2

라이브러리 서치 방법

0

104

2

함수 정의 패턴

0

77

1

npm run dev 에러

0

152

3

npx webpack 후 에러

0

178

2

'void' 형식 식의 truthiness를 테스트할 수 없습니다.ts(1345)

0

144

2

사용자 가입시 에러발생 (TypeError: Cannot read properties of null (reading 'addMembers')

1

178

2

초기세팅중 packge.json 에러떠요

0

156

2

CORS - Access-Control-Allow-Origin 누락 문제

0

431

3

로그인 페이지 무한 새로고침 현상

0

598

2

Module not found: Error: Can't resolve './App' 에러

0

959

1

배포 방법

0

298

2

npm run dev 시 빌드가 매우 느려졌습니다

0

990

2

alias 경로 설정 오류

0

452

2

fetcher 함수의 data 값이 두번 찍히는 이유

0

277

1

제네릭 질문

0

218

2

ts-node 대신 tsx 사용여부

0

373

1

배포 관련 질문

0

247

1

[nginx + https] 서비스를 실행하면 niginx가 아닌 서비스 화면을 보여주게 하고 싶습니다.

0

385

2

[배포하기] webpack에 aws 퍼블릭 IPv4 주소 와 포트 주소를 작성하고 나서 빌드후 실행하면 오류가 발생합니다.

0

336

1

users 호출 시 쿠키가 담기지 않는 이슈 질문드립니다.

0

247

2