ReactJS로 영화 웹 서비스 만들기 1

1️⃣

🖥 SETUP - 1

1 - 0. Creating your first React App

$ npx create-react-app movie_app(프로젝트이름)
"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build"
  },

1 - 1. Creating a Github Repository

이때 입력하라는 username 은 내 아이디(spzn02)가 아닌 이름(jina95)

1 - 2. How does React work?

// src/index.js 
ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

// publice/index.html
<div id="root"></div>

// 만약 이 둘중 하나의 이름만 바꾸게 된다면 에러가 뜬다. root를 찾아서 그 안에 app.js 에 내용을 넣어줌 

🖥 SX & PROPS - 2

2 - 0. Creating your first React Component

// src/index.js 
ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);
// 리액트는 하나의 컴포넌트만 랜더링 할 수 있어서, 아래와 같은 경우는 ❌ / App 안에 넣어줘야 한다.
ReactDOM.render(
  <React.StrictMode>
    <App /><Potato />
  </React.StrictMode>,
  document.getElementById("root")
);
// App 안에 이런식으로 넣어주면 작동 ⭕️
import React from 'react';
import Potato from "./Potato";

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

export default App;

2 - 1. Reusable Components with JSX + Props

<Food fav="Kimchi" />
    {/* jsx 방식 */}
import React from 'react';

function Food(props) {
  console.log(props);
  //전달 객체가 많더라도 하나의 props 로 받아올 수 있다.
  // 하나의 오브젝트 형식으로 받아오는데 props.fav / props.papap 등으로 확인할 수 있다
  // 또한 아예 인자값으로 {fav} 를 이용하면 props.fav 를 사용하지 않고 바로 접근 가능 (es6) 
  
  return <h3>I love skarsgard</h3>;
}

function App() {
  return (
    <div>
      <h1>Hello</h1>
      <Food fav="Kimchi" papap={true} something={['1','2','3',true]} />
      {/* jsx 방식 */}
    </div>
  );
}

export default App;

2 - 2. Dynamic Component Generation

import React from 'react';

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

const foodILike = [
  {
    name: "Kimchi",
    image:
      "http://aeriskitchen.com/wp-content/uploads/2008/09/kimchi_bokkeumbap_02-.jpg",
  }, 
];

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

export default App;

2 - 4. Protection with PropTypes

import PropTypes from 'prop-types'

// 얻고 싶은 props에 대한 설명
Food.propTypes = {
  name: PropTypes.string.isRequired,
  picture: PropTypes.string.isRequired,
  rating: PropTypes.number.isRequired,
  // rating을 PropTypes.string.isRequired로 쓰면 콘솔 에러를 확인할 수 있다 => rating은 number이기 때문!
  // string 뿐만아니라, boolean, object 인지 있는지 없는지까지 확인할 수 있다.
  // rating: PropTypes.number 로 적는다면 number or undefined 라는 뜻 (number여야 하지만 필수는 아니라는 뜻) 
  // 근데 만약 위와같이 적고 rating에 string 을 넣는다면 에러가뜬다 (number를 예상했는데 string 을 제공했기 때문)
};

🖥 STATE - 3

3 - 0. Class Components and State

// 기존 src/App.js
function App() {
  return (
    <div>
        // ...
    </div>
  );
}

//아래와 같은 형식으로 바꿔준다.
class App extends React.Component{
    render(){
        return <div>
            // ...
        </div>
    }
}
class App extends React.Component{
  // state 는 object 
  // component 에 data를 넣을 공간이 있고, 그 data는 변한다. ( 바꿀데이터는 state 안에 넣는다.)
  state = {
    count : 0
  }
  add = () => {
    console.log('add');
    
  }
  minus = () => {
    console.log('minus');
    
  }
  render(){
    return (
      <div>
        <h1>I am a class {this.state.count} </h1>
        {/*  onClick={this.add} -> 은 클릭버튼을 눌렀을때만 / onClick={this.add()} -> 즉시실행  */}
        <button onClick={this.add}>Add</button>
        <button onClick={this.minus}>Minus</button>
      </div>
    );
  }
}

3 - 1. All you need to know about State

// onClick={this.add} 함수 👇
add = () => {
    // this.setState({ count: this.state.count + 1 });
    // this.state.count + 1 를 하게 된다면 state에 의존하게 되기 때문에 성능이슈가 발생할 수 있다.
    this.setState(current => ({
        count : current.count + 1
    }));
}

3 - 2. Component Life Cycle

3 - 3. Planning the Movie Component

class App extends React.Component {
  state = {
    isLoading: true,
    movies: [],
  };

  componentDidMount() {
    setTimeout(() => {
      // 딜레이 함수
      this.setState({
        isLoading: false,
        // 만약 기존 state 에 정의되어있지 않은 요소를 추가하는것도 가능하다. (미리 선언해야 하는것은 필수가 아님 ! )
      });
    }, 6000);
  }

  render() {
    const { isLoading } = this.state;
    return <div>{isLoading ? "Loading" : "We are ready"}</div>;
  }
}

export default App;