reactjs 가이드
React.js guide
+++
Hook의 개요
import React, {useState} from 'react';
function Example(){
//"count"라는 새로운 상태 값을 정의합니다.
const [count,setCount] = useState(0);
return(
<div>
<p>You clicked {count} times</p>
<button onClick={()=>setCount(count+1)}>
Click me
</button>
</div>
);
}
여기서 useState가 바로 Hook 이다.
useState는 현재의 state 값과 이 값을 업데이트하는 함수를 쌍으로 제공합니다. 우리는 이 함수를 이벤트 핸들러나 다른 곳에서 호출할 수 있습니다. 이것은 class 의 this.setState 와 거의 유사하지만, 이전 state와 새로운 state 를 합치지 않는다는 차이점이 있습니다.
하나의 컴포넌트 내에서 State Hook 을 여러 개 사용할 수도 있습니다.
Hook은 함수 컴포넌트에서 React state 와 생명주기 기능을 연동할 수 있게 해주는 함수입니다. Hook은 class 안에서는 동작하지 않습니다. 대신 class 없이 React를 사용할 수 있게 해주는 것입니다.
class Example extends React.Component{
constructor(props){
super(props);
this.state={
count=0
};
}
render(){
return (
);
}
}
const Example = (props) =>{
return <div />;
}
function Example(props){
return <div />;
}
Hook은 React state를 함수 안에서 사용할 수 있게 해준다.
import React, {useState} from 'react';
function Example(){
const [count, setCount] = useState(0);
}
##React-router-dom
+++
props
+++
컴포넌트에서 사용할 데이터중 변동되지 않는 데이터를 다룰 때 사용됩니다.
parent 컴포넌트에서 child컴포넌트로 데이터를 전할 때, props가 사용된다.
render() 메소드의 내부에 안에 {this.props.propsName} 형식으로 넣고, 컴포넌트를 사용할 때, < > 괄호 안에 propsName =”value” 를 넣어 값을 설정한다.
props값을 임의로 지정해주지 않았을 때, 사용할 기본값을 설정하는 방법
기본값을 설정 할 땐, 컴포넌트 클래스 하단에
className.defaultProps = { propName: value };
State
+++
https://velopert.com/921
컴포넌트에서 유동적인 데이터를 다룰 때, state를 사용한다. React.js 어플리케이션을 만들 땐, state를 사용하는 컴포넌트의 갯수를 최소화하는 것을 노력해야한다.
예를들어, 10개의 컴포넌트에서 유동적인 데이터를 사용하게 될 땐, 각 데이터에 state를 사용할 게 아니라, props를 사용하고 10개의 컴포넌트를 포함시키는 container컴포넌트를 사용하는 것이 효율적입니다.
초기값 설정 때는, constructor 메소드에서 this.state= {} 를 통하여 설정한다.
렌더링할 때는, this.state.stateName 을 사용한다.
Higher-order Component ( HOC )
+++
코드를 작성하다보면, 자주 반복해서 작성하게 되는 코드들이 있다. 우리는 주로 그러한 것들을 함수화하여 재사용하고 한다.
리액트 컴포넌트를 작성하게 될 때 반복될 수 있는 코드들은 HOC를 만들어서 해결해줄 수 있다.
HOC는 하나의 함수인데, 함수를 통하여 컴포넌트에 우리가 준비한 특정 기능을 부여한다.
리액트에서 컴포넌트를 만들 때 가장 많이 사용되는 패턴은 컴포지션패턴이다.
HOC는 자바스크립트의 HOC에서 Function대신 Component를 리턴하는 것이다. 즉, HOC는 리액트 컴포넌트를 인자로 받아서 새로운 리액트 컴포넌트를 리턴하는 함수이다.
네이밍
보통 HOC를 통해 새로운 prop을 주입할 때, 많이 사용하는 규칙은 with 로 시작하여 네이밍하는게 좋다. 이렇게 하면 실제로 HOC가 사용되는 컴포넌트에서 prop을 확인할 때, 이 prop이 어디에서 왔는지 명확히 알 수 있기 때문이다.
render 메소드에 HOC를 사용하면 안된다
매번 render메소드가 실행될 때마다 Enhanced Component가 새로 만들어진다.
HOC를 만드는 방법에는 Class 기반 컴포넌트와 Function기반 컴포넌트를 리턴가능하다.
export default withHOC(AnyComponent);
example
const withLoading = (WrappedComponent) => (props) =>
props.isLoading
? <div> Loading ... </div>
: <WrappedComponent { ... props} />
->usage
export default withLoading(TodoList);
Context
+++
일반적인 React 어플리케이션에서 데이터는 위에서 아래로 props를 통해 전달되지만, 애플리케이션 안의 여러 컴포턴트들에 전해줘야하는 props의 경우 이 과정이 번거로울 수 있습니다. context를 이용하면, 트리 단계마다 명시적으로 props를 넘겨주지 않아도 많은 컴포넌트가 이러한 값을 공유하도록 할 수 있습니다.
context는 React 컴포넌트 트리 안에서 전역적이라고 볼 수 있는 데이터를 공유할 수 있도록 고안된 방법이다.
class App extends React.Component {
render() {
return <Toolbar theme="dark" />;
}
}
function Toolbar(props) {
// Toolbar 컴포넌트는 불필요한 테마 prop를 받아서
// ThemeButton에 전달해야 합니다.
// 앱 안의 모든 버튼이 테마를 알아야 한다면
// 이 정보를 일일이 넘기는 과정은 매우 곤혹스러울 수 있습니다.
return (
<div>
<ThemedButton theme={props.theme} />
</div>
);
}
class ThemedButton extends React.Component {
render() {
return <Button theme={this.props.theme} />;
}
}
context를 사용하면 중간에 있는 엘리먼트들에게 props를 넘겨주지 않아도 됩니다.
// context를 사용하면 모든 컴포넌트를 일일이 통하지 않고도
// 원하는 값을 컴포넌트 트리 깊숙한 곳까지 보낼 수 있습니다.
// light를 기본값으로 하는 테마 context를 만들어 봅시다.
const ThemeContext = React.createContext('light');
class App extends React.Component {
render() {
// Provider를 이용해 하위 트리에 테마 값을 보내줍니다.
// 아무리 깊숙히 있어도, 모든 컴포넌트가 이 값을 읽을 수 있습니다.
// 아래 예시에서는 dark를 현재 선택된 테마 값으로 보내고 있습니다.
return (
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}
}
// 이젠 중간에 있는 컴포넌트가 일일이 테마를 넘겨줄 필요가 없습니다.
function Toolbar(props) {
return (
<div>
<ThemedButton />
</div>
);
}
class ThemedButton extends React.Component {
// 현재 선택된 테마 값을 읽기 위해 contextType을 지정합니다.
// React는 가장 가까이 있는 테마 Provider를 찾아 그 값을 사용할 것입니다.
// 이 예시에서 현재 선택된 테마는 dark입니다.
static contextType = ThemeContext;
render() {
return <Button theme={this.context} />;
}
}
Context.Consumer
MyContextd Provide 의 Value 의 변경 사항을 구독하며, Context에서 가장 가까운 Provider 의 Value를 참조한다.
Render Props
+++
React 컴포넌트 간에 코드를 공유하기 위해 함수 props를 이용하는 간단한 테크닉입니다.
render prop은 무엇을 렌더링할지 컴포넌트에 알려주는 함수입니다.
대부분의 higher-order-components에 render props pattern 을 이식할 수 있습니다.
funciton withMouse (Component){
return class extends React.Component{
render(){
return(
<Mouse render={mouse => (
<Component {...this.props} mouse={mouse}/>
)}/>
)
}
}
}
withRouter
+++
다른 것들은 무조건 Link 를 사용해서 해당 component를 렌더링 하지만, withRouter 를 사용하면, 굳이 Link 없이도 화면 렌더링이 가능해짐.
import React from 'react';
import { withRouter } from 'react-router-dom';
function WithRouterSample({ location, match, history }) {
return (
<div>
<h4>location</h4>
<textarea value={JSON.stringify(location, null, 2)} readOnly></textarea>
<h4>match</h4>
<textarea value={JSON.stringify(match, null, 2)} readOnly></textarea>
<button onClick={() => history.push('/')}>홈으로</button>
</div>
);
}
export default withRouter(WithRouterSample);
잘 출력됨.
…
+++
…은 자바스크립트의 전개연산자입니다. 기존의 객체안에 있는 내용을 해당 위치에다가 풀어준다는 의미다. 그 다음에, 우리가 설정하고 싶은 값을 또 넣어주면 해당 값을 덮어쓰게 된다.
Redux
+++