카테고리 없음
useReducer 사용법 문제풀이.
하림회사
2023. 11. 29. 03:47
#1 지시사항
- App.js에서 initial 상수에 초기값을 완성해주세요.
- top: apple
- middle: banana
- bottom: coconut
- 다음 사항에 맞추어 **reducer**를 작성해주세요. 서로 바꿀 수 있는 기능을 제공하도록 합니다.
- top-middle-change: top ↔ middle
- middle-bottom-change: middle ↔ bottom
- top-bottom-change: top ↔ bottom
- top-update: 이전 ↔ action.payload
- middle-update: 이전 ↔ action.payload
- bottom-update: 이전 ↔ action.payload
- **useReducer**를 사용해 state, **dispatch**를 **value**에 넣어서 **Provider**에 전달해주세요.
- B.jsx에서 **Context**로 부터 **dispatch**를 받아서 **button**에 action 객체를 전달해주세요.
- **payload**에는 **useRef**로 **input**에 입력된 텍스트 값을 전달합니다.
// App.jsx
import React, { createContext, useReducer } from 'react';
import ContainerA from './components/A';
import './App.css';
export const MyContext = createContext(null);
/*
다음 초기값을 완성해주세요.
*/
const initial = {
top: 'apple',
middle: 'banana',
bottom: 'coconut',
};
/*
상태 변경 설명서라 할 수 있는 reducer를 지시사항에 맞게 작성해주세요.
*/
function reducer(state, action) {
switch (action.type) {
case 'top-middle-change':
return {
...state,
top: state.middle,
middle: state.top,
};
case 'middle-bottom-change':
return {
...state,
middle: state.bottom,
bottom: state.middle,
};
case 'top-bottom-change':
return {
...state,
top: state.bottom,
bottom: state.top,
};
case 'top-update':
return {
...state,
top: action.payload,
};
case 'middle-update':
return {
...state,
middle: action.payload,
};
case 'bottom-update':
return {
...state,
bottom: action.payload,
};
default:
throw new Error();
}
}
export default function App() {
// useReducer를 사용해 state와 dispatch를 value 넣어서 전달해주세요.
//데이터를 보내주기위한 작업. state는 상태값 데이터값 이라고생각하면되고. useReducer로 보냄.
// initial이 위쪽에 정해진 데이터 저장소
// reducer은 조종하는곳. 컨트롤룸 느낌.
// dispatch 는 갱신하기 위한 조이스틱 느낌
const [state, dispatch] = useReducer(reducer, initial);
const value = {
state,
dispatch,
};
return (
<div className="layout">
<MyContext.Provider value={value}>
<ContainerA />
</MyContext.Provider>
</div>
);
}
B.jsx
// B.jsx
import ContainerC from './C';
import ContainerD from './D';
import ContainerE from './E';
import { useContext, useRef } from 'react';
import { MyContext } from '../App';
export default function ContainerB() {
// Context로 부터 dispatch를 받습니다.
const { state, dispatch } = useContext(MyContext);
const inputRef = useRef();
return (
<div>
<div className="container b">
<div className="title">Component B</div>
<div className="content">
<ContainerC />
<ContainerD />
<ContainerE />
<div className="button-group">
<button
onClick={() => {
// 올바른 액션 타입을 지정해주세요.
dispatch({ type: 'top-middle-change' });
}}
>
Top Middle Change
</button>
<button
onClick={() => {
// 올바른 액션 타입을 지정해주세요.
dispatch({ type: 'middle-bottom-change' });
}}
>
Middle Bottom Change
</button>
<button
onClick={() => {
// 올바른 액션 타입을 지정해주세요.
dispatch({ type: 'top-bottom-change' });
}}
>
Top Bottom Change
</button>
</div>
<div className="button-group">
<input type="text" data-testid="input" ref={inputRef} />
<button
onClick={() => {
// 올바른 액션 타입과 페이로드를 전달해주세요.
dispatch({
type: 'top-update',
payload: inputRef.current.value,
});
}}
>
Top Update
</button>
<button
onClick={() => {
// 올바른 액션 타입과 페이로드를 전달해주세요.
dispatch({
type: 'middle-update',
payload: inputRef.current.value,
});
}}
>
Middle Update
</button>
<button
onClick={() => {
// 올바른 액션 타입과 페이로드를 전달해주세요.
dispatch({
type: 'bottom-update',
payload: inputRef.current.value,
});
}}
>
Bottom Update
</button>
</div>
</div>
</div>
</div>
);
}
useRef() 를 이용한 인풋값을
inputRef.current.value 를 payload로 보내서 등록한다는 개념.
payload는 데이저 저장소의 느낌으로 생각하면된다. 갱신?느낌