用react 写一个可左右滑动的柱状图

效果图

目录

效果图

[✅ 项目结构](#✅ 项目结构)

[🚀 创建项目步骤](#🚀 创建项目步骤)

[1️⃣ 打开终端或命令行,创建新项目:](#1️⃣ 打开终端或命令行,创建新项目:)

[2️⃣ 安装 recharts 图表库:](#2️⃣ 安装 recharts 图表库:)

[3️⃣ 替换默认代码:](#3️⃣ 替换默认代码:)

[4️⃣ 启动项目:](#4️⃣ 启动项目:)


✅ 项目结构

bash 复制代码
scrollable-bar-chart/
├── node_modules/
├── public/
├── src/
│   ├── App.js
│   ├── ScrollableBarChart.js
│   └── index.js
├── package.json

🚀 创建项目步骤

1️⃣ 打开终端或命令行,创建新项目:
bash 复制代码
npx create-react-app scrollable-bar-chart
cd scrollable-bar-chart
2️⃣ 安装 recharts 图表库:
bash 复制代码
npm install recharts
3️⃣ 替换默认代码:
  • src/App.js 内容换成我给你的 App.js
javascript 复制代码
import React from 'react';
import ScrollableBarChart from './ScrollableBarChart';

function App() {
  return (
    <div style={{ padding: '20px' }}>
      <h2>可滚动柱状图示例</h2>
      <ScrollableBarChart />
    </div>
  );
}

export default App;
  • 创建一个新文件 src/ScrollableBarChart.js,粘贴我提供的图表代码
javascript 复制代码
import React from "react";
import {
  BarChart,
  Bar,
  XAxis,
  YAxis,
  Tooltip,
  Legend,
  CartesianGrid,
  ReferenceLine,
  ReferenceArea,
} from "recharts";

const data = [
  { name: "09", solar: 20, discharge: 15, sell: 10, charge: -5 },
  { name: "10", solar: 30, discharge: 20, sell: 15, charge: -10 },
  { name: "11", solar: 40, discharge: 25, sell: 20, charge: -15 },
  { name: "12", solar: 45, discharge: 30, sell: 25, charge: -20 },
  { name: "13", solar: 50, discharge: 35, sell: 30, charge: -25 },
  { name: "14", solar: 45, discharge: 30, sell: 25, charge: -20 },
  { name: "15", solar: 40, discharge: 25, sell: 20, charge: -15 },
  { name: "16", solar: 30, discharge: 20, sell: 15, charge: -10 },
  { name: "17", solar: 25, discharge: 15, sell: 10, charge: -5 },
  { name: "18", solar: 20, discharge: 10, sell: 5, charge: -3 },
];

const ScrollableBarChart = () => {
  return (
    <div style={{ overflowX: "auto" }}>
      <div style={{ width: "1200px", height: "400px" }}>
        <BarChart
          data={data}
          width={1200}
          height={400}
          margin={{ top: 20, right: 30, left: 20, bottom: 5 }}
          barGap={0}
          barCategoryGap={0}
        >
          <CartesianGrid strokeDasharray="3 3" />
          <XAxis dataKey="name" />
          <YAxis
            domain={[-100, 100]}
            ticks={[-100, -75, -50, -25, 0, 25, 50, 75, 100]}
          />
          <Tooltip />
          <Legend />
          <ReferenceLine y={0} stroke="#000" strokeWidth={2} />
          <ReferenceArea x1="12" x2="13" fill="#d0f0d0" fillOpacity={0.4} />

          {/* 顶部的柱子有上圆角 */}
          <Bar
            dataKey="solar"
            stackId="a"
            fill="#8dd1e1"
            barSize={30}
            radius={[10, 10, 0, 0]}
            name="光伏自发自用"
          />
          {/* 中间无圆角 */}
          <Bar
            dataKey="discharge"
            stackId="a"
            fill="#82ca9d"
            barSize={30}
            radius={0}
            name="电池放电"
          />
          <Bar
            dataKey="sell"
            stackId="a"
            fill="#ffc658"
            barSize={30}
            radius={0}
            name="电力卖给电网"
          />
          {/* 底部负值柱子有下圆角 */}
          <Bar
            dataKey="charge"
            stackId="a"
            fill="#8884d8"
            barSize={30}
            radius={[0, 0, 10, 10]}
            name="电池充电"
          />
        </BarChart>
      </div>
    </div>
  );
};

export default ScrollableBarChart;
  • 确保 src/index.js 和之前保持一致(一般不用改)
javascript 复制代码
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
4️⃣ 启动项目:

npm start

浏览器会自动打开 http://localhost:3000

相关推荐
半兽先生7 分钟前
VueDOMPurifyHTML 防止 XSS(跨站脚本攻击) 风险
前端·xss
冴羽10 分钟前
SvelteKit 最新中文文档教程(20)—— 最佳实践之性能
前端·javascript·svelte
Jackson__17 分钟前
面试官:谈一下在 ts 中你对 any 和 unknow 的理解
前端·typescript
zpjing~.~25 分钟前
css 二维码始终显示在按钮的正下方,并且根据不同的屏幕分辨率自动调整位置
前端·javascript·html
红虾程序员39 分钟前
Linux进阶命令
linux·服务器·前端
yinuo41 分钟前
uniapp在微信小程序中实现 SSE 流式响应
前端
lynx_1 小时前
又一个跨端框架——万字长文解析 ReactLynx 实现原理
前端·javascript·前端框架
子燕若水1 小时前
UE5 Chaos :官方文献总结 + 渲染网格体 (Render Mesh) 和模拟网格体 是如何关联的?为什么模拟网格体 可以驱动渲染网格体?
前端
Anlici1 小时前
深度前端面试知识体系总结
前端·面试
夜寒花碎1 小时前
前端基础理论——02
前端·javascript·html