react

Do it 클론 코딩 영화 평점 웹서비스 - 4장

Feb 14, 2021

4장

4. 슈퍼 똑똑하게 컴포넌트 만들기

4.1 비슷한 컴포넌트 여러 개 만들기

import React from 'react';

function Food({fav}) {
  return <h1> I like {fav}</h1>;
}

function App() {
  return (
    <div>
      <h1>Hello!!!</h1>
      <Food fav="kimchi" />
      <Food fav="오징어" />
      <Food fav="돈까스" />
    </div>
  )
}

export default App;
import React from 'react';

function Food({fav}) {
  return <h1> I like {fav}</h1>;
}

const foodLike = [];

function App() {
  return (
    <div>
      <h1>Hello!!!</h1>
    </div>
  )
}

export default App;
import React from 'react';

function Food({fav}) {
  return <h1> I like {fav}</h1>;
}

const foodLike = [
  {
    name: 'kimchi',
    image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQzvpLBoWT6py96qHadIU8w2FkrfhUI4V06cK7uAC8USybTK2s&usqp=CAc',
  },
  {
    name: 'Hotdog',
    image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQPiH-PuoDAHJFXxjimB4E2jR5Uqv-9fJjayn6N19-Bq83vn8rEOUI2_5hExg&usqp=CAc',
  },
];

function App() {
  return (
    <div>
      <h1>Hello!!!</h1>
    </div>
  )
}

export default App;

4.2 map() 함수로 컴포넌트 많이 만들기

const friends = ["dal", "mark", "lynn", "japan guy"]

friends.map(current => {
    console.log(current); // 여기서 current가 출력되고
    return 0; // 여기서 0을 반환한다.
})

/*
dal
mark
lynn
japan guy
[0, 0, 0, 0]
*/
friends.map(function(friend) {
  return friend + "♥"
})

// ["dal♥", "mark♥", "lynn♥", "japan guy♥"]
import React from 'react';

function Food({ name }) {
  return <h1> I like {name}</h1>;
}

const foodLike = [
  {
    name: 'kimchi',
    image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQzvpLBoWT6py96qHadIU8w2FkrfhUI4V06cK7uAC8USybTK2s&usqp=CAc',
  },
  {
    name: 'Hotdog',
    image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQPiH-PuoDAHJFXxjimB4E2jR5Uqv-9fJjayn6N19-Bq83vn8rEOUI2_5hExg&usqp=CAc',
  },
  {
    name: '김밥',
    image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSzk3v5BkeSeALfIeOLBSx9cMqgAEMSAzN0Qg&usqp=CAU',
  },
];

function App() {
  return (
    <div>
      {foodLike.map(dish=> (<Food name={dish.name}/>))}
    </div> 
    // foodLike 배열에 있는 원소가 하나씩 Food 컴포넌트으 props원소로 넘어간다.
  )
}

export default App;
import React from 'react';

function Food({ name, picture }) {
  return (
    <div>
      <h2>I like {name}</h2>
      <img src={picture} />
    </div>
  );
}

const foodLike = [
  // 생략
];

function App() {
  return (
    <div>
      {foodLike.map(dish=> (<Food name={dish.name} picture={dish.image} />))}
    </div>
  )
}

export default App;

4.3 음식 앱 이리저리 만지고, 고쳐보기

import React from 'react';

function Food({ name, picture }) {
  // 생략 ..
}

const foodLike = [
  // 생략 ..
];

function renderFood(dish) {
  return <Food name={dish.name} picture={dish.image} />;
}

// 화살표 함수로 renderFood 작성
const renderFood = dish => <Food name={dish.name} picture={dish.image} />;

function App() {
  return (
    <div>
      {foodLike.map(renderFood)}
    </div>
  )
}

export default App;
import React from 'react';

function Food({ name, picture }) {
  return (
    <div>
      <h2>I like {name}</h2>
      <img src={picture} alt={name} />
    </div>
  );
}

const foodLike = [
  {
    id: 1,
    name: 'kimchi',
    image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQzvpLBoWT6py96qHadIU8w2FkrfhUI4V06cK7uAC8USybTK2s&usqp=CAc',
  },
  {
    id: 2,
    name: 'Hotdog',
    image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQPiH-PuoDAHJFXxjimB4E2jR5Uqv-9fJjayn6N19-Bq83vn8rEOUI2_5hExg&usqp=CAc',
  },
  {
    id: 3,
    name: '김밥',
    image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSzk3v5BkeSeALfIeOLBSx9cMqgAEMSAzN0Qg&usqp=CAU',
  },
];

function App() {
  return (
    <div>
      {foodLike.map(dish=> (<Food key={dish.id} name={dish.name} picture={dish.image} />))}
    </div>
  )
}

export default App;

4.3 음식 앱에 prop-types 도입하기

import React from 'react';
import PropTypes from 'prop-types';

function Food({ name, picture, rating }) {
  return (
    <div>
      <h2>I like {name}</h2>
      <h4>{rating}/5.0</h4>
      <img src={picture} alt={name} />
    </div>
  );
}

const foodLike = [
  {
    id: 1,
    name: 'kimchi',
    image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQzvpLBoWT6py96qHadIU8w2FkrfhUI4V06cK7uAC8USybTK2s&usqp=CAc',
    rating: 5.0,
  },
  {
    id: 2,
    name: 'Hotdog',
    image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQPiH-PuoDAHJFXxjimB4E2jR5Uqv-9fJjayn6N19-Bq83vn8rEOUI2_5hExg&usqp=CAc',
    rating: 3.2,
  },
  {
    id: 3,
    name: '김밥',
    image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSzk3v5BkeSeALfIeOLBSx9cMqgAEMSAzN0Qg&usqp=CAU',
    rating: 4.9,
  },
];

function App() {
  return (
    <div>
      {foodLike.map(dish=> (<Food key={dish.id} name={dish.name} picture={dish.image} rating={dish.rating} />))}
    </div>
  )
}

Food.propTypes = {
  name: PropTypes.string.isRequired,
  picture: PropTypes.string.isRequired,
  rating: PropTypes.string.isRequired,
}

export default App;