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

相关推荐
lichenyang4533 小时前
Docker 学习笔记(一):为什么需要镜像、容器和仓库?
前端
kyriewen3 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
IT_陈寒3 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
奇奇怪怪的4 小时前
Embedding 模型 10+ 横向评测
前端
陈广亮4 小时前
Monorepo 从 0 到 1 实操指南 2026 版:pnpm catalogs + Turborepo 2.x + changesets 全链路
前端
子兮曰4 小时前
OpenMontage 深度解剖:你的 AI 编程助手,其实是个视频工作室
前端·后端·ai编程
敲代码的鱼4 小时前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
子兮曰4 小时前
前端工具链的「Rust 化」:一场没有赢家的军备竞赛?
前端·后端·rust
Hyyy5 小时前
Function Calling / Tool Use的原理和实现模式
前端·llm·ai编程
爱勇宝5 小时前
从 Ctrl+CV 到 Enter:程序员正在失去什么
前端·后端·程序员