예상 흐름
댓글 input value 저장 -> 댓글 입력 값 저장 공간 지정 -> 댓글 출력
state 값을 먼저 선언한다.
const [comment, setComment] = useState('');
commentInput 함수를 setComment에 저장될 수 있도록 선언한다.
const commentInput = event => setComment(event.target.value);
댓글 input 값에 comment의 값을 넣을 수 있도록 input 안에 value 속성을 설정해준다.
onChange 이벤트를 실행시키기 위해 commentInput 함수를 넣어준다.
<input type="text" placeholder="댓글 달기..." value={comment} onChange={commentInput} />
const [commentArray, setCommentArray] = useState([])
const registerComment = event => {
event.preventDefault(); // react에서 다른 이벤트가 발생되지 않도록 해주는 명령어
if (comment === '') {
return; // 만일 comment에 아무 값도 없다면 바로 return 된다.
}
setCommentArray(commentValueList => [...commentValueList, comment]);
// comment의 값이 새로 입력된다면 commentValueList에 새로운 배열인 ...commentValueList가 입력되며 이 값은 setCommentArray에 전송된다.
setComment(''); // setCommentArray에 값이 입력되면 input값엔 아무 값도 없게 초기화 된다.
}
함수 registerComment를 form 태그의 onSubmit 이벤트를 사용하여 값을 넣어준다.
<form id="comment" onSubmit={registComment}>
form 태그에 자동으로 enter를 치면 전송될 수 있도록 하는 기능이 있어 댓글에는 form 태그를 이용한다고 한다.
enter key 뿐 아니라 게시 button 도 클릭하면 전송이 될 수 있도록 onClick 이벤트를 사용하여 registComment 함수를 넣어준다.
<button type="button" onClick={registComment}
<ul className="todo-list">
{commentArray.map((value, index) => (
<li key={index}>
<span>Hey.yong44</span>
<span>{value}</span>
<Button>x</Button>
</li>
))}
</ul>
const commentValid = comment.length >= 1;
return (
...
<button type="button" onClick={registComment} className={commentValid ? 'buttonEnabled' : 'buttonDisabled'}>
...
)
function MainHaeYongLee() {
const [comment, setComment] = useState('');
const commentInput = event => setComment(event.target.value);
const [commentArray, setCommentArray] = useState([]);
const registComment = event => {
event.preventDefault();
if (comment === '') {
return;
}
setCommentArray(commentValueList => [...commentValueList, comment]);
setComment('');
};
const commentValid = comment.length >= 1;
return (
...
<ul className="todo-list">
{commentArray.map((value, index) => (
<li key={index}>
<span>Hey.yong44</span>
<span>{value}</span>
<button>x</button>
</li>
))}
</ul>
...
<form id="comment" onSubmit={registComment}>
<i className="fa-regular fa-face-smile fa-lg" />
<input
type="text"
placeholder="댓글 달기..."
value={comment}
onChange={commentInput}
/>
<button
type="button"
onClick={registComment}
className={
commentValid ? 'buttonEnabled' : 'buttonDisabled'
}
>
게시
</button>
</form>
...
}
참고 및 출처
위코드 강의
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map
https://velog.io/@cullen/React-Westagram-%EB%8C%93%EA%B8%80-%EC%B6%94%EA%B0%80-%ED%95%A8%EC%88%98
https://velog.io/@moolbum/React-%EC%9D%B8%EC%8A%A4%ED%83%80%EA%B7%B8%EB%9E%A8-%EB%8C%93%EA%B8%80
https://developer.mozilla.org/ko/docs/Web/API/Event/preventDefault