์ฐ๋ฆฌ๊ฐ ๋ง๋ค Update๋ ์ด๋ฏธ ์ฐ์ฌ์ง ๋ชฉ๋ก์ ๊ณจ๋ผ์ desc๋ฅผ ์์ ํ๋ ๋์์ ํ ๊ฒ์ด๋ค.
์ฐ์ Update ๊ธฐ๋ฅ์ ๊ตฌํํ js ํ์ผ์ CreateContent ํ์ผ์ ๋ณต์ฌํด์ ๋ง๋ค๊ณ h2 ํ๊ทธ๋ง update๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ updatecontent ์ปดํฌ๋ํธ๊ฐ ์คํ๋ ๋ ์ ๋ ฅ ๊ฐ์ผ๋ก contentd id๋ฅผ ์ฃผ์ ์์ผ์ค ๊ฒ์ด๋ค.
form ์ ์ดํ๊ธฐ
props ๋ฐ์ดํฐ๋ read only์ด๋ค. value ๊ฐ์ผ๋ก ์ง์ ํด๋ฒ๋ฆฌ๋ฉด react๊ฐ ๋์์ ๋ง์๋ฒ๋ฆฐ๋ค.
๊ทธ๋์ ์ ๋ ฅ์ฐฝ์ ๊ธ์จ๋ฅผ ๋ฐ๊พธ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋๋ค.
value๊ฐ์ผ๋ก ์ปดํฌ๋ํธ ์์์ ๊ฐ๋ณ์ ์ธ ๋ฐ์ดํฐ, stateํ๋ฅผ ์์ผ์ค์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ value ๊ฐ์ ์์ ํ ์ ์๋๋ก input ๊ฐ์ ๋ฐ๊ฟจ์ ๋ state ๊ฐ์ ๋ฐ๊ฟ์ค์ผ ํ๋๋ฐ, ์ฌ๊ธฐ์ onChange๋ฅผ ์จ์ผํ๋ค.
update ํ๋ ค๋ ๋ชฉ๋ก์ ํด๋ฆญํ๋ฉด ๊ทธ ๋ชฉ๋ก์ด ์ ๋ ฅ์ฐฝ์ ๋ค์ด๊ฐ๋ค.
์ค๋ฅธ์ชฝ ์ฌ์ง์ HTML์ ๋๋ฅธ ํ update๋ฅผ ๋๋ฅธ ๋ชจ์ต์ด๋ค.
desc๋ ๋์ผํ๊ฒ ํด์ค๋ค
desc๋ ๋๊ฐ์ด ์ฒ๋ฆฌํด์ฃผ๋ฉด onChange ํจ์์ ์ค๋ณต์ด ์๊ธฐ๋๋ฐ ์ด๊ฒ์ ์์ ์ค ๊ฒ์ด๋ค.
๊ธฐ๋ฅ์ ์ผ๋ก๋ ๋ฌธ์ ์์ง๋ง ๊ทธ๋ฅ ๋ณด๊ธฐ ์ข๊ฒ ํ๊ธฐ์ํด์!
์ฌ๊ธฐ์ ์ต์ javascript ๊ธฐ๋ฅ์ด ๋์ค๋๋ฐ
[e.target.name]ํ๋ฉด target์ name ๊ฐ์ด ๋ค์ด์จ๋ค.
๋ ์ฌ๊ธฐ์ ๋ค์์๋ .bind(this)๋ฅผ constructor์์ ํด์ค ์๋ ์๋ค.
๋ง์ง๋ง์ผ๋ก update๋ฅผ ํ๋ ค๋ฉด ์ด๋๋ฅผ update๋ฅผ ํ ๊ฑด์ง์ ๋ํ ์๋ณ์๊ฐ ํ์ํ๋ค.
onSubmit์ด๋ผ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์ด ์ปดํฌ๋ํธ๋ก ๋ค์ด์จ onSubmit props๋ฅผ ์คํํ๋๋ฐ ์ฌ๊ธฐ๋ค๊ฐ id ๊ฐ์ ์ค๋ค.
App.js์์๋ ์ฝ๋ ์์ ์ ํด์ผํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ฅ ์ค์
Array.from(this.state.contents)์ ํ๋ฉด this.state.contetns๋ฅผ ๋ณต์ฌํ ์๋ก์ด ๋ฐฐ์ด์ด ์๊ธด๋ค.
concat๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด๋ค.
๐ฝ 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();
//debugger;
// CreateContent์ onSubmit์ ํธ์ถ
this.props.onSubmit(
this.state.id,
this.state.title,
this.state.desc
// e.target.title.value,
// e.target.desc.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
name="desc"
placeholder="description"
value={this.state.desc}
onChange={this.inputFormHandler}
></textarea>
</p>
<p>
<input type="submit"></input>
</p>
</form>
</article>
);
}
}
export default UpdateContent;
๐ฝ App.js (๋ฆฌํฉํ ๋ง ํ)
- create์ update๋ฅผ ํ๊ณ ๋๋ฉด ๋ค์ read๋ชจ๋๋ก ๋์๊ฐ๋๋ก ๋ง๋ค์ด์ฃผ์๋ค.
create์ ๊ฒฝ์ฐ์๋ ๋ฐฉ๊ธ๋ง๋ ์ปจํ ์ธ ๋ฅผ ๋ณด์ด๋๋ก ํ๋ค.
import './App.css';
import React, { Component } from 'react';
import TOC from "./components/TOC"
import ReadContent from "./components/ReadContent"
import CreateContent from "./components/CreateContent"
import UpdateContent from "./components/UpdateContent"
import Subject from "./components/Subject"
import Control from "./components/Control"
// ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ์ฝ๋ (ํ
ํ๋ฆฟ)
// ๋ฆฌ์กํธ์ Component๋ผ๊ณ ํ๋ ํด๋์ค๋ฅผ ์์ํ๋
// App ์ด๋ผ๋ ํด๋์ค - render()๋ผ๋ ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
class App extends Component {
constructor(props){
super(props);
// ๋ง์ง๋ง content id ๊ฐ
this.max_content_id = 3;
this.state = {
mode:'read',
selected_content_id:1,
subject:{title:'WEB', sub:'World Wide Web!'},
welcome:{title:'Welcome', desc:'Hello, React'},
contents:[
{id:1, title:'HTML', desc:'HTML is HyperText ...'},
{id:2, title:'CSS', desc:'CSS is for design ...'},
{id:3, title:'JavaSript', desc:'JavaSript is ...'}
]
}
}
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;
//_title = data.title;
//_desc = data.desc;
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){
// add content to this.state.contents
this.max_content_id = this.max_content_id+1;
// ์๋์๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ contents์ ๋์๋ค๊ฐ ์ถ๊ฐํ๋ค.
var _contents = this.state.contents.concat(
{id:this.max_content_id, title:_title, desc:_desc}
);
this.setState({
contents: _contents,
mode: 'read',
selected_content_id: this.max_content_id
});
}.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'
});
}.bind(this)}></UpdateContent>
}
return _article;
}
render(){
return (
<div className="App">
<Subject
title={this.state.subject.title}
sub={this.state.subject.sub}
onChangePage={function(){
//alert('hihi');
this.setState({mode:'welcome'})
}.bind(this)}
>
</Subject>
<TOC
onChangePage={function(id){
//alert('hi');
this.setState({
mode:'read',
selected_content_id : Number(id)
})
}.bind(this)}
data={this.state.contents}
></TOC>
<Control onChangeMode={function(_mode){
this.setState({
mode: _mode
})
}.bind(this)}></Control>
{this.getContent()}
</div>
);
}
}
export default App;
'WEB > Front-End๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ๋ง์ง๋ง ์ ๋ฆฌ (0) | 2021.10.16 |
---|---|
[React] Delete ๊ตฌํ (0) | 2021.10.16 |
[React] ์ฑ๋ฅ๊ฐ์ ์ ์ข ๋ ํธํ๊ฒํ๊ธฐ (create) (0) | 2021.10.11 |
[React] CRUD๋ฅผ ๊ณ๋ค์ธ,,, (Create) (0) | 2021.10.11 |
[React] ์ด๋ฒคํธ, state ํ๊ณ ๋ค๊ธฐ (0) | 2021.10.07 |