๋ฆฌ์กํธ์์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ๋ ๋๋งํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ๋จ์๋ก React.Component๋ฅผ ์์ํ๋ ํด๋์ค ํํ์ ์ปดํฌ๋ํธ์ ํจ์ ํํ์ ์ปดํฌ๋ํธ ๋๊ฐ์ง ํํ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ชฉ์ ์ ๋ฐ๋ผ ๊ตฌ๋ถํด์ ์ฌ์ฉํ๋ค.
๋ฆฌ์กํธ๋ ์์ ๋จ์๋ถํฐ ํฐ ๋จ์์ ์ปดํฌ๋ํธ์ ์กฐํฉ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐํ๊ณ ๊ฐ๊ฐ์ ์ ์ ํ ์กฐํฉํ์ฌ ํ๋์ ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ ํํ๋ก ๊ฐ๋ฐํ๋ค.
๋ฆฌ์กํธ์์ ๋ ๋๋ง์ ํ ๋ ํ๋จํ๋ ๋ฐฉ๋ฒ์ state๊ฐ ๋ณ๊ฒฝ๋์์ ๋์ธ๋ฐ ๋ณ๊ฒฝ ์ /ํ state๋ฅผ ์๋ก ๋น๊ตํ ๋ ๋ณต์ก๋๊ฐ ๋์ ๊ฐ์ฒด์ ๊ฒฝ์ฐ ์์ ํ๋กํผํฐ๊น์ง ๋น๊ตํ๋ ๊ฒ๋ณด๋ค ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก state์ ๋ ํผ๋ฐ์ค๊ฐ ๋ณ๊ฒฝ ๋์์ ๋ ๋ณ๊ฒฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ๋ ๋๋งํ๋ค.
๊ธฐ์กด state ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋๋ผ ๊ธฐ์กด state ๊ฐ์ ๋ฐํ์ผ๋ก ๋ณ๊ฒฝ๋์ด ์๋ก ์์ฑ๋ ๊ฐ์ฒด์ ๋ ํผ๋ฐ์ค๋ฅผ setState ๋ฉ์๋๋ฅผ ํตํ์ฌ ๋ณ๊ฒฝํ๋๋ฐ ์ด๊ฒ์ ๋ถ๋ณ์ฑ์ ์ฐ์งํ๋ค๊ณ ํํํ๋ค.
//์ฌ์ดํธ์์ nodejs ์ค์น
node -v //ํ์ธ
//npx ์ค์น
npm install npx -g
//๋ฆฌ์กํธ ์ฑ ์์ฑ
npx create-react-app movie_app
readme.md ์์ ๋ด์ฉ์ ์ง์๋ ๋๋ค.
yarn.lock, logo.svg, serviceworker, index.css, app.test.js, app.css๋ ์ญ์ ํด๋๋๋ค.
//index.js์์ ๋ค์์ ์ญ์ ๊ฐ๋ฅํ๋ค.
import './index.css';
import * as serviceWorker from './serviceWorker';
//React.DOM ์๋์ ๋ชจ๋ ์ค ์ญ์ ๊ฐ๋ฅ
//app.js์์ ์ญ์
import logo from './logo.svg';
import './App.css';
//๋ค์์ฒ๋ผ empty div๋ง ๋จ๊ฒจ๋๊ณ ์ญ์
import React from 'react';
function App() {
return <div className="App" />;
}
export default App;
html์ ๋ฐํํ๋ ํจ์๋ก ๋ฐ๋ณตํด์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ html์ฒ๋ผ ์์ฑํ๋ ค๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค. ์ด๋ฌํ javascript์ html์ฌ์ด์ ์กฐํฉ์ jsx๋ผ๊ณ ํ๋ค.
src ํด๋ ์์ jsํ์ผ์ ๋ง๋ค์ด ์ปดํฌ๋ํธ๋ฅผ ์์ํ๊ณ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ํญ์ ํด๋ ์์์ react๋ฅผ importํ์ฌ ์ฌ์ฉํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฆฌ์กํธ๋ jsx๊ฐ ์๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ดํดํ์ง ๋ชปํ๋ค.
๋ฆฌ์กํธ ์ดํ๋ฆฌ์ผ์ด์ ์ ํ๋์ ์ปดํฌ๋ํธ๋ง์ ๋ ๋๋ง ํด์ผํ๋ค.(์ด๊ธฐ์ ํ ์ app.js๋ฅผ ๋ ๋๋งํ๊ณ ์์ผ๋ฏ๋ก ์๋ ๋ง๋ค์ด์ ธ์๋ app.js ํ์ผ ์์ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ importํ์ฌ ์ฌ์ฉํ๋ค.)
๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ ํํํ ์ผ๋ฐ html๋ก ๋ง๋ ๋ค.
์ปดํฌ๋ํธ์ ์ ๋ณด๋ฅผ ๋ณด๋ผ ์ ์๋ค.
import React from "react";
function Food(props){
console.log(props.name) // kimchi
return <h1>I like Potato</h1>;
}
function App() {
return (
<div>
<h1>Hello</h1>
<Food name = "kimchi" />
</div>
)
}
food component์ kimchi๋ผ๋ value๋ก prop(property) name์ ์ค๋ค.
string, boolean, array, number, true๋ก ๋ค์ํ๊ฒ ๊ฐ๋ฅํ๋ค.
๋๊ตฐ๊ฐ๊ฐ food component๋ก ์ ๋ณด๋ฅผ ๋ณด๋ด๋ ค๊ณ ํ๋ฉด react๋ ์ด ๋ชจ๋ ์์ฑ์ ๊ฐ์ ธ์ food function component์ ์ธ์๋ก ๋ฃ๋๋ค.
function Food({name, picture}){
console.log(props.name) // kimchi
return <h1>I like {name}</h1>;
}
props์ ๋ชจ๋ object๋ฅผ ์ด์ด์ ์์ฑ์ ๊บผ๋ผ ์ ์๋ค.
jsx + props์ ํ์ผ๋ก ์ปดํฌ๋ํธ์ ์ ๋ณด๋ฅผ ๋ฐ์ ์ฌ์ฌ์ฉํ ์ ์๋ค.
jsx = HTML + JavaScript
์ปดํฌ๋ํธ๋ ๋๋ฌธ์๋ก ์์ํด์ผํ๋ฉฐ, props๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ณด๋ฅผ ๋ณด๋ผ ์ ์๋ค.
function Food({name, picture}){
return <div>
<h2>I like {name}</h2>
<:img src={picture} />
</div>;
}
const foodILike = [
{
name : "kimchi",
image : "http://aeriskitchen.com..."
},
{
name : "samgyepsal",
image : "http://aeriskitchen.com..."
},
{
name : "bibimbap",
image : "http://aeriskitchen.com..."
},
{
name : "donkasu",
image : "http://aeriskitchen.com..."
},
{
name : "kimbap",
image : "http://aeriskitchen.com..."
}
];
function App() {
return (
<div>
{foodILike.map(dish => <Food name = {dish.name} picture={dish.image} />)}
)
}
const friends = ["dal", "mark", "lynn"];
friends.map(current => {
console.log(current);
return 0
})
map : array์ ๊ฐ ์์ดํ ์์ ํจ์๋ฅผ ์คํํ๋ array๋ฅผ ๊ฐ์ง๋๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ด๋ฉฐ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๋ array๋ฅผ ์ค๋ค. (array๋ก๋ถํฐ array๋ฅผ ์ค๋ค.)
map์ function์ ์ทจํด์ ๊ทธ function์ array์ ๊ฐ item์ ์ ์ฉํ๋ค.
function renderFood(dish) {
console.log(dish);
return <Food name={dish.name} picture={dish.image} / >
}
function App() {
return (
<div>{foodILike.map(renderFood)}</div>
)
}
const foodILike = [
{
id : 1,
name : "kimchi",
image : "http://aeriskitchen.com..."
},
{
id : 2,
name : "samgyepsal",
image : "http://aeriskitchen.com..."
}
];
function Food({name, picture}){
return <div>
<h2>I like {name}</h2>
<img src={picture} alt={name}/>
</div>;
}
function App() {
return (
<div>
{foodILike.map(dish =>(
<Food key={dish.id} name = {dish.name} picture={dish.image} />))}
)
}
key prop์ ํจ์๋ก ์ ๋ฌ๋์ง ์์ผ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก react๋ด๋ถ์์ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์ํ๋ props๊ฐ ์ฐ๋ฆฌ๊ฐ ๊ฐ๊ณ ์๋ props ์ธ์ง ์ฒดํฌํ๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
// ์ ๋ฌ๋ฐ์ props๊ฐ ๋ด๊ฐ ์ํ๋ props์ธ์ง ํ์ธํ๋ค.
npm i prop-types
import PropTypes from "prop-types";
function Food({name, picture, rating}){
return <div>
<h2>I like {name}</h2>
<h4>{rating}/5.0</h4>
<img src={picture} alt={name}/>
</div>;
}
Food.propTypes = {
name: PropTypes.string.isRequired,
picture: PropTypes.string.isRequired,
rating: PropTypes.number
}
const foodILike = [
{
id : 1,
name : "kimchi",
image : "http://aeriskitchen.com...",
rating : 5
},
{
id : 2,
name : "samgyepsal",
image : "http://aeriskitchen.com...",
rating : 4.9
}
];
function App() {
return (
<div>
{foodILike.map(dish =>(
<Food
key={dish.id}
name = {dish.name}
picture={dish.image}
rating = {dish.rating}
/>))}
)
}
//APP ์ React component
class App extend React.Compponent{
state = {
count: 0
};
add = () => {
console.log("add");
//this.state.count = 1; ์ด๋ ๊ฒ ์ง์ state๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
this.setState({count: this.state.count+1});// ์ถ์ฒํ์ง ์๋ ๋ฐฉ๋ฒ
//state๋ฅผ setํ ๋ react์์ ์ธ๋ถ์ ์ํ์ ์์กดํ์ง ์๋๋ก ํ๋ค.
this.setState(current => ({count : current.count +1}));
};
minums =() => {
console.log("minus");
this.setState({count: this.state.count-1})
};
render(){
return(
<div>
<h1>The number is: {this.state.count}</h1>
<button onClick={this.add}>Add</button>
<button onClick={this.minus}>Minus</button>
</div>
);
}
}
React component๋ ๋ง์ ๊ฒ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๊ทธ์ค ํ๋๊ฐ state์ด๋ค. ๋งค๋ฒ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋๋ง๋ค ๋ชจ๋ ๊ฒ์ ๊ตฌํํ์ง ์๊ธฐ ์ํด extend ํ๋ค.
react class component์์ extendํ์ฌ App component๋ฅผ ์ฌ์ฉํ๋ค.(App component๋ React component)
class react component๋ ํจ์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ return ์ ๊ฐ๊ณ ์์ง ์๋ค. render method๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ react component์์ ํ์ฅํ๊ธฐ ๋๋ฌธ์ app component ์์ ์๋ค.
Function component๋ ํจ์์ด๋ฉฐ ๋ฌด์ธ๊ฐ๋ฅผ return ํ๊ณ screen์ ํ์๋๋ค. class component๋ class ์ด์ง๋ง react component๋ก๋ถํฐ ํ์ฅ๋๋ฉฐ screen์ ํ์๋๋ค. ๊ทธ๋ฆฌ๊ณ react๋ ์๋์ ์ผ๋ก ๋ชจ๋ class component์ render method๋ฅผ ์คํํ๋ค.
state๋ object์ด๋ฉฐ component์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ๊ณต๊ฐ์ด ์๊ณ ์ด ๋ฐ์ดํฐ๋ ๋ณํ๋ค.
class์ด๊ธฐ ๋๋ฌธ์ this.state.count๋ก ์ฌ์ฉ
๋งค๋ฒ state์ ์ํ๋ฅผ ๋ณ๊ฒฝํ ๋ react๊ฐ render function์ ํธ์ถํด์ ๋ฐ๊ฟ์ฃผ๊ธธ ์ํ๋ค๋ฉด setState function์ ์ฌ์ฉํ๋ค.
state๋ object์ด๊ธฐ ๋๋ฌธ์ setState๋ ์๋ก์ด state๋ฅผ ๋ฐ์์ผํ๋ค.
setState๋ฅผ ํธ์ถํ๋ฉด state๋ฅผ refreshํ๋ฉฐ ์๋ก์ด state์ ํจ๊ป render function์ ํธ์ถํ๋ค.
class App extend React.Compponent{
constructor(props){
super(props);
console.log("hello");
}
state = {
count: 0
};
add = () => {
console.log("add");
//this.state.count = 1; ์ด๋ ๊ฒ ์ง์ state๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
this.setState({count: this.state.count+1});// ์ถ์ฒํ์ง ์๋ ๋ฐฉ๋ฒ
//state๋ฅผ setํ ๋ react์์ ์ธ๋ถ์ ์ํ์ ์์กดํ์ง ์๋๋ก ํ๋ค.
this.setState(current => ({count : current.count +1}));
};
minums =() => {
console.log("minus");
this.setState({count: this.state.count-1})
};
componentDidMount() {
console.log("component rendered");
}
componentDidUpdate() {
console.lof("i just updated");
}
render(){
console.log("render")
return(
<div>
<h1>The number is: {this.state.count}</h1>
<button onClick={this.add}>Add</button>
<button onClick={this.minus}>Minus</button>
</div>
);
}
}
-> hello
render
static getDerivedStateFromProps()
render()
componentDidMount() : component๊ฐ ์ฒ์ render ๋๊ฒ์ ์๋ ค์ค๋ค.
setState๋ฅผ ํธ์ถํ ๋ ๋ง๋ค ๋ฐ์ํ๋ค.
static getDerivedStateFromProps()
shouldComponentUdate() : ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธ ํ ์ง ๋ง์ง ๊ฒฐ์
render()
getSnapshopBeforeUpdate()
componentDidUpdate()
ํ์ด์ง๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ state๋ฅผ ์ฌ์ฉํด์ component๋ฅผ ๊ต์ฒดํ๋ ๊ฒฝ์ฐ
componentWillUnmount()
import React from "react";
class App extends React.Component {
state = {
isLoading : true,
movies : []
}
componentDidMount() {
setTimeout(() => {
this.setState({isLoading : false });
}, 6000);
}
render() {
const {isLoading} = this.state;//return์ isLoading์์ this.state.isLoading์ผ๋ก ์ฌ์ฉํด์ผ ํ์ง๋ง ํญ์ this.state๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ์ํด ์ฌ์ฉ
return <div>{isLoading ? "Loading" : "We are ready"}</div>;
}
}
export default App;
npm i axios
import axios from "axios";
import React from "react";
class App extends React.Component {
state = {
isLoading : true,
movies : []
}
componentDidMount() {
const movies = axios.get("https://yts-proxy.now.sh/list_movies.json");
}
render() {
const {isLoading} = this.state;//return์ isLoading์์ this.state.isLoading์ผ๋ก ์ฌ์ฉํด์ผ ํ์ง๋ง ํญ์ this.state๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ์ํด ์ฌ์ฉ
return <div>{isLoading ? "Loading" : "We are ready"}</div>;
}
}
export default App;
async componentDidMount() {
const movies = axios.get("https://yts-proxy.now.sh/list_movies.json");
}
or
getMovies = async() => {
const movies = await axios.get("https://yts-proxy.now.sh/list_movies.json");
}
componentDidMount() {
this.getMovies();
}
getMovies = async() => {
const movies = await axios.get("https://yts-proxy.now.sh/list_movies.json");
console.log(movies);
//์์ console.log๋ก ํ์ธ ํ ์ ๊ทผ
console.log(movies.data.data.movies)
}
componentDidMount() {
this.getMovies();
}
or
getMovies = async() => {
const {data: {data: {movies}}} = await axios.get("https://yts-proxy.now.sh/list_movies.json");
console.log(movies);
}
componentDidMount() {
this.getMovies();
}
state = {
isLoading : true,
movies : []
}
getMovies = async() => {
const {data: {data: {movies}}} = await axios.get("https://yts-proxy.now.sh/list_movies.json?sort_by=rating");\
//state์ movies๋ axiosd์ movies
//this.setState({movies : movies})
//์์ ๊ฐ์ ์๋ฏธ๋ก ์ต์ ๋ฒ์ ์์ ์ฌ์ฉํ ์ ์๋ค.
this.setState({movies, isLoading : false});
}
componentDidMount() {
this.getMovies();
}
import React from "react";
import PropTypes from "prop-types";
function Movie{id, title, poster}) {
return<h1>{movie}</h1>
}
Movie.propTypes = {
id : PropTypes.number.isRequired,
title : PropTypes.string.isRequired,
poster : PropTypes.string.isRequired,
}
export default Movie;
์ปดํฌ๋ํธ์ state๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ class๊ฐ ์๋ ํจ์ํ์ ์ฌ์ฉํ๋ค.
์ด ํ์ผ์ renderํ๊ธฐ ์ํด์ app.js์ ์ถ๊ฐํ๋ค.
import Movie from "./Movie";
class App extends React.Component {
state = {
isLoading : true,
movies : []
}
getMovies = async() => {
const {data: {data: {movies}}} = await axios.get("https://yts-proxy.now.sh/list_movies.json?sort_by=rating");
this.setState({movies, isLoading : false});
}
componentDidMount() {
this.getMovies();
}
render() {
const {isLoading, movies} = this.state;//return์ isLoading์์ this.state.isLoading์ผ๋ก ์ฌ์ฉํด์ผ ํ์ง๋ง ํญ์ this.state๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ์ํด ์ฌ์ฉ
return <div>{isLoading ? "Loading" : movies.map(movie) => {
return <Movie key = {movie.id}id={movie.id} title={movie.title} poster={movie.medium_cover_image} />
}}</div>;
}
}
export default App;
npm i gh-pages
//package.json ๋ง์ง๋ง์ ์ถ๊ฐํด์ค๋ค.
"homepage" : "https://{github username}.github.io/{name of project in guthub}"
//scripts์ deploy๋ฅผ ์ถ๊ฐํด์ค๋ค.
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"deploy" : "gh-pages -d build"
"predeploy" : "npm run build"
npm run build
npm run deploy
npm install react-router-dom
url์ ๊ฐ์ ธ๋ค๊ฐ ํ์ธํ๊ณ ์ฐ๋ฆฌ๊ฐ ๋ผ์ฐํฐ์ ๋ช ๋ นํ๋ ๊ฒ์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์จ๋ค.
๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก url์ ๊ฐ์ ธ์์ ๋ผ์ฐํฐ์ ์๋ ๋ชจ๋ ๊ฒ๊ณผ ๋น๊ตํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋งค์น๊ฐ ๋๋ค๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค๋ค.(๋๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง ์ ์๋ค.)
//components/Navigation.js
import react from "React";
fuction Navigation() {
return (
<div>
<a href="/">Home</a>
<a href="/about">About</a>
</div>
);
}
export default Navigation;
//app.js
import {HashRouter, Route} from "react-router-dom";
import Navigation from "./components/Navigation"
function App(){
return (
<HashRouter>
<Navigation />
<Route path="/home" exact={true} component={Home} />
<Route path="/about" component={About} />
</HashRouter>
);
}
<BrowserRouter />: HTML5 ํ์คํ ๋ฆฌ API๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์๋ฅผ ๊ด๋ฆฌํ๋ ๋ผ์ฐํฐ(ํด์ฌ๋ฑ
๋ชจ๋ ์ฌ์ฉ ์ํจ)
<Route />: ์์ฒญ ๊ฒฝ๋ก์ ๋ ๋๋งํ ์ปดํฌ๋ํธ๋ฅผ ์ค์ ํ๋ค
<Switch />: ํ์์ ๋ผ์ฐํฐ ์ค ํ๋๋ฅผ ์ ํํ๋ค
<Redirect />: ์์ฒญ ๊ฒฝ๋ก๋ฅผ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ๋ฆฌ๋ค์ด๋ ์
ํ๋ค
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ์ฌ ๊ท์น์ ๋ฒ์ด๋ฌ์ ๊ฒฝ์ฐ(์ ํด์ง ์ปดํฌ๋ํธ ๊ฒฝ๋ก๋ก ์์ฒญ์ด ๋ค์ด์ค์ง ์์ ๊ฒฝ์ฐ) ๋ฃจํธ ์์ฒญ์ผ๋ก ๋ฆฌ๋ค์ด๋ ์ ํ๊ฒ ๋ง๋ค์ด์ค ์ ์๋ค.
<Redirect path="*" to="/" /> </Switch>
<h1><a href="/" onClick={function(e){
e.preventDefault();//ํจ์๋ฅผ ํธ์ถํ์ ๋ ํ์ด์ง๊ฐ reload๋๋ ๊ฒ์ ๋ง์์ค๋ค.
}}>
[TIL] React
HTML DOM Events
React์์ Mobx ๊ฒฝํ๊ธฐ (Redux์ ๋น๊ต๊ธฐ)
๋๊ตฌ๋ ์ง ํ๋ ๋ฆฌ์กํธ 4ํธ: props ์ state
๋ฆฌ์กํธ ๋ผ์ฐํฐ ์ฌ์ฉํ๊ธฐ (ํ์
์คํฌ๋ฆฝํธ ๋ฒ์ )
๋ฆฌ์กํธ Styled Componets - 2ํธ
Strict ๋ชจ๋
ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด(Template Literal)๊ณผ ์คํ์ผ๋ ์ปดํฌ๋ํธ(styled-component)
๋ฆฌ์กํธ ๊ณต๋ถ! ์คํ์ผ๋ ์ปดํฌ๋ํธ
tyled-Components๋ฅผ ์ด์ฉํ React ์ปดํฌ๋ํธ ์คํ์ผ๋ง
[react package] styled-components์์ global style ์ ์ฉํ๊ธฐ, css reset
[React] Styled Components ์ฌ์ฉ๋ฒ
default export์ named export ์ฐจ์ด์
React Router๋ก ์ฌ์ฉ์ ์ธ์ฆํ๊ธฐ (๋ก๊ทธ์ธ/๋ก๊ทธ์์)
React ์ ์ฉ ๊ฐ์ด๋ - React ์๋ ๋ฐฉ๋ฒ
Axios ๋ฌ๋๊ฐ์ด๋
5 Ways to animate a React app.
[๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ] 4์ฅ - ์ด๋ฒคํธ ํธ๋ค๋ง
styled-component + react-transition-group = very simple Transition