Dev to webs {Coding…}

เรียนรู้การพัฒนาซอฟเวอร์ เพื่อความรู้ที่ยั่งยืน

บทที่ 39: การสร้าง Chart ด้วย Chart.js


1. ความเข้าใจเกี่ยวกับ Chart.js และ Alpine.js

Chart.js เป็น JavaScript Library ที่ช่วยสร้างกราฟแบบ Interactive และสวยงาม

  • การรวม Alpine.js กับ Chart.js ช่วยเพิ่มความสามารถในการควบคุมกราฟแบบ Dynamic โดยใช้ State และ Event
  • คุณสามารถสร้างกราฟที่อัปเดตข้อมูลแบบเรียลไทม์ หรือควบคุมการแสดงผลด้วย Alpine.js

2. การติดตั้ง Chart.js

ติดตั้ง Chart.js ผ่าน CDN

เพิ่มลิงก์ CDN ของ Chart.js ใน <head> ของ HTML:

<head>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]" defer></script>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>


3. การสร้าง Chart เบื้องต้น

ตัวอย่าง 1: สร้าง Bar Chart
<div x-data="{ chart: null, createChart() {
        const ctx = this.$refs.chart.getContext('2d');
        this.chart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: ['January', 'February', 'March', 'April', 'May', 'June'],
                datasets: [{
                    label: 'Sales',
                    data: [65, 59, 80, 81, 56, 55],
                    backgroundColor: 'rgba(75, 192, 192, 0.2)',
                    borderColor: 'rgba(75, 192, 192, 1)',
                    borderWidth: 1
                }]
            },
            options: {
                responsive: true,
                scales: {
                    y: { beginAtZero: true }
                }
            }
        });
    } }" x-init="createChart()">
    <canvas x-ref="chart" width="400" height="200"></canvas>
</div>

คำอธิบาย:

  • ใช้ Alpine.js สร้าง Chart ด้วยฟังก์ชัน createChart()
  • อ้างอิง <canvas> ผ่าน $refs.chart เพื่อกำหนดตำแหน่ง Chart
  • Chart.js ใช้ type: 'bar' เพื่อสร้าง Bar Chart

4. การอัปเดตข้อมูลใน Chart ด้วย Alpine.js

ตัวอย่าง 2: อัปเดตข้อมูลแบบ Dynamic
<div x-data="{ 
        chart: null, 
        createChart() {
            const ctx = this.$refs.chart.getContext('2d');
            this.chart = new Chart(ctx, {
                type: 'line',
                data: {
                    labels: ['January', 'February', 'March', 'April', 'May', 'June'],
                    datasets: [{
                        label: 'Sales',
                        data: [65, 59, 80, 81, 56, 55],
                        backgroundColor: 'rgba(54, 162, 235, 0.2)',
                        borderColor: 'rgba(54, 162, 235, 1)',
                        borderWidth: 1
                    }]
                },
                options: { responsive: true }
            });
        },
        updateChart() {
            this.chart.data.datasets[0].data = [70, 40, 90, 60, 75, 95];
            this.chart.update();
        }
    }" x-init="createChart()">
    <canvas x-ref="chart" width="400" height="200"></canvas>
    <button @click="updateChart()" class="mt-4 px-4 py-2 bg-blue-500 text-white rounded">
        Update Chart
    </button>
</div>

คำอธิบาย:

  • ใช้ updateChart() เพื่ออัปเดตข้อมูลในกราฟ
  • เรียก this.chart.update() เพื่อรีเฟรชกราฟหลังจากเปลี่ยนข้อมูล

5. การเปลี่ยนประเภทของ Chart

