const element = <h1> Hello, world!</h1>;
위와 같은 코드를 예로 들 수 있다.
JSX 에서는 JavaScript 와 약간 다른 속성이름을 사용하는데 그 중 예를 들자면 className
이 있다. (JavsScript 에서는 class)
const element = <h1> Hello, world </h1>;
ReactDOM.render(element, document.getElementById('root'));
Initialization - 초기화 / Mount - React에서 DOM 혹은 페이지에 올라갈 때 / Update - props나 state가 변경되었을 때 / Unmount - React에서 DOM 혹은 페이지에 내려갈 때
Props - 컴포넌트끼리 값을 전달하는 수단으로, 부모 컴포넌트가 하위 컴포넌트에게 주는 값이다. props는 사용하는 것은 가능하나 props 자체를 하위 컴포넌트가 변경 시키는 행위는 할 수 없다.
State - 각 컴포넌트가 가지고 있는 개별적인 상태값이다. 클래스형 컴포넌트를 작성할때는 해당 클래스 내부 맨 위쪽에 작성하는 것이 일반적이며 state는 객체이다.
DOM(Document Object Model) - HTML 단위 하나하나를 객체로 생각한 모델(document, html, body, div, ul ...)
Ref - 리액트에서 DOM에 이름을 다는 방법
ex) <input ref={(ref) => this.inputName=ref}
function Welcome(props){
return <h1> Hello, {props.name} </h1>;
}
class Welcome extends React.Component{
render(){
return <h1> Hello, {this.props.name} </h1>;
}
}
function sum(a, b){
return a + b;
} // 이런 함수들을 순수함수라고 호칭한다. 입력값을 바꾸려 하지 않고 항상 동일한 입력값에 대해 동일한 결과를 반환하기 때문이다.
function withdraw(account, amount){
account.total -= amount;
} // 이런 함수들은 순수함수가 아니다. 자신의 입력값을 변경하기 때문이다.
큰 컴포넌트는 여러 개의 작은 컴포넌트로 나눠 재사용하기 용이하게 만드는 것이 좋다.
<button onclick="activateLasers()">
Activate Lasers
</button>
<button onClick={activateLasers}>
Activate Lasers
</button>
function ActionLink(){
function handleClick(event){
event.preventDefault(); // 현재 이벤트의 기본 동작을 중지하는 것이다.
console.log('The link was clicked');
}
return (
<a href = "#" onClick={handleClick}>
Click me
</a>
);
}
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) => {
<li>{number}</li>
});
Key는 React가 어떤 항목을 변경, 추가 또는 삭제할지 식별하는 것을 돕는다. Key는 엘리먼트에 안정적인 고유성을 부여하기 위해 배열 내부의 엘리먼트에 지정해야 한다.
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) => {
<li key={number.toString()}>
{number}
</li>
});
input
, textarea
, select
와 같은 폼 엘리먼트는 일방적으로 사용자의 입력을 기반으로 자신의 state를 관리하고 업데이트한다. React에서는 변경할 수 있는 state가 일반적으로 컴포넌트의 state에 유지되며 setState()
에 의해 업데이트된다.
(자세한 내용은 React 공식 문서 참고)
const [state, setState] = useState(initialState); // state -> 현재 상태, setState -> 상태 설정 함수
function App(){
// useState를 사용하여 count라는 state를 생성하여 초기값은 0으로 지정
const [count, setCount] = useState(0);
const add = () => {setCount(count + 1);}; // setCount로 state값 변경
const min = () => {setCount(count - 1);};
const addDouble = () => {
setCount(prevState => prevState + 1);
setCount(prevState => prevState + 1);
} // 이전 상태값을 매개변수로 받지 않고 setCount(count + 1)을 두번 실행하는 방식으로 하면 상태값 변경 함수의 비동기식 동작으로 인해 1만 증가한다.
return(
<div>
<p>Current COUNT: {count}</p>
<button onClick={add}>+</button>
<button onClick={min}>-</button>
</div>
);
}
useEffect(() => {
console.log('첫 렌더링만 실행~!!');
},[]); // useEffect를 마운트될 때만 실행하고 싶을 경우에는 두번째 파라미터에 비어있는 배열을 넣어주면 된다. (처음에만 발생)
function App(){
const [count, setCount] = useState(0);
const add = () => {setCount(count + 1);}
const min = () => {setCount(count - 1);}
useEffect(() => {
console.log('렌더링할 때마다 실행~!!');
});
return(
<div>
<p>Current COUNT: {count}</p>
<button onClick={add}>+</button>
<button onClick={min}>-</button>
</div>
);
}
export default App;
이벤트를 발생했을 때 event.target.value로 해당 값을 가져오는 방법을 useRef를 사용하여 값을 가져올 수 있다.
function App(){
const textRef = useRef();
const changeEvent = (event) => {
let eventValue = event.target.value;
let refValue = textRef.current.value;
console.log(eventValue, refValue);
}
return (
<div>
<input type="text" ref={textRef} onChange={changeEvent}></input>
</div>
);
}
export default App;
import React, {useState, useMemo} from 'react';
export default function App() {
const [number, setNumber] = useState(1);
const memoNumber = useMemo(()=> number * 100, [number]);
return (
<div>
<div style={{boarder : '1px dotted skyblue'}}>
<h2>useMemo</h2>
<p>
useMemo 훅은 계산량이 많은 함수의 반환값을 재활용하는 용도로 사용
</p>
<p>
{`memoNumber : ${memoNumber}`}
</p>
</div>
</div>
);
}
import React, { useState, useEffect, useCallback } from "react"
function Profile({ userId }) {
const [user, setUser] = useState(null)
const fetchUser = useCallback(
() =>
fetch(`https://your-api.com/users/${userId}`)
.then((response) => response.json())
.then(({ user }) => user),
[userId]
)
useEffect(() => {
fetchUser().then((user) => setUser(user))
}, [fetchUser])
// ...
}
const value = useContext(MyContext);
(state, action) => newState
의 형태로 reducer를 받고 dispatch
메소드와 짝의 형태로 현재 state를 반환한다.const [state, dispatch] = useReducer(reducer, initialArg, init);
리액트에서 컴포넌트를 만들려면 React.Component 클래스를 상속하고, 데이터는 꼭 this.state에 담아두어야 하며 render() 함수에 JSX 문법을 이용하여 데이터를 어떻게 UI로 표기할건지 정의를 하여 만들어야한다. (리액트 규칙)
state에 있는 상태를 변경하기 위해서는 setState() 를 사용해야 한다. 리액트의 state를 직접적으로 수정하는 것은 좋지 않으므로 꼭 불변성을 유지하는 것이 좋다.
<공부하려고 여기저기서 모아온 React 정리>
출처 - 리액트 공식문서 // https://velog.io/@vvvvwvvvv // https://velog.io/@edie_ko // https://chanhuiseok.github.io // https://medium.com/wasd // https://hokeydokey.tistory.com/53 // https://www.daleseo.com/react-hooks-use-callback/ // https://velog.io/@katanazero86/react-hooks