# 🏅Day39 - React 套件應用 (5) - Chart.js Chart.js 是一個輕量級的 JavaScript 圖表庫,用於在網站上輕鬆創建各種互動式圖表。它基於 HTML5 的 <canvas> 元素,並提供了簡單直觀的 API 來生成各種常見的圖表類型,包括條形圖、折線圖、圓餅圖等。Chart.js 支援動畫效果、響應式設計,並且可以與其他前端框架(如 React、Vue、Angular 等)輕鬆整合。 [官方網站](https://www.chartjs.org/) Chart.js 支援多種圖表類型,包括: 條形圖(Bar Chart) 折線圖(Line Chart) 圓餅圖(Pie Chart) 雷達圖(Radar Chart) 散點圖(Scatter Chart) 氣泡圖(Bubble Chart) 極區圖(Polar Area Chart) 例如下面的程式碼,就是一個圓餅圖的範例,跟其他相關的設定: ```js const PieChart = () => { const chartRef = useRef(null); // 用來引用 canvas 元素 useEffect(() => { // 確保圖表只初始化一次 const ctx = chartRef.current.getContext('2d'); new Chart(ctx, { type: 'pie', // 圓餅圖 data: { labels: ['Red', 'Blue', 'Yellow'], // 標籤 datasets: [{ label: 'My Pie Chart', // 圖表標題 data: [12, 19, 9], // 各區塊的數據 backgroundColor: [ // 設定每個區塊的顏色 'rgba(255, 99, 132, 0.2)', // 紅色 'rgba(54, 162, 235, 0.2)', // 藍色 'rgba(255, 206, 86, 0.2)' // 黃色 ], borderColor: [ // 設定邊框顏色 'rgba(255, 99, 132, 1)', // 紅色邊框 'rgba(54, 162, 235, 1)', // 藍色邊框 'rgba(255, 206, 86, 1)' // 黃色邊框 ], borderWidth: 1 // 邊框寬度 }] }, options: { responsive: true, // 使圖表響應式 plugins: { legend: { position: 'top', // 圖例顯示位置 }, tooltip: { enabled: true, // 啟用工具提示 } } } }); }, []); return ( <div> <canvas ref={chartRef} width="400" height="400"></canvas> </div> ); } ``` ## 題目 請複製 (右下角 fork)這個[範例](https://codepen.io/yen-kg/pen/vYoMaYj?editors=1011),利用 chart.js 的方式生成一個條形圖(Bar Chart),資料可以自行隨意建立,只要有正確的呈現圖表就行。 ![image](https://hackmd.io/_uploads/r11S7CdGkx.png) <!-- 解答: ``` const ChartComponent = () => { const chartRef = React.useRef(null); const [chartInstance, setChartInstance] = useState(null); useEffect(() => { if (chartRef.current && !chartInstance) { const newChartInstance = new Chart(chartRef.current, { type: 'bar', data: { labels: ['January', 'February', 'March', 'April', 'May', 'June'], datasets: [ { label: 'Sales', data: [12, 19, 3, 5, 2, 3], backgroundColor: 'rgba(75, 192, 192, 0.2)', borderColor: 'rgba(75, 192, 192, 1)', borderWidth: 1, }, ], }, options: { scales: { y: { beginAtZero: true, }, }, }, }); setChartInstance(newChartInstance); } return () => { if (chartInstance) { chartInstance.destroy(); } }; }, [chartInstance]); return <canvas ref={chartRef} width="400" height="200" />; }; ``` --> | Name | Codepen | | -------- | -------- | |TWLeoC|[Codepen](https://codepen.io/TWLeoC/pen/ByzxebP?editors=0010)| | Jin |[Codepen](https://codepen.io/Jin-L/pen/Eaypgyb)| | Chia |[Codepen](https://codepen.io/Chia-the-encoder/pen/OPXwbRW)| | Nooooora | [CodePen](https://codepen.io/Nora-Ch/pen/JoKBbeo?editors=1011)| | Tetsu |[Codepen](https://codepen.io/ttgchang/pen/YPWjpLW)| | RUDY |[Codepen](https://codepen.io/Rudy-crw/pen/dPXjWox?editors=0011)| | Rogan |[Codepen](https://codepen.io/RoganHsu/pen/ZYOjKvm?editors=1011)| | chippy |[Codepen](https://hackmd.io/7QVd-5n5QzCMj_iw3gma5w)| | Eric | [Codepen](https://codepen.io/wc-su/pen/QwEBgZe) | | Miikaa | [codepen](https://codepen.io/Miikaa/pen/XJKBMLYj) | | 小懿 | [codepen](https://codepen.io/YT-the-vuer/pen/qENyVeV) | | 平平 | [codepen](https://codepen.io/ypinpin/pen/myEjqbw) | | cks40660 | [codepen](https://codepen.io/CKS40660/pen/ogLMpyQ)| | kashiwatei | [codepen](https://codepen.io/kashiwatei/pen/azZjYGB?editors=1011)| | Percy | [codepen](https://codepen.io/Percy-Ku/pen/MYeBGpb?editors=0010)| | 老屠 | [codepen](https://codepen.io/fsgfxvlb-the-selector/pen/VYjBPRX?editors=0011)| | Eileen | [codepen](https://codepen.io/Eileen-io/pen/MYeBLyQ)| | 7lun | [codepen](https://codepen.io/mfyvqhsn-the-bold/pen/EayeyqN?editors=0011)| | Jenna | [codepen](https://codepen.io/abiscc14/pen/xbOagjO)| | Leonard | [codepen](https://codepen.io/hyyfjqra-the-sans/pen/LEZJWRe?editors=0011)| | 星雪糖 | [codepen](https://codepen.io/vfpofbgm-the-scripter/pen/raLZraR?editors=1011)| | 7Red | [Codepen](https://codepen.io/cch2655/pen/gbMdEaW) |