ตัวอย่าง 3: สลับประเภทของ Chart
<div x-data="{ 
        chart: null, 
        chartType: 'bar',
        createChart() {
            const ctx = this.$refs.chart.getContext('2d');
            this.chart = new Chart(ctx, {
                type: this.chartType,
                data: {
                    labels: ['January', 'February', 'March', 'April', 'May', 'June'],
                    datasets: [{
                        label: 'Revenue',
                        data: [30, 45, 60, 70, 90, 110],
                        backgroundColor: 'rgba(255, 99, 132, 0.2)',
                        borderColor: 'rgba(255, 99, 132, 1)',
                        borderWidth: 1
                    }]
                },
                options: { responsive: true }
            });
        },
        changeChartType(type) {
            this.chart.destroy();
            this.chartType = type;
            this.createChart();
        }
    }" x-init="createChart()">
    <canvas x-ref="chart" width="400" height="200"></canvas>
    <div class="mt-4 space-x-2">
        <button @click="changeChartType('bar')" class="px-4 py-2 bg-blue-500 text-white rounded">
            Bar Chart
        </button>
        <button @click="changeChartType('line')" class="px-4 py-2 bg-green-500 text-white rounded">
            Line Chart
        </button>
        <button @click="changeChartType('pie')" class="px-4 py-2 bg-red-500 text-white rounded">
            Pie Chart
        </button>
    </div>
</div>

คำอธิบาย:

  • ฟังก์ชัน changeChartType(type) ใช้เปลี่ยนประเภทของ Chart โดยทำลายกราฟเดิม (chart.destroy()) และสร้างใหม่
  • สามารถสลับประเภทเป็น bar, line, หรือ pie

6. การรวม Chart.js กับ State ใน Alpine.js

ตัวอย่าง 4: การใช้ State ในการควบคุมข้อมูล
<div x-data="{ 
        chart: null, 
        salesData: [50, 75, 90, 120, 80, 60], 
        createChart() {
            const ctx = this.$refs.chart.getContext('2d');
            this.chart = new Chart(ctx, {
                type: 'line',
                data: {
                    labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
                    datasets: [{
                        label: 'Sales',
                        data: this.salesData,
                        backgroundColor: 'rgba(153, 102, 255, 0.2)',
                        borderColor: 'rgba(153, 102, 255, 1)',
                        borderWidth: 1
                    }]
                },
                options: { responsive: true }
            });
        },
        addData() {
            this.salesData.push(Math.floor(Math.random() * 100) + 50);
            this.chart.data.datasets[0].data = this.salesData;
            this.chart.update();
        }
    }" x-init="createChart()">
    <canvas x-ref="chart" width="400" height="200"></canvas>
    <button @click="addData()" class="mt-4 px-4 py-2 bg-purple-500 text-white rounded">
        Add Random Data
    </button>
</div>

คำอธิบาย:

  • ใช้ State salesData ควบคุมข้อมูลในกราฟ
  • ฟังก์ชัน addData() เพิ่มค่าข้อมูลใหม่แบบสุ่มในกราฟ

7. ข้อควรระวังในการรวม Alpine.js กับ Chart.js

  1. การจัดการ Lifecycle:
    • ควรทำลาย Chart (chart.destroy()) ก่อนสร้างใหม่ เพื่อป้องกันปัญหา Memory Leak
  2. การจัดการ Responsive:
    • ใช้ responsive: true ในตัวเลือกของ Chart.js เพื่อให้กราฟปรับขนาดตามหน้าจอ
  3. การจัดการข้อมูลขนาดใหญ่:
    • หากข้อมูลมีจำนวนมาก ควรใช้วิธีโหลดข้อมูลแบบแบ่งหน้า หรือ Virtual Scrolling

สรุป

ในบทนี้ คุณได้เรียนรู้การรวม Chart.js กับ Alpine.js เพื่อสร้างกราฟแบบ Dynamic และ Interactive ตัวอย่างครอบคลุมการสร้างกราฟเบื้องต้น, การอัปเดตข้อมูล, การเปลี่ยนประเภทกราฟ และการควบคุมข้อมูลด้วย State การผสาน Alpine.js กับ Chart.js ช่วยเพิ่มความยืดหยุ่นในการสร้าง UI ที่น่าสนใจและตอบสนองต่อผู้ใช้งานได้ดีขึ้น!