인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

데이터추가하기에서 못넘어가고 있어요....ㅡㅡ

작성

·

245

0

강사님 강의를 열심히 듣고 있습니다.

근데, 잘 따라가다가 데이터 추가하기에서 정말 몇번씩 다시 써보고 확인했는데 전혀 동작을 하지 않습니다.

그전까지는 잘 되었구요,

어떻게 해결을 해야할지....ㅠㅠ

 

강사님 소스를 다 복사해서 붙여봐도 안되어요....

일기저장하기 버튼을 클릭하면 아무것도 동작하지 않습니다. alert 창도 뜨지 않구요

 

App.js 파일

import {useRef, useState} from "react";
import './App.css';
import DiaryEditor from './DiaryEditor';
import DiaryList from './DiaryList';
import { getActiveElement } from '@testing-library/user-event/dist/utils';

// const dummyList = [
//   {
//     id:1,
//     author:"홍길동",
//     content:"하이 1",
//     emotion:5,
//     created_date : new Date().getTime()
//   },
//   {
//     id:2,
//     author:"김경숙",
//     content:"하이 2",
//     emotion:2,
//     created_date : new Date().getTime()
//   },
//   {
//     id:3,
//     author:"아무개",
//     content:"하이 3",
//     emotion:1,
//     created_date : new Date().getTime()
//   }
// ]

function App () {

  const [data, setData] = useState([]);

  const dataId = useRef(0);

  const onCreate =(author, content, emotion) =>{
    const created_date = new Date().getTime();
    const newItem = {
      author,
      content,
      emotion,
      created_date,
      id : dataId.current
    }
    dataId.current += 1;
    setData([newItem, ...data]);
  };

  return (
    <div className="App">
     <DiaryEditor onCreate={onCreate} />
     <DiaryList diaryList={data} />
    </div>
  );
}

export default App;
 

DiaryEditor.js 파일

import {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;

 

 

답변 1

0

이정환 Winterlood님의 프로필 이미지
이정환 Winterlood
지식공유자

안녕하세요 이정환입니다.

보내주신 소스코드 중 DiaryEditor.js 파일 내 handleSubmit 함수 안에는 이런 조건문이 있습니다.

해당 조건문은 현재 content(일기)에 입력된 문자열의 길이가 5 미만일 때, 저장되지 않게 설정하는 조건입니다.

강의 중 일기 컨텐츠의 길이가 5 미만일 때는 저장하지 않도록 해당 조건문을 작성한다고 설명드린 부분이 있으니 참고 부탁드립니다.

 

또 보내주신 질문의 사진에는 "하하하"로 3글자만 입력되어있습니다.

따라서 5글자 미만이므로 저장이 되지 않는 것 입니다.

 

앗 .....이런....해당하는 부분의 소스만 열심히 봤네요...답변 감사드립니다.

 

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기