본문 바로가기
패스트캠퍼스/자습

리액트 11~15강 정리

by sunnykim91 2019. 9. 8.

구구단 Hooks로 만들기

<html>

<head>
  <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
  <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
  <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
</head>

<body>
  <div id="root"></div>
  <script type="text/babel">

      //함수 컴포넌트, 함수에서도 state와 ref를 사용하게 해주었음 -> Hooks
      // state가 변경될때마다 gugudan이 다시실행되기때문에 느릴 수 있다. 
      // react는 태그안에 class를 사용할 수 없다 그래서 className을 사용한다.
      // label에 For 속성 또한 label에서 htmlFor라고 사용한다.
      const GuGuDan = () => {

        // 항상 GuGuDan안에 들어와있어야한다.
        const [first, setFirst] = React.useState(Math.ceil(Math.random() * 9));
        // setFirst는 first 전용 setState이다.
        const [second, setSecond] = React.useState(Math.ceil(Math.random() * 9));
        const [value, setValue] = React.useState('');
        const [result, setResult] = React.useState('');
        const inputRef = React.useRef(null);

        const onChangeInput = (e) => {
          setValue(e.target.value);
        };

        const onSubmitForm = (e) => {
          e.preventDefault();
            if (parseInt(value) === first * second) {
              setResult('정답: ' + value);
              // 예전 상태를 사용하려면 함수형으로 써주면 된다.
              // setResult((prevResult) =>{
              //   return '정답: ' + value
              // })
              setFirst(Math.ceil(Math.random() * 9));
              setSecond(Math.ceil(Math.random() * 9));
              setValue('');
              // setState들이 비동기라서 한번에 React에서 알아서 렌더링 해준다.
              inputRef.current.focus();
          } else {
              setResult('떙');
              setValue('');
              inputRef.current.focus();
            }
        }

        return <React.Fragment>
          <div>{first} 곱하기 {second}는?</div>  
          <form onSubmit={onSubmitForm}>
            <input ref={inputRef} onChange={onChangeInput} value={value} />
            <button>입력!</button>
          </form>
          <div id='result'>{result}</div>
        </React.Fragment>
      }
          
  </script>

  <script type="text/babel">
            ReactDOM.render(<GuGuDan />, document.querySelector('#root'));  //화면에다가 위에서 만든 것을 실제로 반영하겠다. 렌더링 하겠다.
        </script>
</body>

</html>

 

 

WebPack사용하기

 

페이스북 컴포넌트 2만개...

수많은 컴포넌트를 만드는데에 script태그를 반복해서 쓰게되면 유지보수가 되지않는다.

 

그래서 나온게 Webpack , 쪼개진 자바스크립트 파일들을 하나의 파일로 합쳐준다.

 

리액트 하려면 노드를 해야한다?

node(자바스크립트 실행기)를 알아야한다가 서버를 알아야한다가 아니라

리액트를 webpack을 돌리기위한 자바스크립트를 실행해야한다.

 

create react app 으로 만들어도 상관없으나, 이해를 잘 할 수 없다.

 

.jsx 로 만드는 이유?

 - jsx문법을 사용하는구나-> 리액트를 사용하구나 를 알 수 있기 때문에 (개발자들이)

 

webpack 커멘드 명령을 이해하지 못할때

1) package json에서 script안에 수정한다.

2) npx webpack

 

babel core : 바벨의 기본적인 것들

babel preset-env : 개발자 브라우저에 맞게 최신문법을 예전문법으로 바꿔줌

babel preset-react : jsx 지원

babel loader : babel이랑 webpack을 연결해줌

 

entry module output

입력받아서 모듈안에 있는 rule을 적용해서 출력한다.

 

// webpack.config.js

const path = require('path'); // node에서 경로 쉽게 조작하기 위함임 , 그냥 외우자!

module.exports = {
  name: 'word-relay-setting', // 크게 필요는 없지만 알아보기 위한 정도
  mode: 'development', // 실서비스에서는 production 으로 바꾼다.
  devtool: 'eval',
  resolve: {
    extensions: ['.js', '.jsx'], // webpack이 알아서 확장자를 찾는다
  },  
  // 제일 중요한 부분
  // 입력
  entry: {
    app: ['./client'],  // client.jsx가 wordRelay를 불러오기때문에 써줄 필요가 없다. 확장자도 생략가능! 대신 resolve써줘야함 위처럼
  },

  module: {
    rules: [{
      test: /\.jsx?/, // 정규표현식 js파일과 jsx파일을 룰을 적용하겠다.
      loader: 'babel-loader',
      options: {
        presets: ['@babel/preset-env', '@babel/preset-react'],
        plugins: ['@babel/plugin-proposal-class-properties'],
      }
    }],
  },

  // 출력
  output: {
    path: path.join(__dirname, 'dist'),  // 현재폴더에 안에 들어있는 dist라는 폴더가 된다. 
                                        // c:desktop/개발자....어디어디 이런거 안치게 해줌
    filename: 'app.js'
  },
}

 

// wordrelay.jsx

const React = require('react');  // 쪼갠파일에서 필요한 패키지나 라이브러리 가져오는 부분
const { Component } = React;

class WordRelay extends Component {
  state = {
    text: 'Hello, webpack',
  };

  render() {
    return <div>{this.state.text}</div>
  }
}

module.exports = WordRelay; // 쪼갠 파일을 밖에서도 사용하게 해줌.
반응형

'패스트캠퍼스 > 자습' 카테고리의 다른 글

poiemaweb 8~9강 복습  (0) 2019.09.10
리액트 16~20강 정리  (0) 2019.09.09
poiemaweb 6~7강 정리  (0) 2019.09.07
리액트 예습 6~10강  (0) 2019.09.05
poiemaweb 4~5강 정리  (0) 2019.09.05