728x90
과제내용
TODO LIST
- 컴포넌트
- 부모 컴포넌트
- 내용 컴포넌트
- 전역으로 내용관리
- 작성 컴포넌트(팝업)
- 가능
- 게시판 제목과, 사용자 이름은 변경이 가능하다.
- 제목과 이름 변경 시, 리스트는 리렌더링 되지 않는다.
- 리스트가 렌더링 되는 경우는 리스트의 내용이 추가되었을 때만이다.
- 신규 작성 시, 작성 버튼으로 팝업이 열려서 작성 컴포넌트에서 수행한다.
- 게시판 제목과, 사용자 이름은 변경이 가능하다.
결과물
💻 App.js_useContext를 사용할 수 있도록 Provider를 설정한다.
- createContext를 실행하는 Global객체를 선언하여, Provider로 state객체를 초기값으로 설정한다.
- 루트 컴포넌트인 App 컴포넌트 상위에 Global.Provider를 감싸 context를 사용할 수 있도록 설정하였다.
import { createContext } from "react";
import "./App.css";
import { useState } from "react";
import { Lists } from "./components/layout/Lists";
import WriterContext from "./components/hooks/context/WriterContext";
import PostCreDiv from "./components/hooks/reducer/PostCreDiv";
import Postrender from "./components/hooks/memo/Postrender";
import { Postbox } from "./components/layout/Postbox";
import { Popbox } from "./components/layout/Popbox";
import PopBtn from "./components/PopBtn";
import PopDispaly from "./components/PopDispaly";
const Global = createContext();
function App() {
const [title, setTitle] = useState("");
const [content, setContent] = useState("");
const [writer, setWriter] = useState("User");
const [list, setList] = useState([]);
const state = {
list,
setList,
title,
setTitle,
content,
setContent,
writer,
setWriter,
};
return (
<Global.Provider value={state}>
<div className="App">
<Postbox>
<WriterContext></WriterContext>
<Lists>
<Postrender></Postrender>
</Lists>
<PopBtn></PopBtn>
</Postbox>
<PopDispaly></PopDispaly>
</div>
</Global.Provider>
);
}
export { App, Global };
💻 WriterContext.js_useContext에서 선언한 writer와 title의 상태값을 업데이트 한다.
- input에 입력한 값으로 button을 클릭하면 상태값에 업데이트되고 reder시켜 확인할 수 있다.
import React from "react";
import { useContext } from "react";
import { Writer } from "../../layout/Writer";
import { Global } from "../../../App";
const WriterContext = () => {
const { writer, setWriter, title, setTitle } = useContext(Global);
const HandleClick1 = () => {
const inwriter = document.getElementById("writer");
setWriter(inwriter.value);
};
const HandleClick2 = () => {
const intitle = document.getElementById("title");
setTitle(intitle.value);
};
return (
<Writer>
<div>
<p>작성자 : {writer}</p>
<p>제목 : {title}</p>
</div>
<div>
<input
type="text"
placeholder="사용자명을 입력하세요"
id="writer"
></input>
<button
onClick={() => {
HandleClick1();
}}
>
변경
</button>
</div>
<div>
<input
type="text"
placeholder="제목을 입력하세요"
id="title"
></input>
<button
onClick={() => {
HandleClick2();
}}
>
변경
</button>
</div>
</Writer>
);
};
export default WriterContext;
💻 PostCreDiv.js_할 일을 작성하는 컴포넌트이다. 해당 컴포넌트를 팝업으로 띄우고 작성한 내용을 상태값 list에 저장한다.
import React, { useReducer } from "react";
import { PostDiv } from "../../layout/PostDiv";
import { Global } from "../../../App";
import { useContext } from "react";
import { useDispatch } from "react-redux";
import { useMemo } from "react";
const PostCreDiv = () => {
const { content, setContent, list, setList } = useContext(Global);
const HandleClick = () => {
const input = document.getElementById("posts");
setList([...list, input.value]);
document.querySelector("#post").style.display = "none";
};
const Pop = () => {
const post = document.querySelector("#post");
post.style.display = "none";
};
return (
<PostDiv>
<input
type="text"
placeholder="할 일을 입력하세요."
id="posts"
></input>
<div>
<div
onClick={() => {
HandleClick();
}}
>
등록
</div>
<div
onClick={() => {
Pop();
}}
>
닫기
</div>
</div>
</PostDiv>
);
};
export default PostCreDiv;
💻 Postrender.js_list 상태값을 불러오는 컴포넌트이다. useMemo를 사용하여 list값이 변할때만 리렌더링된다.
import React from "react";
import { Post } from "../../layout/Post";
import { Global } from "../../../App";
import { useContext } from "react";
import { useEffect } from "react";
import { useMemo } from "react";
const Postrender = () => {
const { list, setList } = useContext(Global);
const view = useMemo(() => {
return list.map((el, index) => {
return (
<div key={index}>
<div>{index + 1}</div>
<div>{el}</div>
</div>
);
});
}, [list]);
return (
<Post>
<div>{view}</div>
</Post>
);
};
export default Postrender;
728x90
'블록체인_9기 > 과제' 카테고리의 다른 글
과제_230927_Blockchain(트랜잭션 사용해 로또 추첨하기) (0) | 2023.10.04 |
---|---|
49강_220710_React(Redux 활용_간단한 주문페이지 제작) (0) | 2023.07.10 |
48강_220706_React(TODO LIST 제작) (0) | 2023.07.07 |
47강_220705_React(지뢰찾기 제작) (1) | 2023.07.05 |
46강_220704_React(캘린더 제작) (0) | 2023.07.04 |