안녕하세요 리액트 시작했는데 뭔가 하나하나씩 포스팅 을 직접 하자니 괜히 게시물만 늘리는거 같고 그래서
한땀한땀 보단 한번씩 정리 해서 포스팅을 하려고합니다.
1. 생성 (컴포넌트)
리액트 컴포넌트는 생성시 파스칼 케이스를 따릅니다.
gdlbutton - X
gdlButton - X
GdlBUtton - O
2. 값 전달
props 는 부모에서 컴포넌트로 값을 전달하기 위한 속성입니다.
기본 세팅은 와 같이 합니다. (props로 전달된 basic이없을 경우는 '베이직'이 사용됩니다.)
static defaultProps= {
basic:'베이직'
}
<GdlButton name={test} />
this.props.test
하지만 props가 너무 많은 경우에 대비해서
예를 들면
props로 name,age,grades, class, email 등이 넘어 오게 되면
this.props.name
this.props.age
this.props.grades
.... 너무 길어집니다.
const {name,age,grades,class,email} = this.props; ( 비 구조화 할당을 사용합시다.)
state 는 컴포넌트 내부에서 이동되는 값입니다.
절대로 this.state.name = "test" 같은 작업은 하지 않습니다.
this.setState({
name : 'test'
});
setState를 사용하셔야 리렌더링이 발생합니다.
ref 는 컴포넌트에 있는 함수를 외부에서 호출할수 있도록 해주는 속성입니다.
// 1. 컴포넌트 객체에 ref를 선언하고 => 를 통해서 this.GdlButton = ref를 생성한다.
// 이와같지 하지 않고 this.GdlButton.button으로 바로 사용시에는 렌더링 전에 값이 undefined 이기때문(this.GdlButton)
<GdlButton ref={ (ref) => this.GdlButton= ref} />
// 2. 만들어진 this.GdlButton 을 이용하여 함수 사용
<button type="button"
onClick={()=> this.GdlButton.buttonsetText("setText")}>Ref Test</button>
class GdlButton extends Component {
// ref를 달기 위한 함수 작성
buttonsetText= (addText) =>{
const{ innerText} = this.button;
this.button.innerText = innerText+addText;
}
render(){
return (
<div
// ref를 달아서 현재 컴포넌트를 리턴
ref={(ref) => {this.button=ref}}>
{/* .... do thing */}
</div>
);
}
}
export default App;
3. 컴포넌트 여러게 생성
내부의 count만큼 버튼을 생성하고 싶은 경우
주의점 ** key 값을 유니크하게 설정 해주어야 합니다. ( 리액트자체 렌더링시 해당 key 값을 통하여서 DOM비교를 하는 알고리즘을 가지고있기 때문에 설정 안할시 warning이 뜨긴하지만 성능 문제가 발생합니다. 키 값이 중복되면 에러가 발생)
Array(count) 로 카운트 만큼 생성 후 .fill을 통해 내부값을 채웁니다. (채워야 map 이 순환)
map을 통하여 채워진 배열만큼 버튼을 생성하여 return 합니다.
사용은 render 함수에서
이와같이 사용합니다.
{ btnList }
4. 컴포넌트 이벤트 전달
이벤트 생성시에는 캐멀케이스(CamelCase)를 따릅니다.
on-click => onClick
onkeypress ==> onKeyPress
클래스 내부에 함수를 선언후 바인딩합니다.
4-1 미리 선언된 함수 바인딩
4-2 생성과 동시에 익명함수 사용
5. 스타일 지정,클래스 지정 및 조건부 렌더링 방법
와 같이 사용하며 주의할점은
background-color = 와 같은 케밥 케이스들은 캐멀케이스로 바뀌어야 한다.
backgroundColor
font-size = > fontSize
border-radius = borderRadius
<div class > </div> 가 아닌 <div className > </div> 으로 class가 아닌 className 을 사용 하여야 한다.
6. 이외
태그는 무조건 닫아야 합니다. /> 로 그래서 처음에 </br>로 엔터 효과를 내려고했으나 오류가 나서
<br/> 로 사용하여야 합니다.
주석은
{ /* */ } 로 사용
propTypes는 props의 타입을 지정할수 있습니다. ( ts 타입스크립트)와 비슷해보이지만
결국 런타임 후에 지정되는 것이고 ts는 런타임전에 알수 있기 떄문에 ts의 하위 호환이라고 봐도 되겠네요
constructor는 컴포넌트를 새로 만들어질때 호출된다. (아직 까진 사용의미를잘 모르겠습니다.)
state는 state = {
basic:'베이직'
}
기존의 state값중 array 가 있을 경우 push 를 해서는 안된다.(타 이벤트 핸들러에서)
push 를 하게되면 기존의 배열에 추가 되어서 더해지는 것이기 때문에 concat 이나 ... spread 연산자 slice를 통해 새로 생성후 합쳐서 새로운 배열을 대입해주어야 한다.
다음 은 리액트 라이프 사이클에 대해서 쓸건데 그전에 spread연산자부터 적고 가야겠네요
'개발일지(Platform & Library) > React' 카테고리의 다른 글
[React] 리액트 기본 스타일 지정 ( Basic CSS in ReactJS ) (0) | 2018.09.13 |
---|---|
[React] 리액트 라이프 사이클 (Life cycle in react.js) (1) | 2018.08.22 |
[React] 시작 전 준비 단계 트러블 슈팅 (Trouble Shooting) (0) | 2018.08.07 |
[React] 시작 전 준비 마지막 및 정리 ( JSX , ReactDOM.render ) (0) | 2018.08.07 |
[React] 시작 전 준비 2단계( 리액트 코드 index.js) (0) | 2018.08.05 |