react simple日記-データの追加
App.js
アプリケーションコンポーネントは、DiaryEditorコンポーネントとDiaryListコンポーネントが一緒に使用する日記データをStateとし、日記データは空の配列([])で始まる.
天候状態変化関数setDataあり
現在のアプリケーションコンポーネントが持つ日記配列状態のデータをDiaryListに渡すだけでよい
Appコンポーネントにoncreateという関数を作成し、新しい日記を追加します.
DiaryEditorコンポーネントは、AppコンポーネントからonCreateという関数をpropsとして受信し、HandelSubmit(日記の保存)が発生したときにonCreate関数を呼び出し、現在のコンテンツの情報をAppコンポーネントのonCreate関数に渡す.
import { useRef, useState } from "react";
import "./App.css";
import DiaryEditor from "./DiaryEditor";
import DiaryList from "./DiaryList";
function App() {
const [data, setData] = useState([]);
const dataId = useRef(0);
// author,content,emotion을 onCreate 함수가 받아서 data를 업데이트시키는 logic을 setData를 이용해 onCreate 함수안에 작성
const onCreate = (author, content, emotion) => {
const created_date = new Date().getTime();
const newItem = {
author,
content,
emotion,
created_date,
id: dataId.current,
};
// 다음 일기 Item은 숫자 증가
dataId.current += 1;
setData([newItem, ...data]);
};
return (
<div className="App">
<DiaryEditor onCreate={onCreate} />
<DiaryList diaryList={data} />
</div>
);
}
export default App;
DiaryEditor.jsimport React, { useRef, useState } from "react";
const DiaryEditor = ({ onCreate }) => {
const authorInput = useRef();
const contentInput = useRef();
const [state, setState] = useState({
author: "",
content: "",
emotion: 1,
});
const handleChangeState = (e) => {
setState({
...state,
[e.target.name]: e.target.value,
});
};
const handleSubmit = () => {
if (state.author.length < 1) {
authorInput.current.focus();
return;
}
if (state.content.length < 5) {
contentInput.current.focus();
return;
}
onCreate(state.author, state.content, state.emotion);
alert("저장 성공");
// 저장에 성공하면 값을 초기화 시키는 것
setState({
author: "",
content: "",
emotion: 1,
});
};
return (
<div className="DiaryEditor">
<h2>오늘의 일기</h2>
<div>
<input
ref={authorInput}
name="author"
value={state.author}
onChange={handleChangeState}
/>
</div>
<div>
<textarea
ref={contentInput}
name="content"
value={state.content}
onChange={handleChangeState}
/>
</div>
<div>
<select
name="emotion"
value={state.emotion}
onChange={handleChangeState}
>
<option value={1}>1</option>
<option value={2}>2</option>
<option value={3}>3</option>
<option value={4}>4</option>
<option value={5}>5</option>
</select>
</div>
<div>
<button onClick={handleSubmit}>일기 저장하기</button>
</div>
</div>
);
};
export default DiaryEditor;
App.css.DiaryEditor {
border: 1px solid gray;
text-align: center;
padding: 20px;
}
.DiaryEditor input,
textarea {
margin-bottom: 20px;
width: 500px;
padding: 10px;
}
.DiaryEditor textarea {
height: 150px;
}
.DiaryEditor select {
width: 300px;
padding: 10px;
margin-bottom: 20px;
}
.DiaryEditor button {
width: 500px;
padding: 10px;
cursor: pointer;
}
/* List */
.DiaryList {
border: 1px solid gray;
padding: 20px;
margin-top: 20px;
}
/* List */
.DiaryList {
border: 1px solid gray;
padding: 20px;
margin-top: 20px;
}
.DiaryList h2 {
text-align: center;
}
/* ITEM */
.DiaryItem {
background-color: rgb(240, 240, 240);
margin-bottom: 10px;
padding: 20px;
}
.DiaryItem span {
margin-right: 10px;
}
.DiaryItem .info {
border-bottom: 1px solid gray;
padding-bottom: 10px;
margin-bottom: 10px;
}
.DiaryItem .date {
color: gray;
}
.DiaryItem .content {
margin-bottom: 30px;
margin-top: 30px;
font-weight: bold;
}
.DiaryItem textarea {
padding: 10px;
}
実行画面アプリケーションコンポーネントは、DiaryEditorコンポーネントとDiaryListコンポーネントが一緒に使用する日記データをStateとし、日記データは空の配列([])で始まる.
天候状態変化関数setDataあり
現在のアプリケーションコンポーネントが持つ日記配列状態のデータをDiaryListに渡すだけでよい
Appコンポーネントにoncreateという関数を作成し、新しい日記を追加します.
DiaryEditorコンポーネントは、AppコンポーネントからonCreateという関数をpropsとして受信し、HandelSubmit(日記の保存)が発生したときにonCreate関数を呼び出し、現在のコンテンツの情報をAppコンポーネントのonCreate関数に渡す.
Reference
この問題について(react simple日記-データの追加), 我々は、より多くの情報をここで見つけました https://velog.io/@aloha006/React-simple-diary-프로젝트-4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol