![[WEB-React] 스터디 5일차](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FcgG01p%2FbtsEy3qf6Ej%2FAAAAAAAAAAAAAAAAAAAAAPKk5OrqAJT98RkWhHJ1HV-opEgShBCcFseX1eTjgpJz%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3Dkzzp%252BSZcpGRSdljJwMYUsEx%252FNLY%253D)
[WEB-React] 스터디 5일차Study/WEB Study2024. 2. 8. 13:37
Table of Contents
getReadContent() {
var i = 0;
while (i < this.state.contents.length) {
var data = this.state.contents[i];
if (data.id === this.state.selected_content_id) {
return data;
break;
}
i = i + 1;
}
}
read 모드에서 while문으로 저장했던 데이터 배열을 나열한다.
inputFormHandler(e) {
this.setState({ [e.target.name]: e.target.value });
}
onChange에서 setState로 state 값이 바뀌도록 했었는데,
코드의 중복이 많아 핸들러 메소드를 만들어주었다.
JS 문법 Computed Property Name를 사용하여 [ ]으로 감싼 레퍼런스가 가리키는 실제 값이 키 값으로 사용된다.
App.js
import React, { Component } from "react";
import TOC from "./components/TOC";
import ReadContent from "./components/ReadContent";
import Subject from "./components/Subject";
import Control from "./components/Control";
import CreateContent from "./components/CreateContent";
import UpdateContent from "./components/UpdateContent";
class App extends Component {
constructor(props) {
super(props);
this.max_content_id = 3;
this.state = {
mode: "read",
selected_content_id: 1,
subject: { title: "WEB", sub: "world wide web!" },
welcome: { title: "Welcome", desc: "ridkdkdkdkr" },
contents: [
{ id: 1, title: "HTML", desc: "HyperText Markup Language" },
{ id: 2, title: "CSS", desc: "for design" },
{ id: 3, title: "JavaScript", desc: "for interactive" },
],
};
}
getReadContent() {
var i = 0;
while (i < this.state.contents.length) {
var data = this.state.contents[i];
if (data.id === this.state.selected_content_id) {
return data;
break;
}
i = i + 1;
}
}
getContent() {
var _title,
_desc,
_article = null;
if (this.state.mode === "welcome") {
_title = this.state.welcome.title;
_desc = this.state.welcome.desc;
_article = <ReadContent title={_title} desc={_desc}></ReadContent>;
} else if (this.state.mode === "read") {
var _content = this.getReadContent;
_article = (
<ReadContent title={_content.title} desc={_content.desc}></ReadContent>
);
} else if (this.state.mode === "create") {
_article = (
<CreateContent
onSubmit={function (_title, _desc) {
this.max_content_id = this.max_content_id + 1;
var _contents = Array.from(this.state.contents);
_contents.push({
id: this.max_content_id,
title: _title,
desc: _desc,
});
this.setState({
contents: _contents,
mode: "read",
selected_content_id: this.max_content_id,
});
console.log(_title, _desc);
}.bind(this)}
></CreateContent>
);
} else if (this.state.mode === "update") {
_content = this.getReadContent();
_article = (
<UpdateContent
data={_content}
onSubmit={function (_id, _title, _desc) {
var _contents = Array.from(this.state.contents);
var i = 0;
while (i < _contents.length) {
if (_contents[i].id === _id) {
_contents[i] = { id: _id, title: _title, desc: _desc };
break;
}
i = i + 1;
}
this.setState({
contents: _contents,
mode: "read",
});
console.log(_title, _desc);
}.bind(this)}
></UpdateContent>
);
}
return _article;
}
render() {
return (
<div className="App">
<Subject
title={this.state.subject.title}
sub={this.state.subject.sub}
onChangePage={function () {
this.setState({ mode: "welcome" });
}.bind(this)}
></Subject>
<TOC
onChangePage={function (id) {
this.setState({
mode: "read",
selected_content_id: Number(id),
});
}.bind(this)}
data={this.state.contents}
></TOC>
<Control
onChangeMode={function (_mode) {
if (_mode === "delete") {
if (window.confirm("really?")) {
var _contents = Array.from(this.state.contents);
var i = 0;
while (i < _contents.length) {
if (_contents[i].id === this.state.selected_content_id) {
_contents.splice(i, 1);
break;
}
i = i + 1;
}
this.setState({
mode: "welcome",
contents: _contents,
});
alert("deleted!");
}
} else {
this.setState({
mode: _mode,
});
}
}.bind(this)}
></Control>
{this.getContent()}
</div>
);
}
}
export default App;
UpdateContent.js
import React, { Component } from "react";
class UpdateContent extends Component {
constructor(props) {
super(props);
this.state = {
id: this.props.data.id,
title: this.props.data.title,
desc: this.props.data.desc,
};
this.inputFormHandler = this.inputFormHandler.bind(this);
}
inputFormHandler(e) {
this.setState({ [e.target.name]: e.target.value });
}
render() {
console.log(this.props.data);
return (
<article>
<h2>Update</h2>
<form
action="/create_process"
method="POST"
onSubmit={function (e) {
e.preventDefault();
this.props.onSubmit(
this.state.id,
this.state.title,
this.state.value
);
alert("submit!");
}.bind(this)}
>
<input type="hidden" name="id" value={this.state.id}></input>
<p>
<input
type="text"
name="title"
placeholder="title"
value={this.state.title}
onChange={this.inputFormHandler}
></input>
</p>
<p>
<textarea
onChange={this.inputFormHandler}
name="desc"
placeholder="description"
>
{this.state.desc}
</textarea>
</p>
<p>
<input type="submit"></input>
</p>
</form>
</article>
);
}
}
export default UpdateContent;
남은 코드 깃허브 참조
WEB-JS-Study/web-react at main · yungan9/WEB-JS-Study (github.com)
완강한 소감..
코드 치다가 리팩토링 한다고 갑자기 지우고 다시 치던데
그때마다 울고싶었다...
원본 커밋 + 리팩토링 후 커밋 해서 비교할 수 있게 남기고 싶었는데
그냥 중간에 바꾸니까 이걸 일일이 다 커밋할 수도 없고 ㅜㅜ
살짝 아쉬웠다.
그리고 핑계이긴 하지만 바빠서 수강 일정을 좀 미뤘다.
그치만 지금 나는 13일째 휴일 없이 일하기 때문에 그냥 힘들다...
그래도 수강하느라 고생한 나 칭찬해~
느낀건 지금까지 짠 코드에서도 리팩토링을 하고 싶은 부분이 보여서
시각적으로 넓어진 느낌?? 물론 아닐수도 있다.
토이프로젝트 하나 얼른. . 홀홀홀..
'Study > WEB Study' 카테고리의 다른 글
[WEB-React] 스터디 4일차 (1) | 2024.02.07 |
---|---|
[WEB-React] 스터디 3일차 (1) | 2024.02.07 |
[WEB-React] 스터디 2일차 (0) | 2024.02.02 |
[WEB-React] 스터디 1일차 (0) | 2024.01.31 |
[WEB-JavaScript] 스터디 4일차 (0) | 2024.01.26 |