const element = <h1 hello</h1>;
const element = <h1>hello, GodDaeHee!~</h1>;
ReactDOM.render(element, document.getElementById('root'));
프로퍼티, props(properties의 줄임말) 이며, 상위 컴포넌트가 하위 컴포넌트로 값을 전달할때 사용 한다
어떻게 사용할까?
props={}
, props=""
두가지 형태를 사용한다.참고할 만한 사용법
프로퍼티의 자료형을 미리 선언할 수 있다.
Main.propTypes = { name: PropTypes.string }
컴포넌트에 props 기본값을 설정하고 싶은 경우 defaultProps를 설정하면 된다.
Main.defaultProps = { name: '디폴트' }
디폴트 설정을 하지 않는 경우 해당 프로퍼티를 필수 프로퍼티로 선언 할 수도 있다.
Main.propTypes = {name: PropTypes.string.isRequired}
Node.js와 그 외 빌드 툴 등으로 구성된 개발환경을 구축하여 리액트로 개발하는 것
런타임 시 브라우저가 JSX를 JS로 자동 변환 하게 해주는 방법
div, span
같은 HTML 태그를 사용할 수 있으며, 개발자가 만든 컴포넌트도 JSX 안에서 작성할 수 있다.대소문자를 구별한다
주입공격을 방지한다
객체를 표현한다
반드시 태그는 닫혀야한다
<div>, <p>, <span>, <a>
같이 짝이 있는 태그의 경우 반드시 닫는 태그가 존재해야 한다. 그렇지 않을 경우 에러가 발생한다.<img/>, <input/>, <br/>
같은 단독 태그(self-closing tag)의 경우에는 반드시 태그를 닫아줘야 한다. 그렇지 않을 경우 에러가 발생한다.렌더링 될 루트 엘리먼트는 하나만 존재해야한다
렌더링 될 리액트 엘리먼트에서 루트 엘리먼트가 두 개 이상일 경우 에러가 발생한다. 때문에 두 개 이상의 루트 엘리먼트가 존재할 경우 반드시 하나의 엘리먼트로 감싸져야 한다.
Virtual DOM에서 컴포넌트 변화를 감지해 낼 때 효율적으로 비교할 수 있도록 컴포넌트 내부는 하나의 DOM 트리 구조로 이루어져야 한다는 규칙 때문에, 리액트에서는 반드시 컴포넌트에 여러 요소가 있다면 반드시 부모 요소로 감싸야 한다.
state는 일반 자바스크립트 객체고, 함수 내부에 선언된 변수처럼 컴포넌트 내부에서 사용된다
일반적으로 컴포넌트 내부에서 변경이 가능한 데이터를 관리할 때 사용한다.
state는 렌더링 되는 결과물에 영향을 미치는 요소 중 하나고, 기본적으로 state에 변경이 생기면 컴포넌트는 리렌더링 된다.
state는 사용자와의 interaction이나 네트워크 변경 이벤트의 결과로 변경된다.
state 값을 변경하기 위해선 state 자체의 값을 변경하는 것이 아니라 setState() 함수를 사용해서 변경해야한다.
리액트로 만들어진 앱을 이루는 최소한의 단위
기존의 웹 프레임워크는 MVC방식으로 분리하여 관리하여 각 요소의 의존성이 높아 재활용이 어렵다는 단점이 있었다. 반면 컴포넌트는 MVC의 뷰를 독립적으로 구성하여 재사용을 할 수 있고 이를 통해 새로운 컴포넌트를 쉽게 만들 수 있다. - 컴포넌트는 데이터(props)를 입력받아 View(state) 상태에 따라 DOM Node를 출력하는 함수. - 컴포넌트 이름은 항상 대문자로 시작하도록 한다. (리액트는 소문자로 시작하는 컴포넌트를 DOM 태그로 취급하기 때문이다.
UI를 재사용 가능한 개별적인 여러 조각으로 나누고, 각 조각을 개별적으로 나누어 코딩한다.
“props”라고 하는 임의의 입력을 받은 후, 화면에 어떻게 표시되는지를 기술하는 React 엘리먼트를 반환한다.
props와 state 등의 특징들은 따로 정리 하도록 한다.
가장 간단하게 컴포넌트를 정의하는 방법은 자바스크립트 함수를 작성하는 것이다.
예시의 export는 구문은 작성한 MyComponent 파일을 다른 파일에서 import 할때 MyComponent로 불러올 수 있도록 정의해 주는 부분이다.
여기서 import시 js, jsx 등 파일 확장자를 생략해도 자동으로 찾을 수 있다. 이는 "웹팩 코드 검색 확장자(webpack module resolution)" 기능 때문이다.
ex) import 'Header'; 의 경우 Header.js > Header.jsx 순서로 확인 한다.
import React from 'react';
function MyComponent(props) {
return <div>Hello, {props.name}</div>;
}
export default MyComponent; //다른 JS파일에서 불러올 수 있도록 내보내주기
컴포넌트 구성 요소, 리액트 생명주기를 모두 포함하고 있다. (리액트 생명주기는 따로 조금더 자세히 알아보도록 한다.)
프로퍼티, state, 생명주기 함수가 필요한 구조의 컴포넌트를 만들 때 사용한다.
예시:
import React from 'react';
class MyComponent extends React.Component {
constructor(props) { // 생성함수
super(props);
}
componentDidMount() { // 상속받은 생명주기 함수
}
render() { // 상속받은 화면 출력 함수, 클래스형 컴포넌트는 render() 필수
return <div>Hello, {this.props.name}</div>;
}
}
export default MyComponent; //다른 JS파일에서 불러올 수 있도록 내보내주기
기존 리액트는 컴포넌트 재사용이 가능한 로직이 추가되지 않았음. state를 사용하기 위해선 class를 사용해야 했는데, Hook은 함수형 컴포넌트에서도 state를 사용하기 위해 새로 만들어진 개념.
함수형 컴포넌트에서 state를 관리할 경우, 기존 클래스형 컴포넌트보다 코드가 더 간결해지는 효과를 볼 수 있다. 함수형 컴포넌트를 사용할 경우, 기능들을 함수 단위로 분리할 수 있다는 이점이 있기 때문.
리액트는 기본적으로 두 가지의 Hook을 제공한다.
useState
useState() 함수는 배열을 리턴하도록 설계되어 있다.
useState 사용 시, 매개변수 2개를 사용하는데, 첫번째는 state의 값을 상징하고, 두번째는 state를 변경하는 함수다.
const [state, setState] = useState()
형태로 사용한다.useEffect
컴포넌트가 처음 나타낼 때, 사라질 때, 그리고 업데이트 될 때 (특정 props가 변경될때) 등 컴포넌트가 렌더링될 때 특정 작업을 실행하는 Hook이다.
useEffect(effect, [, deps]);
형태로 사용되는데, 첫번째 인자(effect)는 함수, 두번째 인자는 배열(deps)이 들어간다.
Hook을 사용하기 위한 규칙:
Hook은 최상위에서만 호출되어야하고, 호출 순서는 항상 같아야 한다.
리액트는 훅이 사용된 순서로 상태값을 구분한다.
조건문이나 반복문을 사용하고 싶다면 useEffect 내부에서 hook을 사용해야 한다.
Hook은 리액트 내부에서만 사용 가능.
리액트 입문 주차동안 같은 조에 배정 받으셨던 분들과 같이 팀과제를 진행했다.
각자 키워드를 선택하고 답변을 가져오는 형식이었는데, 덕분에 기초 개념들에 대한 추가 공부 자료가 생겨서 좋다!
내가 작성한 부분도 도움이 됐으면 좋겠다.