출처 : https://velopert.com/node-js-tutorials
- React
> virual DOM 사용
> Server side Rendering
> 컴포넌트 및 컴포넌트 라이프 사이클
http://webframeworks.kr/tutorials/react/components-and-lifecycle/
> React 컴포넌트 클래스는 대문자로만 작성해야 하면, 소문자로 시작하는 컴포넌트 이름은 모두 HTML element로 간주
> View Only
> IE8 이하 지원 안함
- jsx
> Nested Element : 컴포넌트에서 여러 Element를 렌더링할 때 container element 안에 포함 시켜야 함( <div></div> 라도 감쌓아야 함 )
> JavaScript Expression
JSX안에서 JavaScript를 사용할 때는 {}로 wrapping 해야 함
If Else문은 JSX에서 사용불가 -> 삼항식 ( Condition ? true : false) 이용
> Inline Style
Style 설정시 String을 사용하지 않고 key가 CamelCase인 객체를 사용
> Comments
JSX 안에 주석을 사용할 경우
{/* ... */}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Codelab extends React.Component{ render(){ let text = "Hello asdfasdf"; let st = { backgroundColor: 'aqua' } return( <div style = {st}> {text} </div> ) } } class App extends React.Component{ render(){ return( <Codelab/> ) } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Codelab extends React.Component{ render(){ return( <div> <h1>Hello {this.props.name}</h1> <div>{this.props.children}</div> </div> ) } } class App2 extends React.Component{ render(){ return( <Codelab name= {this.props.name}> {this.props.children} </Codelab> ) } } // Now we can render our application into it ReactDOM.render(<App2 name = "parent"> child </App2>, document.getElementById('root')) | cs |
1 2 3 | Codelab.defaultProps = { name : 'Unknown' }; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Counter extends React.Component { constructor(props) { super(props); this.state = { value: 0 } this.handleClick = this.handleClick.bind(this); } handleClick() { this.setState({ value: this.state.value + 1 }); } render() { return ( <div> <h2>{this.state.value}</h2> <button onClick={this.handleClick}> {/*onClick = {this.handleClick.bind(this)}>*/} Press Me </button> </div> ); } } | cs |
- immutability helper(list 효율적으로 추가, 제거)
https://www.npmjs.com/package/immutability-helper
* 참고 : https://medium.com/@ljs0705/react-state가-불변이어야-하는-이유-ec2bf09c1021
npm install --save react-addons-update
syntax는 몽고db 쿼리 언어를 비슷하게 사용
- component life cycle
> constructor : 생성자, state 정할 수 있음
> componentWillMount : DOM위에 만들어지기 전에 실행
> render : 컴포넌트 렌더링을 담당
> componentDidMount : 컴포넌트가 만들어지고 첫 렌더링을 다 마친 후 실행되는 메소드
이 안에서 다른 JavaScript 프레임워크를 연동하거나 setTimeout, setInterval 및 AJAX처리 등을 넣음
> componentWillReceiveProps : 컴포넌트가 prop을 새로 받았을 때 실행
prop에 따라 state를 업데이트 해야 할 때 사용하면 유용
> shouldComponentUpdate : prop 혹은 state가 변경되었을 때, 리 렌더링을 할지 말지 정하는 메소드, 필요한 비교를 하고 값을 반환하도록 해야 한다.
(true 이면 다시 그리고 false이면 안그린다.)
return nextProps.id !== this.props.id; JSON.stringfy()를 쓰면 field를 편하게 비교 할 수 있음.
> componentWillUpdate : 컴포넌트가 업데이트 되기 전에 실행된다.
이 메소드 안에서는 this.setState()를 사용하지 말아야 한다.
> componentDidUpdate : 컴포넌트가 리렌더링을 마친 후 실행
> componentWillUnmount : 컴포넌트가 DOM에서 사라진 후 실행되는 메소드
- ref(reference)
> DOM요소에 이름을 달아줌
> id와 비슷하지만 DOM요소에도 사용하고 컴포넌트에도 사용할 수 있으며, 해당 컴포넌트가 가지고 있는 메소드 및 변수들을 사용할 수 있음
> 편리하지만 남용은 지양
> 콜백함수 사용하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Hello extends React.Component{ render() { console.log("Render"); return( <div> <input ref={ref=>this.input = ref}> </input> </div> ) } componentDidMount(){ console.log("componentDidMount"); this.input.value = "I used ref to do this."; } } class MainRender extends React.Component{ render(){ return ( <Hello/> ) } } | cs |
* {} 안에 함수를 넣어서 ref를 설정
* arrow function이 사용됨
- 함수형 컴포넌트
- 참고
* state를 따로 생성자 없이 표현 ( Stage-0 )
* 전개 연산자(spread operator)
함수든 json이든 전체를 나타냄
slice로 일부분만 표현 가능하고 삭제 수정 가능
새로운 문법이라 들어있않고 설치해야 함
npm install --save babel-preset-stage-0
webpack.config.js에 추가 시켜야 함(electron은 .babelrc에 preset 추가)
* 람다 함수(이름없는 함수, 동적 함수)를 선언하여 멤버로 넣어둘경우
=> babel plugin 설정 필요
https://babeljs.io/docs/plugins/
- localstorage : HTML5의 로컬 스토리지를 이용하여 데이터를 저장하고 불러올 수 있다.
문자열 데이터만 저장 가능하므로 json을 이용해야 한다.
- import, export, default
- react-router : 페이지 별로 주소 나누기
(v4는 react-router-dom 필요)