easy-model 在数据可视化仪表板中的应用

数据可视化仪表板需要处理大量数据、图表配置、用户交互等复杂逻辑。easy-model 的模型驱动架构能有效组织这些功能,提升开发效率。本文通过实际用例展示 easy-model 在仪表板开发中的优势。

图表配置模型

图表是仪表板的核心。我们创建 ChartModel 封装图表逻辑:

typescript 复制代码
import { useModel } from "@e7w/easy-model"

class ChartModel {
  config = {
    type: "bar" as "bar" | "line" | "pie",
    data: [] as Array<{ label: string; value: number }>,
    title: "",
    showLegend: true
  };

  constructor(initialConfig: typeof this.config) {
    this.config = initialConfig;
  }

  updateData(newData: typeof this.config.data) {
    this.config.data = newData;
  }

  toggleLegend() {
    this.config.showLegend = !this.config.showLegend;
  }

  getMaxValue() {
    return Math.max(...this.config.data.map(d => d.value));
  }
}

function ChartComponent({ chartId }: { chartId: string }) {
  const params = useMemo(() => [{
    type: "bar",
    data: [
      { label: "Jan", value: 100 },
      { label: "Feb", value: 150 },
      { label: "Mar", value: 200 }
    ],
    title: "月销售额",
    showLegend: true
  }])
  const chartModel = useModel(ChartModel, params);

  return (
    <div>
      <h3>{chartModel.config.title}</h3>
      <p>最大值: {chartModel.getMaxValue()}</p>
      <button onClick={() => chartModel.toggleLegend()}>
        {chartModel.config.showLegend ? "隐藏图例" : "显示图例"}
      </button>
      {/* 渲染图表逻辑 */}
    </div>
  );
}

模型封装图表业务逻辑,如数据更新、配置切换等。

仪表板布局管理

仪表板布局需要跨组件共享:

typescript 复制代码
import { useModel } from "@e7w/easy-model"

class DashboardModel {
  widgets: Array<{ id: string; type: string; position: { x: number; y: number } }> = [];
  dashboardId: string;

  constructor(dashboardId: string) {
    this.dashboardId = dashboardId;
  }

  addWidget(widget: typeof this.widgets[0]) {
    this.widgets.push(widget);
  }

  moveWidget(id: string, newPosition: { x: number; y: number }) {
    const widget = this.widgets.find(w => w.id === id);
    if (widget) widget.position = newPosition;
  }

  getWidgetCount() {
    return this.widgets.length;
  }
}

function Dashboard({ dashboardId }: { dashboardId: string }) {
  const dashboard = useModel(DashboardModel,[dashboardId]);

  return (
    <div>
      <h2>仪表板 ({dashboard.getWidgetCount()} 个组件)</h2>
      {dashboard.widgets.map(widget => (
        <div key={widget.id} style={{
          position: 'absolute',
          left: widget.position.x,
          top: widget.position.y
        }}>
          {/* 渲染组件 */}
        </div>
      ))}
    </div>
  );
}

useModel 支持布局状态共享。

数据异步加载

仪表板数据通常来自API:

typescript 复制代码
import { loader, useLoader, useModel } from "@e7w/easy-model"

class DataSourceModel {
  data: any[] = [];
  sourceId: string;

  constructor(sourceId: string) {
    this.sourceId = sourceId;
  }

  @loader.load(true)
  async loadData() {
    // 模拟API调用
    const response = await fetch(`/api/data/${this.sourceId}`);
    this.data = await response.json();
  }
}

function DataWidget({ sourceId }: { sourceId: string }) {
  const dataModel = useModel(DataSourceModel, [sourceId]);
  const { isLoading } = useLoader();

  return (
    <div>
      {isLoading(dataModel.loadData) ? "加载中..." : (
        <ul>
          {dataModel.data.map((item, i) => <li key={i}>{item.name}</li>)}
        </ul>
      )}
      <button onClick={dataModel.loadData} disabled={isLoading(dataModel.loadData)}>
        刷新数据
      </button>
    </div>
  );
}

异步数据加载,状态自动管理。

测试保证质量

模型类易于测试:

typescript 复制代码
describe("ChartModel", () => {
  it("should update data", () => {
    const model = new ChartModel({
      type: "bar",
      data: [],
      title: "Test",
      showLegend: true,
    });
    const newData = [{ label: "A", value: 10 }];
    model.updateData(newData);
    expect(model.config.data).toEqual(newData);
  });

  it("should calculate max value", () => {
    const model = new ChartModel({
      type: "bar",
      data: [
        { label: "A", value: 10 },
        { label: "B", value: 20 },
      ],
      title: "Test",
      showLegend: true,
    });
    expect(model.getMaxValue()).toBe(20);
  });
});

测试确保图表逻辑正确。

总结

easy-model 在数据可视化仪表板中表现出色:模型封装图表逻辑、状态共享布局、异步数据处理。结合测试,提升开发质量。试用 easy-model,让仪表板开发更简单!

项目地址:GitHub

相关推荐
Jmyd01231 小时前
Web端3D营销展厅技术实现路径:从素材上云到线索回流的数据链路
前端·3d·性能优化·三维数字化
砚凝霜1 小时前
【软考信息安全】第二十二章 Web服务器安全分析与增强——Apache与IIS
服务器·前端·安全
u0111026753 小时前
JPG、PNG、WebP 怎么选?按透明度、体积和使用场景做判断
前端·javascript·vue.js·图像处理·ai作画
jerrywus3 小时前
让 AI 写完代码后交一份报告:我改造了 answer-me-with-html
前端·claude·cursor
派小心.4 小时前
小程序分享链路中来源参数的传递校验
大数据·前端·数据库·人工智能·小程序·数据分析
hhb_6184 小时前
一键生成数据看板,ECharts实战演示
前端·javascript·echarts
Java后端的Ai之路4 小时前
08_React组件API
前端·react.js·前端框架
小马不起床4 小时前
零基础玩转 FastAPI_09:前端基础工程构建
前端·状态模式·fastapi
风骏时光牛马6 小时前
用户管理模块接口开发
前端
彭亚川Allen6 小时前
从零手搓 RAG 之检索全流程,给大模型接上自己的知识库
前端·后端·ai编程