Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- googleColaboratory
- 리액트
- 모던자바스크립트
- ReactDOM.render is no longer supported in React 18. Use createRoot instead
- 계산맞추기 게임
- 노드에 리액트 추가하기
- 웹 게임을 만들며 배우는 리액트
- 인프런
- Spring-Framework
- DB Browser
- 거북이 대포 게임
- 모두의 파이썬
- 타자 게임 만들기
- 자바스크립트
- spring-boot
- intllij 내 Bean을 찾지 못해서 발생하는 오류
- vs code 내 node
- react오류
- Python
- Colaboratory 글자 깨짐
- node.js로 로그인하기
- intellij
- Do it 자바스크립트 + 제이쿼리 입문
- node.js 설치
- Concurrently
- JS 개념
- You are importing createRoot from "react-dom" which is not supported. You should instead import it from "react-dom/client"
- props
- react
- 따라하며 배우는 노드 리액트 기본 강의
Archives
- Today
- Total
프로그래밍 삽질 중
[웹 게임을 만들며 배우는 React] - 지뢰찾기(1), contextAPI 본문
출처: https://www.inflearn.com/course/web-game-react/dashboard
* Cotext API
- 부모와 자식 관계가 다층적일 때 props 물려주기 힘듦
- 예를 들어 부모는 MineSearch.jsx 자식은 Table.jsx > Tr.jsx > Td.jsx일 때 Td가 MineSearch에서 데이터를 가져오고 싶을 때 MineSearch > Table > Tr > Td 순으로 물려줘야 함
- 이 과정에서 MineSearch에서 Td로 바로 데이터를 전달하게 하는 것 = Context API
- 부모 : createContext 사용(useMemo 사용)
▶ MineSearch가 리렌더링 될 때마다 {{ tableData: state.tableData, dispatch }}도 새로 생김
▶ 객체가 새로 생긴다는 것은 contextAPI를 쓰는 자식들도 매번 새로 리렌더링됨(성능적으로 문제 생김)
▶ 매번 새로운 객체가 생기지 않게 useMemo(객체값 기억) 사용 (렌더링 캐싱이라고도 함)
//문제 있는 코드
<TableContext.Provider value={{ tableData: state.tableData, dispatch }}>
//수정한 코드
const value = useMemo(
() => ({ tableData: state.tableData, dispatch }),
[state.tableData]
)
<TableContext.Provider value={value}>
//부모
import React, { useReducer, createContext, useMemo } from "react";
import Table from "./Table";
export const TableContext = createContext({
tableData: [],
dispatch: () => {},
});
const MineSearch = () => {
const [state, dispatch] = useReducer(reducer, initialState);
const value = useMemo(
() => ({ tableData: state.tableData, dispatch }),
[state.tableData]
)
return (
<TableContext.Provider value={value}>
<Table>
</TableContext.Provider>
);
};
▶ 자식 : useContext 사용
[Table.jsx]
import React, { useContext } from "react";
import { TableContext } from "./MineSearch";
import Tr from "./Tr";
const Table = () => {
const { tableData } = useContext(TableContext);
return (
<table>
{Array(tableData.length)
.fill()
.map((tr, i) => (
<Tr rowIndex={i} />
))}
</table>
);
};
export default Table;
[Tr.jsx]
import React, { useContext } from "react";
import { TableContext } from "./MineSearch";
import Td from "./Td";
//Table로 부터 rowIndex 받음
const Tr = ({ rowIndex }) => {
const { tableData } = useContext(TableContext);
return (
<tr>
{tableData[0] &&
Array(tableData[0].length)
.fill()
.map((td, i) => <Td rowIndex={rowIndex} cellIndex={i} />)}
</tr>
);
};
export default Tr;
[Td.jsx]
import React, { useContext } from "react";
import { CODE, TableContext } from "./MineSearch";
const getTdStyle = (code) => {
switch (code) {
case CODE.NORMAL:
case CODE.MINE:
return {
background: "#444",
};
case CODE.CLICKED_MINE:
case CODE.OPENED:
return {
background: "white",
};
case CODE.QUESTION_MINE:
case CODE.QUESTION:
return {
background: "yellow",
};
case CODE.FLAG_MINE:
case CODE.FLAG:
return {
background: "red",
};
default:
return {
background: "white",
};
}
};
const getTdText = (data) => {};
const Td = ({ rowIndex, cellIndex }) => {
const { tableData } = useContext(TableContext);
return (
<td style={getTdStyle(tableData[rowIndex][cellIndex])}>
{getTdText(tableData[rowIndex][cellIndex])}
</td>
);
};
export default Td;
'과거 프로그래밍 자료들 > React' 카테고리의 다른 글
Next.js와 리덕스 설명(로그인, 로그아웃) (0) | 2022.10.06 |
---|---|
인라인 스타일링 시 리렌더링 문제(styled-components를 사용하는 이유) (1) | 2022.10.04 |
[웹 게임을 만들며 배우는 React] - 틱택토, useReducer, useCallback (0) | 2022.09.29 |
[웹 게임을 만들며 배우는 React] - 로또추첨기, useEffect, useCallback (1) | 2022.09.29 |
[웹 게임을 만들며 배우는 React] - 가위바위보, 커스텀 훅 (0) | 2022.09.29 |