2019-07-16 React Hooks
- 리액트 hooks는 주로 setState를 할 필요가 없을때 함수형으로 사용했다.
- 함수형을 쓰면서 state, ref를 사용할 수 있게 해준게 react hooks이다.
<script type="text/babel">
const GuGuDan = () => {
const [first, setFist] = React.useState(Math.ceil(Math.random()*9));
const [second, setSecond] = React.useState(Math.ceil(Math.random()*9));
const [value, setValue] = React.useState('');
const [result, setResult] = React.useState('');
}
</script>
- 선언과 동시에 초기화를 위와 같은 방식으로 한다.
- React.useState(초기값);
- hooks에서는 useRef라는 것으로 DOM에 접근을 한다.
//Hooks
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<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>
<title>React Hooks</title>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
const GuGuDan = () => {
const [first, setFirst] = React.useState(Math.ceil(Math.random() * 9));
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 onSubmitForm = (e) => {
e.preventDefault();
console.log('submit버튼에 누른값', e.target.value);
if (parseInt(value) === first * second) {
setResult('정답 ' + value);
console.log('value : ', value);
setFirst(Math.ceil(Math.random() * 9));
setSecond(Math.ceil(Math.random() * 9));
setValue('');
inputRef.current.focus();
} else {
setResult('땡');
setValue('');
inputRef.current.focus();
}
};
const onChangeInput = (e) => {
setValue(e.target.value);
};
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>
- this.state가 빠졌다.
- render()을 하면 함수자체가 통째로 다시 실행이 된다. 그래서 느릴수가 있다.
- html속성에서 class를 사용할 수 있는데, 리액트에서는 속성으로 class를 못쓰고 className을 쓴다. label의 for속성도 for문으로 인식할 수 있기때문에 labelFor로 쓴다.
Webpack
- 웹팩을 왜쓸까?
- html만 있어도 JS를 쓸 수 있는데, 실제로는 컴포넌트가 엄청나게 많다.
- 컴포넌트마다 스크립트를 하나씩 만들면, 하나의 html파일에 코드만 몇백줄 몇천줄이 되고 유지보수에 힘들다.
- 페이스북은 컴포넌트가 몇개일까??. 예전에 2만개였다.
- webpack을 통해 여러개의 js파일을 하나의 js파일로 합쳐준다. babel도 적용시키고. 여러가지로 유용하다.
- webpack을 하려면 Nodejs를 알아야한다. node는 js실행기다. 리액트를 할때 노드를 알아야하는것은 서버를 안다보다는 실행기를 이해를 해야한다.
npm i -D webpack webpack-cli
- -D는 개발할때는 쓴다는 의미
- package.json에 dependencies는 실제 서비스에 쓰이는것들, devDependencies는 개발에서만 쓰이는것들
//webpack.config.js
//client.jsx
const React = require('react');
const ReactDom = require('react-dom');
- createReactApp도 굉장히 편리하지만 직접해봐야한다.
const React = require('react');
const { Component } = React;
class WordReply extends Component {
state = {
}
render() {
return
}
}
module.exports = WordReply;
- class분리를 할때 위와 같은 방법으로 쪼갠다.
- module.export = name을 하면 외부에서 불러올 수 있다.
- html sciprt src에서는 js파일을 하나만 인식을 한다. 만약에 2만개면???… 그래서 웹팩을 사용한다.
- 웹팩은 webpack.config.js로 모든게 돌아간다.
const path = require('path');
module.exports = {
name: 'word-reply-setting', // 불필요
mode: 'development', // 실서비스 : production
devtool: 'eval',
resolve: {
extensions: ['.js', '.jsx']
},
// entry : 입력, output : 출력. enrty와 output이 가장중요하다.
entry: {
app: ['./client'],
},
output: {
path: path.join(__dirname, 'dist'), // path.join하면 경로를 합쳐준다. __dirname현재 폴더경
filename: "app.js"
} // dist에 app.js라는 파일이 생긴다.
}
- entry app : []에 합치고 싶은 파일들을 넣는다.
- 콘솔에 webpack을 치면 된다.
- client.jsx에서 WordReply.jsx를 불러오고 있는데, 웹팩이 알아서 다 파악을 한다. 안적어도 된다.
- resolve를 사용하면 app에 있는 ./client.jsx, client.js등을 찾는다.
$webpack
- 미리 명령어로 등록을 해야 사용할 수 있다.
- 2가지 방법. 명령어로 등록을 하거나. package.json script에 적는다.
- npm run dev를 한다.
Written on July 15, 2019