💎 React

상수데이터, 목데이터

ji-hyun 2021. 12. 1. 17:50

상수데이터

 

export const RECOMMEND_DATA = [
  {
    id: 1,
    userId: 'jihyun219',
    userName: 'jihyun',
    src: '/images/jihyunLee/profile.jpg',
  },
  {
    id: 2,
    userId: 'jihyun123',
    userName: 'jihyun',
    src: '/images/jihyunLee/profile.jpg',
  },
  {
    id: 3,
    userId: 'jiyoung999',
    userName: 'jihyun',
    src: '/images/jihyunLee/profile.jpg',
  },
];

 

 

상수데이터에서 [ ] 배열로 선언한 이유는 무엇일까?

바로 map 메서드를 사용하기 위해서이다.

 

 

 

 

 

 

<div className="user_profiles">
                {RECOMMEND_DATA.map(story => {
                  return (
                    <div className="user_profile_one" key={story.id}>
                      <div>
                        <img src={story.src} alt="profile" />
                        <p className="profile">
                          {story.userId}
                          <span className="gray_color">{story.userName}</span>
                        </p>
                      </div>
                      <p className="follow">팔로우</p>
                    </div>
                  );
                })}

 

이렇게 반복되는 코드를 달라지는 부분만 바꾸면서 반복적으로 쓸 수 있다.

이때 를 꼭 써주어야 한다. 참고로 키는 꼭 고유한 값이어야 한다.

 

 

 

 

 

 

 

 

목데이터

목데이터는 먼저 json 파일을 따로 만들어주자. (위치는 public 밑, data 밑..)

 

 

[
  {
    "id": 1,
    "userId": 'jihyun219',
    "userName": 'jihyun',
    "src": '/images/jihyunLee/profile.jpg',
  },
  {
    "id": 2,
    "userId": 'jihyun123',
    "userName": 'jihyun',
    "src": '/images/jihyunLee/profile.jpg',
  },
  {
    "id": 3,
    "userId": 'jiyoung999',
    "userName": 'jihyun',
    "src": '/images/jihyunLee/profile.jpg',
  },
];

 

상수데이터와 무엇이 다를까?

-> 변수에다가 저장을 안한다.

상수데이터는 변수를 통해 접근 가능했다. 그러나 목데이터는 값 자체이다.

 

 

 

 

 

import React, { useState } from "react";





