์ค์: JSX๋ฅผ exportํ๋ ์ปดํฌ๋ํธ์ฉ ํ์ผ์ .js ๋ง๊ณ .jsx๋ก ๋ง๋ค์ด์ผ Vite ํ๊ฒฝ์์ ์ ์๋ํฉ๋๋ค! โ ๏ธ
์ค์ ์๋น์ค์์๋ ์๋ฒ์์ ๋ฐ์์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ค๋นํด๋ด ์๋ค:
[
{
id: 0,
title: "White and Black",
content: "Born in France",
price: 120000
},
{
id: 1,
title: "Red Knit",
content: "Born in Seoul",
price: 110000
},
{
id: 2,
title: "Grey Yordan",
content: "Born in the States",
price: 130000
}
]
๊ตฌ์กฐ ๋ถ์:
[array์๋ฃ]์ ์ํ์ ๋ณด 3๊ฐ๊ฐ ๋ค์ด์์{object์๋ฃ} ํํ[{}, {}, {}] ๊ตฌ์กฐdata.js ํ์ผ:
let a = 10;
export default a;
App.jsx ํ์ผ:
import a from './data.js';
console.log(a); // 10 ์ถ๋ ฅ
export default ๋ณ์๋ช
; - ๋ณ์๋ฅผ ๋ค๋ฅธ ํ์ผ๋ก ๋ด๋ณด๋ด๊ธฐimport ์๋ช
from './ํ์ผ๊ฒฝ๋ก' - ๋ด๋ณด๋ธ ๋ณ์ ๊ฐ์ ธ์ค๊ธฐexport default๋ ํ๋๋ง ์ฌ์ฉ ๊ฐ๋ฅ./๋ถํฐ ์์ (ํ์ฌ ๊ฒฝ๋ก ์๋ฏธ)data.js ํ์ผ:
var name1 = 'Kim';
var name2 = 'Park';
export { name1, name2 };
App.jsx ํ์ผ:
import { name1, name2 } from './data.js';
๊ธธ๊ณ ๋ณต์กํ state ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํ์ผ์ ์ ์ฅํ๊ณ importํด์์ ์ฌ์ฉ:
data.js:
let data = [
{
id: 0,
title: "White and Black",
content: "Born in France",
price: 120000
},
// ... ๋๋จธ์ง ๋ฐ์ดํฐ
];
export default data;
App.jsx:
import data from './data.js';
import { useState } from 'react';
function App(){
let [shoes] = useState(data);
// ...
}
importํด์จ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๋ฉด์ ํ์:
function App(){
let [shoes] = useState(data);
return (
<div className="App">
{/* ์๋ต */}
<div className="container">
<div className="row">
<div className="col-md-4">
<img src="https://codingapple1.github.io/shop/shoes1.jpg" width="80%" />
<h4>{shoes[0].title}</h4>
<p>{shoes[0].price}</p>
</div>
<div className="col-md-4">
<img src="https://codingapple1.github.io/shop/shoes2.jpg" width="80%" />
<h4>{shoes[1].title}</h4>
<p>{shoes[1].price}</p>
</div>
<div className="col-md-4">
<img src="https://codingapple1.github.io/shop/shoes3.jpg" width="80%" />
<h4>{shoes[2].title}</h4>
<p>{shoes[2].price}</p>
</div>
</div>
</div>
</div>
)
}
๋ฐ์ดํฐ ์ ๊ทผ ๋ฐฉ๋ฒ:
shoes[0].title - ์ฒซ ๋ฒ์งธ ์ํ์ ์ ๋ชฉshoes[0].price - ์ฒซ ๋ฒ์งธ ์ํ์ ๊ฐ๊ฒฉ1. Named Export vs Default Export
// Named Export (์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ)
export const function1 = () => {};
export const function2 = () => {};
// Default Export (ํ์ผ๋น ํ๋๋ง)
export default function MainFunction() {}
// ํผํฉ ์ฌ์ฉ ๊ฐ๋ฅ
export const helper = () => {};
export default MainComponent;
2. Import ๋ฐฉ์ ์กฐํฉ
// Default + Named Import ํผํฉ
import MainComponent, { helper, utils } from './module.js';
// ์ ์ฒด Import
import * as MyModule from './module.js';
// ๋ณ์นญ ์ฌ์ฉ
import { longFunctionName as short } from './module.js';
๊ถ์ฅ ํด๋ ๊ตฌ์กฐ:
src/
โโโ components/
โ โโโ ProductCard.jsx
โ โโโ Navbar.jsx
โโโ data/
โ โโโ products.js
โ โโโ constants.js
โโโ utils/
โ โโโ helpers.js
โโโ App.jsx
1. ProductCard ์ปดํฌ๋ํธ ๋ถ๋ฆฌ
// components/ProductCard.jsx
export default function ProductCard({ product, index }) {
return (
<div className="col-md-4">
<img src={`https://codingapple1.github.io/shop/shoes${index + 1}.jpg`} width="80%" />
<h4>{product.title}</h4>
<p>{product.price.toLocaleString()}์</p>
</div>
);
}
2. map() ํจ์๋ก ๋ฐ๋ณต ๋ ๋๋ง
// App.jsx
import ProductCard from './components/ProductCard';
function App() {
const [shoes] = useState(data);
return (
<div className="container">
<div className="row">
{shoes.map((product, index) => (
<ProductCard
key={product.id}
product={product}
index={index}
/>
))}
</div>
</div>
);
}
1. ํ์ ์ ์ (TypeScript ์ฌ์ฉ ์)
interface Product {
id: number;
title: string;
content: string;
price: number;
image?: string;
category?: string;
}
2. ๋ฐ์ดํฐ ๊ฒ์ฆ ํจ์
// utils/validation.js
export const validateProduct = (product) => {
const required = ['id', 'title', 'price'];
return required.every(field => product[field] !== undefined);
};
3. ๋ฐ์ดํฐ ํฌ๋งทํ ์ ํธ๋ฆฌํฐ
// utils/formatters.js
export const formatPrice = (price) => {
return new Intl.NumberFormat('ko-KR', {
style: 'currency',
currency: 'KRW'
}).format(price);
};
export const formatProductForDisplay = (product) => ({
...product,
formattedPrice: formatPrice(product.price),
shortTitle: product.title.length > 20
? product.title.substring(0, 20) + '...'
: product.title
});
1. React.memo ์ฌ์ฉ
import React from 'react';
const ProductCard = React.memo(({ product, index }) => {
return (
// ์ปดํฌ๋ํธ ๋ด์ฉ
);
});
2. useMemo๋ก ๊ณ์ฐ ๊ฒฐ๊ณผ ์บ์ฑ
import { useMemo } from 'react';
function ProductList({ products }) {
const sortedProducts = useMemo(() => {
return products.sort((a, b) => a.price - b.price);
}, [products]);
return (
// ๋ ๋๋ง
);
}