• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    해결됨

코드에서 궁금한게 있습니다.

23.09.29 23:32 작성 23.09.29 23:35 수정 조회수 254

0

<>{content}</> 로 쓰면 에러가 안나고

{content} 로쓰면 에러가 나는 이유가 뭘까요 ???

 작성자 : {id} | 감정 : {emotion}
<div className="content">
        {isEdit ? (
          <textarea
            value={localContent}
            onChange={(e) => setLocalContent(e.target.value)}
          />
        ) : (
          <>{content}</>
        )}
      </div>

여기서 강의 보면 id,emotion는 <></>을 안쓰는데 content를 쓰는 이유가 뭔지 모르겠습니다. 어차피

const DiaryItem = ({
  onEdit,
  onDelete,
  author,
  content,
  emotion,
  create_date,
  id,
}) => {

전부 List로 부터 받아오는데 누군 <>{content}</>이고 누군 그냥 {id} {emotion}인 이유가 먼지 궁금해요

그리고

data.filter((it)=>(it.id!==targetId)); 을

data.filter((it)=>{it.id!==targetId}); 로 바꾸면 왜 에러가 나는걸까요 ?? ?

언제 괄호를 쓰고 언제 중괄호를 써야하는지 정확히 알수있을까요 ???

 

 

 

아래는 전체 코드입니다.

import { useRef, useState } from "react";
const DiaryItem = ({
  onEdit,
  onDelete,
  author,
  content,
  emotion,
  create_date,
  id,
}) => {
  const [isEdit, setIsEdit] = useState(false);
  const toggleIsEdit = () => setIsEdit(!isEdit);
  const [localContent, setLocalContent] = useState(content);

  const handleDelete = () => {
    console.log(id);
    if (window.confirm(`${id}번쨰 일기를 삭제하겠습니까?`)) {
      onDelete(id);
    }
  };
  const handleQuiteEdit = () => {
    setIsEdit(false);
    setLocalContent(content);
  };

  const handleEdit = () => {
    onEdit(id, localContent);
  };

  return (
    <div className="DiaryItem">
      <div className="info">
        <span className="author_info">
          작성자 : <>{id}</> | 감정 : <>{emotion}</>
        </span>
        <br />
        <span className="date">날짜: {create_date}</span>
      </div>
      <div className="content">
        {isEdit ? (
          <textarea
            value={localContent}
            onChange={(e) => setLocalContent(e.target.value)}
          />
        ) : (
          <>{content}</>
        )}
      </div>
      {isEdit ? (
        <>
          <button onClick={handleQuiteEdit}>수정취소</button>
          <button onClick={handleEdit}>수정완료</button>
        </>
      ) : (
        <>
          <button onClick={handleDelete}>삭제하기</button>
          <button onClick={toggleIsEdit}>수정하기</button>
        </>
      )}
    </div>
  );
};
export default DiaryItem;

답변 1

답변을 작성해보세요.

2

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

먼저 다음과 같은 질문의 첫번째 코드에서는

isEdit이 false 일 경우 {content} 가 아닌 <>{content}</> 또는 그냥 content로 작성해 주셔야 합니다.

<div className="content">
        {isEdit ? (
          <textarea
            value={localContent}
            onChange={(e) => setLocalContent(e.target.value)}
          />
        ) : (
          <>{content}</>
        )}
      </div>

그 이유는 isEdit? 으로 시작하는 삼항연산자는 :(콜론)을 기준으로 조건식이 참이라면 콜론 앞의 값을 아니라면 뒤의 값을 계산해 반환하는 연산자입니다.

따라서 이 삼항연산자가 반환하는 값이 {content} 일 경우 이는 content 라는 프로퍼티가 존재하는 객체로 인식되어 정상적으로 작동하지 않습니다.

예를 들어 content 변수에 문자열 "이정환"이 저장되어 있다면 {content}는 {content : "이정환"} 이라는 객체 값이 반환됩니다. 이런 객체 값은 JSX 문법 파트에서 다루듯 JSX에서 렌더링 할 수 없는 값입니다. JSX에서는 오직 문자열, 숫자만 화면에 렌더링 할 수 있습니다.

그러므로 삼항 연산자의 반환값을 <>{content}</>로 설정하는 것 입니다. 이렇게 되면 JSX 문법에 따라 <>이정환</>으로 변환되어 반환됩니다. 또 content로 반환하게 될 경우 그냥 변수의 값을 반환하니 "이정환"이 반환되게 됩니다.

 

다음으로 아래 두 코드의 차이점에 대해 질문 주셨는데요
이 부분은 많은 분들이 헷갈려 하시는 부분이니 더 상세하게 설명드려보도록 하겠습니다 😃

// 1번 버전
data.filter((it)=>(it.id!==targetId)) 
// 2번 버전
data.filter((it)=>{it.id!==targetId})

1번 버전과 2번 버전의 차이는 간단합니다.
1번의 화살표 함수는 값을 반환하고, 2번 화살표 함수는 값을 반환하지 않고 있습니다.

이것을 정확히 이해하시려면 화살표 함수 문법에 대해 알고 계셔야 합니다.

화살표 함수는 화살표 이후에 작성된 값을 곧바로 반환합니다.
예를 들어 다음과 같은 함수는 숫자값 1을 반환합니다.

let a = () => 1;
// 1을 반환하는 함수

그러나 화살표 함수가 곧바로 값을 반환하지 않고 별도의 연산을 거치게 하고 싶다면 다음과 같이 화살표 이후에 중괄호를 열어 일반 함수처럼 작성해주시면 됩니다.
이때에는 함수 선언식으로 만든 함수와 동일하게 return 키워드를 통해 반환값을 명시하게 됩니다.

let b = () => {
  //... 계산
  return 0;
};
// 0을 반환하는 함수

그렇다면 이때 위 함수의 중괄호 내부에서 return 을 명시하지 않으면 어떻게 될까요? 그럼 당연히 이 함수는 아무런 값도 반환하지 않는 함수가 됩니다.

let b = () => {
  //... 계산
};
// 아무런 값도 반환하지 않는 함수

이제 다시 질문해주신 두가지 버전의 코드를 살펴보겠습니다.

// 1번 버전
data.filter((it)=>(it.id!==targetId)) 
// 2번 버전
data.filter((it)=>{it.id!==targetId})

차이점이 보이시나요? 1번 버전은 it.id ! == targetId 라는 조건식의 결과값을 반환하고 있지만

2번 버전은 아무런 값도 반환하고 있지 않습니다.

배열의 filter 메서드에 전달하는 콜백함수는 현재 순회중인 요소가 필터링 되어야 하는지 아닌지 유무를 true 또는 false를 반환함으로써 결정하게 됩니다. 따라서 아무런 값도 반환하지 않는 2번 버전은 오류가 발생하게 되는 것 입니다.