function MockData(){
	const [data, setData] = useState([]);    // useState 사용
    
    	useEffect(()=>{}, []);     // useEffect 사용
    
    
    return ()...

 

useState 를 이런식으로 사용해주어야 한다.

또한 useEffect 를 사용해주어야 한다.

 

 

 

 

 

 

 

import React, { useState } from "react";





function MockData(){
	const [data, setData] = useState([]);
    
    useEffect(()=>{
    	fetch("/data/storyData.json")      // '/' 로 시작하는건 public 을 의미
        .then((response)=>response.json())   // 응답으로 json 파일 받아온 것
        .then((response)=>{
        	console.log(response)
        }, []);
    
    
    return ()...

 

 

fetch 명령을 통해 데이터를 받아온다.

응답을 받아온 것을 콘솔로그에 찍어보는 코드이다.

 

 

 

 

 

 

import React, { useState } from "react";





function MockData(){
	const [data, setData] = useState([]);
    
    useEffect(()=>{
    	fetch("/data/storyData.json")      // '/' 로 시작하는건 public 을 의미
        .then((response)=>response.json())   // 응답으로 json 파일 받아온 것
        .then((response)=>{
        	setData(response);     // data 변수 변경
        }, []);
    
    
    return ()...

 

이제 setData 를 통해 data 변수에 저장되어 있는 값을 바꿔보는 코드이다.

 

 

 

 

 

 

 

function MockData(){
	const [data, setData] = useState([]);
    
    useEffect(()=>{
    	fetch("/data/storyData.json")      // '/' 로 시작하는건 public 을 의미
        .then((response)=>response.json())   // 응답으로 json 파일 받아온 것
        .then((response)=>{
        	setData(response);
        }, []);
    
    
    return (      // 필요한 곳에 data 변수를 삽입
    <div className="rightSectionStoryContainer">
    	{data.map(story) => {
        	return (
            	<div className="rightSectionStory" key={story.id}>
                	<img alt="user profile" src={story.src} className="rightSectionStoryIcon">
                    <span className="rightSectionStoryId">{story.id}</span>
                    </div>
                   );
          })}
          </div>
           );
     }
                    
                    
export default MockData;

 

return 을 통해 data 변수를 필요한 곳에 넣어준다.

 

 

 

 

 

 

 

 

 

데이터 fetching 및 조건부 렌더링

 

export default function App(){
	const [data, setData] = useState({});     // 초기값: 비어있는 객체
    
    
    useEffect(() => {
    	fetch("/mock.json")  
        	.then((res) => res.json())
            .then((res) => setData(res));   // 응답 받은 값을 data 에 저장
    }, []);
    
    
    return (
    	<div className="App">
        	<h1>Hello useEffect!</h1>
            <h2>조건부 렌더링 연습 문제</h2>
            <ul>
            	{data.users.map((user) => {
                	return <li key={user.id}>{user.username}</li>;
                    })}
             </ul>
          </div>
          
     );
}

 

이 코드에서의 초기값은 비어있는 객체{ } 이다.

초기값 선정하는 것이 중요하다. 왜냐하면 어떤 타입의 데이터가 들어갈지 결정해주는 것이기 때문이다.

 

 

 

근데 지금 이 코드는 오류가 날 것이다. (ul 태그 부분)

useEffect 부분은 랜더링 이후에 실행되는 것이기 때문이다. 

return 이 먼저 시작되고... 그래서 data.user 를 찾고 있는데 useEffect 가 아직 실행 안되었기 때문에 data 는 빈 객체이다. 빈 객체에서 user 라는 프로퍼티를 찾으려고 하니 안되는 것이다.

따라서 undefined 가 출력될 것이다. undefined 에서 map 을 사용하려고 하니 안되는 것이다.

 

 

 

 

 

 

 

 

 

export default function App(){
	const [data, setData] = useState({});     // 초기값: 객체
    
    
    useEffect(() => {
    	fetch("/mock.json")  
        	.then((res) => res.json())
            .then((res) => setData(res));   // 응답 받은 값을 data 에 저장
    }, []);
    
    if (data.users === undefined) return <div>데이터 없음</div>   // 새로고침하면 "데이터없음"이 뜨다가 바로 ui 가 그려진다.
    
    return (
    	<div className="App">
        	<h1>Hello useEffect!</h1>
            <h2>조건부 렌더링 연습 문제</h2>
            <ul>
            	{data.users.map((user) => {
                	return <li key={user.id}>{user.username}</li>;
                    })}
             </ul>
          </div>
          
     );
}

 

먼저

1. 리턴 === 종료로, "데이터 없음" 이 출력된다.

2. useEffect 함수가 실행된다.

3. 데이터가 갖고 와진다.

4. 두번째 리턴이 실행된다. 화면 ui 가 그려진다.

 

 

 

 

 

 

 

useEffect 는 아래처럼 많이 사용한다. 기억해두자.

 

export default function App(){
	const [data, setData] = useState({});     // 초기값: 객체
    
    
    useEffect(() => {
    	fetch("/mock.json")  
        	.then((res) => res.json())
            .then((res) => setData(res));   // 응답 받은 값을 data 에 저장
    }, []);
    
    return (
    	<div className="App">
        	<h1>Hello useEffect!</h1>
            <h2>조건부 렌더링 연습 문제</h2>
            <ul>
            	{data.users && 
                data.users.map((user) => {
                	return <li key={user.id}>{user.username}</li>;
                    })}
             </ul>
          </div>
          
     );
}

 

 

이것은 "단축연산자" 라고 하는데 자세히 알아보겠다!

 

 

 

 

 

 

const condition = true;
condition && console.log('통과!');

 

condition 이 true 이면 뒤엣것이 실행된다.

condition 이 false 이면 condition 이 리턴된다. (즉 condition 이 그대로 나온다)

 

 

 

 

 

const condition = undefined;
condition && console.log('통과!');

 

참고로 undefined 는 null 이다.

그럼 false 이므로 condition이 나온다.

 

 

또한 만약 빈문자열로 초기값을 정해줬다면 처음엔 실행이 안됬다가 (false)

다음부터 실행이 된다.

 

 

 

[ ] 라면 true 이다. 비어있든 안비어있든 true 이다. { } 도 true 이다.

 

 

 

 

 

 

 

 

 

export default function App(){
	const [data, setData] = useState({});     // 초기값: 객체
    
    
    useEffect(() => {
    	fetch("/mock.json")  
        	.then((res) => res.json())
            .then((res) => setData(res));   // 응답 받은 값을 data 에 저장
    }, []);
    
    return (
    	<div className="App">
        	<h1>Hello useEffect!</h1>
            <h2>조건부 렌더링 연습 문제</h2>
            <ul>
            	{data.users && 
                data.users.map((user) => {
                	return <li key={user.id}>{user.username}</li>;
                    })}
             </ul>
          </div>
          
     );
}

 

그래서 처음 랜더링 될때는 undefined 가 되고 false 이므로 앞엣것이 리턴 -> 처음에 undefined 가 나오므로 에러가 뜨지 않는다.

그 다음 useEffect 가 실행 되고 데이터를 받아온다.

그 후 ul 부분의 단축연산자에서 뒤엣것이 실행되서 화면 ui 가 그려진다.

 

 

 

많이 실수하는 것이기 때문에 잘 알아두자.

 

 


단축연산자는 정말 많이 쓰인다. 나는 삼항 연산자를 잘 이용했었는데 단축 연산자가 실무에서 많이 쓰인다고 한다!

 

function Greetin(props){
	const { isLogin, name, point } = props;
    
    return {
    	<div>
        	{ isLogin ? (
            	<div>
                <p>{name} 님 환영합니다!</p>
                    <p>현재 보유중인 포인트는 { point }원입니다.</p>
                </div>
             ) : null }
             </div>
         }
  }

 

위의 코드는 아래와 같이 사용이 가능하다.

 

 

 

function Greetin(props){
	const { isLogin, name, point } = props;
    
    return {
    	<div>
        	{ isLogin && (
            	<div>
                <p>{name} 님 환영합니다!</p>
                    <p>현재 보유중인 포인트는 { point }원입니다.</p>
                </div>
             )}
             </div>
         }
  }

 

 

 

&& 연산자 사용 시 주의해야할 점

1. 변수가 숫자 타입인 경우 0은 false 이다.

2. 변수가 문자열 타입인 경우 빈 문자열 "" 도 false 이다.

 

 

 

 

// 리턴 안
<Comment text='데이터' />
<Comment text='dskfhsdlfhsdf' />
<Comment text='fdf' />
<Comment text='gfgfdgd' />




// js 파일
const COMMENT_DATA = [
{
	text: "데이터",
},
{
	text: "sdfdsfds",
},
{
	text: "dfdf",
},
{
	text: "dgdsgds",
},
]




// 리턴 안은 이렇게 바꿀 수 있다
{COMMENT_DATA.map((comment) => {
	return <COMMENT text={comment.text} />;
    })}

 

 

fetch 함수로 바꾸는 방법도 연습해보자.

 

 

 

 

 

'💎 React' 카테고리의 다른 글

리액트 204 에러  (0) 2021.12.08
장바구니 창 조절  (0) 2021.12.03
리액트 훅, useEffect  (0) 2021.11.25
리액트 댓글 달기  (0) 2021.11.24
props 사용법  (0) 2021.11.22