간단한 예제를 보자.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/npm/danfojs@1.1.2/lib/bundle.min.js"></script>
</head>
<body>
<script>
//danfo is exposed on dfd namespace
s = new dfd.Series([1,2,3,4,5])
s.print()
</script>
</body>
</html>
데이터를 차트 형식으로 시각적으로 표현 가능하다.
예제
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<title>Document</title>
</head>
<body>
<div>
<canvas id="myChart"></canvas>
</div>
<script>
const ctx = document.getElementById('myChart');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
label: '# of Votes',
data: [15, 19, 15, 14, 13, 12],
borderWidth: 1,
backgroundColor: ["red", "green", "blue", "pink", "white", "purple"]
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
</body>
</html>
기본적으로 node.js가 설치된 상황에서 동작한다.
// 디렉토리 my-react-app을 생성 후 그 안에 설치
npx create-react-app my-react-app
// 현재 디렉토리에 그대로 설치
npx create-react-app .
설치를 완료하면 다음과 같이 실행시켜주도록 하자.
npm start
빌드를 통해서 압축된 형태로 보낼 수 있다.
압축되었기에, 부하가 더 낮게 실행시킬 수 있다.
npm run build
빌드된 파일을 실행하려면 다음 명령어를 사용한다.
npx serve -s build
정말 중요한 점은 대문자로 해야한다는 것이다.
소문자로 정의해뒀다가, 고생 꽤나 했다..
react 컴포넌트를 생성시 클래스 형태와 function형태 두가지로 생성 가능하다.
함수형태로 정의하는 것이 더 간단하기에 주로 사용된다.
객체를 찍어내는 생성자라고 생각하면 편하다.
컴포넌트를 생성(호출) 시, props를 통해 값을 전달하고 이를 사용할 수 있다.
// Car 객체를 생성
<Car brand="현대" name="sonata"></Car>
객체를 생성할 때 설정한 속성은 props로 전달되게 된다.
아래 예제를 보자.
위와 아래 둘다 동일하며 ES6를 이용해서 더 짧게 정의했다.
function Car(props) {
return <h1>I am a function {props.brand}</h1>
}
const Car = (props)=> <h1>I am a const in {props.brand}</h1>
function App()
{
<div>
<Car brand="현대"></Car>
</div>
}
export default App;
굳이 props 객체로 받아 접근하지 않고, 생성 시 전달된 값을 그대로 사용할 수 있다.
즉, 구조를 분해해서 받아오는 것이다.
// 기존 props 형태로 받아옴
const Car = (props)=> <h1>I am a const in {props.brand}</h1>
// 구조 분해 할당
function Car_distribute({brand}){
return <h1>I am a 구조분해 할당 {brand}</h1>
}
<div>
<Car brand="현대" name="sonata"></Car>
<Car_distribute brand="현대"></Car_distribute>
</div>
state는 (함수 내에 선언된 변수처럼) 컴포넌트 안에서 관리되는 객체이다.
App.js
의 기본인 function App()
자체가 하나의 컴포넌트 이므로 "컴포넌트 안" 이라고 했지만, 사실 상 소스코드 내 선언된 변수라고 생각해도 무방하다.
컴포넌트 내 값을 변경할 수 있는 변수로 자동적으로 랜더링 된다.
그럼 왜 그냥 변수를 선언해서 쓰지 이런 State를 사용한 방법을 쓸까?
바로 값이 변경되었을 때를 이를 통해 랜더링 되는 React의 특징 때문이다.
즉, State내 정의하는 함수를 실행시켜 값을 변경함으로써 명시적으로 랜더링 시킬 수 있다.
이런식으로 선언된다.
[변수 명, 변경 때 호출할 함수 명] = useState(초기 값)
그 아래 return 부분에는 다음과 같이 정의된다.
저렇게 function() {}
으로 정의해도 되고, () =>
와 같이 ES6 연산자를 사용해도 된다.
약간의 재미를 위해 버튼을 하나 더 추가하고, State에 배열을 넣어 사용했다.
컴포넌트를 하나의 소스코드에 전체를 정의해 두다 보니 APP.js의 메인 소스코드가 너무나 복잡해 보인다.
따라서 다음과 같이 컴포넌트의 코드만 밖으로 따로 빼낼 수 있다.
이때 반드시 따로 빼낸 컴포넌트.js
파일에는 마지막에 export를 해주어야 모듈로 사용이 가능하다.
이제 따로 빼낸 컴포넌트를 import
구문을 통해 다시 APP.js
로 불러오면 된다.
팁✅ 메인이 되는
APP.js
파일에서 따로 빼낸 컴포넌트 클래스의 이름을 드래그 후ctrl
+space
를 통해서 바로 import구문을 정의할 수 있다.
잘 되는 것을 확인할 수 있다.
편하게 콤포넌트들을 배치할 수 있다.