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

React Annotation Tool:defaultAnnotations仅硬编码数据时生效问题排查

解决React Annotation Tool无法加载MongoDB存储数据的问题

看起来你遇到的问题很典型——相同结构的数据,硬编码能正常显示,但从数据库读取后传入组件就不行。结合你的代码,我梳理了几个可能的原因和解决方向:

1. 数据格式不匹配:单个对象 vs 数组

你的硬编码数据是数组格式:

let oo = [ { ... } ]; // 外层是数组

但看你从state取出的数据:

this.defaultAnnotations = this.state.defaultData[0]; // 取出数组的第一个元素,变成单个对象
this.setState({ defaultAnnotations: this.defaultAnnotations, ready: true });

如果TwoDimensionalVideo组件的defaultAnnotations期望接收数组(就像硬编码那样),那你传入单个对象肯定无法渲染。解决方法很简单:

  • 如果this.state.defaultData本身是数组,直接传入整个数组:
this.setState({ 
  defaultAnnotations: this.state.defaultData, 
  ready: true 
});
  • 如果this.state.defaultData是单个对象,把它包装成数组再传入:
this.setState({ 
  defaultAnnotations: [this.state.defaultData], 
  ready: true 
});

2. 组件defaultAnnotations的初始化特性

很多标注工具组件的defaultAnnotations只是初始值,组件挂载后修改这个属性不会触发重新渲染(类似React表单的defaultValue)。如果是这种情况,你需要把组件改成受控模式:

  • 用annotations属性代替defaultAnnotations
  • 配合组件的onChange事件维护状态

示例代码:

<TwoDimensionalVideo 
  url={video}
  annotations={this.state.ready ? this.state.defaultAnnotations : []}
  onChange={(newAnnotations) => this.setState({ defaultAnnotations: newAnnotations })}
/>

你可以查看TwoDimensionalVideo组件的文档,确认它是否支持受控模式的属性。

3. 数据序列化/反序列化的隐性问题

虽然你说console.log的输出和硬编码一致,但MongoDB存储和取出的过程中,可能存在隐性变化:

  • 某些属性类型被转换(比如time字段原本是数字,存进去变成了字符串)
  • MongoDB自动添加的_id字段被包含在对象里,导致组件无法识别

你可以在控制台打印细节对比:

// 对比硬编码和数据库数据的结构与类型
console.log("硬编码数据键:", Object.keys(oo[0]));
console.log("数据库数据键:", Object.keys(this.state.defaultAnnotations));
console.log("time类型对比:", typeof oo[0].incidents[0].time, typeof this.state.defaultAnnotations.incidents[0].time);

如果发现类型不一致,取出数据后做转换即可:

const processedData = this.state.defaultData.map(item => ({
  ...item,
  incidents: item.incidents.map(incident => ({
    ...incident,
    time: Number(incident.time)
  }))
}));
this.setState({ defaultAnnotations: processedData, ready: true });

4. 简化状态更新逻辑

你的状态更新代码有点冗余,没必要先把值存在实例属性this.defaultAnnotations里,直接在setState回调里处理即可:

const response = await fetch("/getData");
const json = await response.json();
this.setState({ defaultData: json.data[0].drawnData.data }, () => {
  // 统一处理数据格式
  const annotations = Array.isArray(this.state.defaultData) ? this.state.defaultData : [this.state.defaultData];
  this.setState({ defaultAnnotations: annotations, ready: true });
});

这样能减少不必要的变量赋值,降低出错概率。

先从第一个问题(数组/单个对象的差异)开始排查,这大概率是你当前的问题所在。如果还是不行,再依次检查后面的方向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:07:44