我必须每一两秒钟监控屏幕上的一些数据更新信息.

    componentDidMount() {
        this.timer = setInterval(()=> this.getItems(), 1000);
      }
    
      componentWillUnmount() {
        this.timer = null;
      }
    
      getItems() {
        fetch(this.getEndpoint('api url endpoint"))
            .then(result => result.json())
            .then(result => this.setState({ items: result }));
      }

这是正确的方法吗?

推荐答案

好吧,因为你只有一个API,并且没有控制权来改变它以使用套接字,所以你唯一的方法就是轮询.

根据你的民意调查,你做得很好.但上面的代码中有一个trap .

componentDidMount() {
  this.timer = setInterval(()=> this.getItems(), 1000);
}

componentWillUnmount() {
  this.timer = null; // here...
}

getItems() {
  fetch(this.getEndpoint('api url endpoint"))
    .then(result => result.json())
    .then(result => this.setState({ items: result }));
}

这里的问题是,一旦组件卸载,尽管存储在this.timer中的对interval的引用被设置为null,但它还没有停止.即使在卸载组件后,间隔也会继续调用处理程序,并try 在不再存在的组件中调用.

要正确处理,先使用clearInterval(this.timer),然后设置this.timer = null.

此外,fetch调用是异步的,这可能会导致相同的问题.设为cancelable,如果fetch不完整,则取消.

我希望这有帮助.

Reactjs相关问答推荐

如何将google地址lat收件箱设置为输入值?

使用useEffect挂钩获取数据

为什么我无法访问窗口事件处理程序中的状态?

在带有和设计的表格中禁用和取消选中复选框

如何使用Reducer更新全局变量

需要特定的数学函数来标准化动画持续时间

有没有可能在next.js和ssr中使用tsps?

React-React中是否完全支持基于类的组件?

useEffect不重新渲染

如何修复ReferenceError:在构建过程中未定义导航器

即使配置了 webpack.config.js,html-loader 也不起作用

为什么我的 Next.js (React) 组件只有在页面中时才有效?

Suspense/Await - 解析数据加载/保存到状态后无限循环

需要先填写依赖输入字段,以便其他人工作

@react-three/postprocessing 没有匹配的从 three.module.js 导出以导入WebGLMultisampleRenderTarget

在 React 中将路径与查询变量匹配

为什么接受 useState 返回的函数的 setter 在使用 React 的单个调用中执行两次?

谁能根据经验提供有关 useEffect 挂钩的更多信息

如何使用 UseState 正确测试组件

getAttribute 函数并不总是检索属性值