You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Hyperion工具容器中实现点击传感器信息类型弹出网格布局图表

实现方案

1. 新增状态变量

在HyperionToolContainer.jsx组件头部新增两个状态,分别控制图表弹窗显隐、存储当前选中的信息类型关联数据:

import { useState } from 'react';
// 原有导入保持不变
const HyperionToolContainer = (props) => {
  // 原有状态保持不变
  const [chartModalOpen, setChartModalOpen] = useState(false);
  const [selectedProperty, setSelectedProperty] = useState(null);
  // 原有逻辑保持不变
}

2. 修改树节点点击回调

修改BasicTree绑定的onLabelClick方法,点击信息类型时筛选对应传感器、拉取图表数据后打开弹窗:

const onLabelClick = (node) => {
  // 仅处理属性类型节点
  if (!node.id) return;
  // 遍历所有设备,筛选支持当前属性的传感器
  const matchedSensors = [];
  props.data.forEach(floor => {
    floor.children.forEach(device => {
      if (device.propIds.includes(node.id)) {
        matchedSensors.push({
          deviceId: device.id,
          deviceName: device.name,
          floor: floor.name,
          // 对接仪表板接口拉取该设备对应属性的图表数据
          chartData: fetchDashboardChartData(device.id, node.id)
        })
      }
    })
  })
  // 存储选中的属性和对应传感器数据,打开弹窗
  setSelectedProperty({
    propertyName: node.name,
    sensors: matchedSensors
  })
  setChartModalOpen(true);
}

3. 新增图表弹窗组件

在组件的return语句末尾新增弹窗,默认采用响应式网格布局排列图表:

// 原有Popper等组件保持不变
<Dialog
  open={chartModalOpen}
  onClose={() => setChartModalOpen(false)}
  maxWidth="xl"
  fullWidth
>
  <DialogTitle>{selectedProperty?.propertyName} 对应传感器数据</DialogTitle>
  <DialogContent>
    {/* 响应式网格布局,小屏1列、平板2列、桌面3-4列 */}
    <Grid container spacing={2} sx={{ mt: 1 }}>
      {selectedProperty?.sensors.map(sensor => (
        <Grid item xs={12} sm={6} md={4} lg={3} key={sensor.deviceId}>
          <Card>
            <CardContent>
              <Typography variant="subtitle2" gutterBottom>
                {sensor.deviceName}({sensor.floor})
              </Typography>
              {/* 替换为项目实际使用的图表组件即可 */}
              <LineChart data={sensor.chartData} />
            </CardContent>
          </Card>
        </Grid>
      ))}
    </Grid>
  </DialogContent>
  <DialogActions>
    <Button onClick={() => setChartModalOpen(false)}>关闭</Button>
  </DialogActions>
</Dialog>

4. 现有代码优化

你现有逻辑中属性去重的部分可以用Set简化,性能更好代码更简洁:

// 替换原有props.data.forEach遍历去重的逻辑
const propertySet = new Set();
props.data.forEach(floor => {
  floor.children.forEach(child => {
    child.propIds.forEach(prop => propertySet.add(prop))
  })
})
const propertyHolder = Array.from(propertySet).map(prop => ({
  id: prop,
  name: prop,
  children: []
}))

5. 仪表板数据对接说明

你提到需要从仪表板导入图表数据,只需要实现上述的fetchDashboardChartData方法即可:如果是对接内部仪表板接口,直接请求对应设备、对应属性的时序/统计数据;如果是用Forge Data Visualization自带的传感器数据,调用对应SDK方法拉取时序数据即可。

内容的提问来源于stack exchange,提问作者JonathanA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:39:01