목표1: input박스에 쓴 글을 글발행 버튼을 눌렀을 때, 맨 위에 글이 추가되도록 하기
목표2: 각 글의 삭제 버튼을 누르면 해당 글이 삭제되도록 하기
html 코드를 조작하는 것이 아니라, state를 조작해야한다.
글 발행 기능
1. 인풋 박스와 글 발행 버튼 디자인하기 (글이 추가될때의 디자인은 이미 되어있기 때문에 따로 디자인 하지 않아도 된다.)
{
title.map(function(a, i){
return (
<div className="list" key={i}>
<h3 onClick={ () => { setModal(true); setIdx(i)} }> { title[i] }
<span onClick={ (e) => { e.stopPropagation(); add1Like(i) }}>👍</span> { like[i] } </h3>
<button onClick={ ()=> {removeTitle(i)} }>글삭제</button>
<p> {postDate[i]} </p>
<hr/>
</div>
)
})
}
<br></br>
{//e는 이벤트를 뜻하고, 이 인풋박스의 값을 입력값이라는 state를 입력값변경을 통해 변경한다}
<input onChange={ (e) => { 입력값변경(e.target.value); console.log(입력값)}} />
<button onClick={ () => { addTitle(입력값) }}>글발행</button>
2. UI의 현재 상태를 state에 저장
// 입력값이라는 state를 생성한다. 기본값을 비어있는 문자열로 설정
let [입력값, 입력값변경] = useState('');
3. 클릭했을 때 글이 발행되도록 저장
(사실 응용 문제까지 풀어서 그에 관련된 코드도 있긴하다.)
function addTitle(txt) {
if (txt == '') {
alert("글 제목을 입력해주세요.")
}
else {
setTitle([txt, ...title])
setLike([0, ...like])
const timeElapsed = new Date()
const today = new Date(timeElapsed)
setPostDate([today.toUTCString(), ...postDate])
}
}
글 삭제 기능
1. 삭제 버튼 디자인
리스트 반복 map함수 안에 글삭제 버튼을 생성한다.
<button onClick={ ()=> {removeTitle(i)} }>글삭제</button>
2. UI의 현재 상태를 state에 저장
title을 조작하는 것이기 때문에 이미 작성되어 있는 state 활용
3. 삭제 버튼을 클릭했을 때, 해당 글 삭제
const removeTitle = (idx) => {
setTitle(title => title.filter((_, i) => i !== idx));
};
최종 UI 결과
전체 코드
더보기
/* eslint-disable */
import React, { useState, useEffect } from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
let [idx, setIdx] = useState(0);
let [title, setTitle] = useState([
'남자 코트 추천',
'FC서울 직관 후기',
'바버 레인부츠 후기, 추천!!']);
let [like, setLike] = useState([0, 0, 0]);
let [입력값, 입력값변경] = useState('');
let [postDate, setPostDate] = useState([
'Thu, 20 Jul 2023 03:15:45 GMT',
'Thu, 20 Jul 2023 03:15:45 GMT',
'Thu, 20 Jul 2023 03:15:45 GMT'
]);
function add1Like(idx) {
let copyLike = [...like]
copyLike[idx] += 1
setLike(copyLike)
}
function changeTitle() {
let copyTitle = [...title]
copyTitle[0] = '여자 코트 추천'
setTitle(copyTitle)
}
function addTitle(txt) {
if (txt == '') {
alert("글 제목을 입력해주세요.")
}
else {
setTitle([txt, ...title])
setLike([0, ...like])
const timeElapsed = new Date()
const today = new Date(timeElapsed)
setPostDate([today.toUTCString(), ...postDate])
}
}
const removeTitle = (idx) => {
setTitle(title => title.filter((_, i) => i !== idx));
};
let [modal, setModal] = useState(false); //현재 상태는 false -> 닫힌상태
return (
<div className="App">
<div className="black-nav">
<div>Jonny&Jayne Blog 🥰</div>
</div>
{
title.map(function(a, i){
return (
<div className="list" key={i}>
<h3 onClick={ () => { setModal(true); setIdx(i)} }> { title[i] }
<span onClick={ (e) => { e.stopPropagation(); add1Like(i) }}>👍</span> { like[i] } </h3>
<button onClick={ ()=> {removeTitle(i)} }>글삭제</button>
<p> {postDate[i]} </p>
<hr/>
</div>
)
})
}
<br></br>
<input onChange={ (e) => { 입력값변경(e.target.value); console.log(입력값)}} />
<button onClick={ () => { addTitle(입력값) }}>글발행</button>
{
modal == true ? <Modal idx={idx} title={title} changeTitle={changeTitle}
setModal={setModal}/> : null
}
</div>
);
}
function Modal(props) {
return (
<div className='modal'>
<h2>{ props.title[props.idx] }</h2>
<p>날짜</p>
<p>상세내용</p>
<button onClick={ ()=> {props.changeTitle()} }>글수정</button>
<button onClick={ ()=> {props.setModal(false)}}>닫기</button>
</div>
)
}
export default App;
차근차근 개발해 나가는데 재미를 찾고 있다.
비록 친절한 개발자 글은 아니겠지만, 공부용으로 조금씩 써보는것에 의미를 두고자 한다.
'React' 카테고리의 다른 글
[React] props 이해하기 (0) | 2023.07.19 |
---|---|
[React] map 함수 활용하기 (0) | 2023.07.18 |
[React] 동적인 UI 만들기 (0) | 2023.07.17 |
[React] 컴포넌트 이해하기 (0) | 2023.07.17 |
[React] 웹 개발 시작하기 (0) | 2023.07.17 |