javascript - 警告 react : setState(. ..):只能更新已安装或正在安装的组件

标签 javascript reactjs redux

警告:setState(...):只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了 setState()。这是一个空操作。

这是一个 react 应用程序,其中横幅固定在屏幕上并传递随机图像。它的编写方式会生成相关警告。

import React from "react";
import Lightbox from "react-image-lightbox";
import logo from "./logo.png";

class Banner extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      images: [],
      currentImage: logo,
      isOpen: false,
      sidebarOpen: true
    };
  }

  async componentWillMount() {
    await this.getBanners();
    this.setState({ currentImage: this.state.images[0].url });

    setInterval(async () => {
      await this.getBanners();
    }, 300000);

    let i = 0;
    setInterval(
      () => {
        this.setState({ currentImage: this.state.images[i].url });
        if (i >= this.state.images.length - 1) {
          i = 0;
        } else {
          i++;
        }
      },
      10000,
      i
    );
  }

  async getBanners() {
    const data = await (await fetch("/api/banners/active")).json();
    if (data.true) {
      this.setState({ images: data.true });
    }
  }

  render() {
    const { isOpen } = this.state;

    return (
      <div>
        {isOpen && (
          <Lightbox
            mainSrc={this.state.currentImage}
            onCloseRequest={() => this.setState({ isOpen: false })}
          />
        )}
        <footer>
          <a>
            <img
              width={270}
              height="200"
              src={this.state.currentImage}
              onClick={() => this.setState({ isOpen: true })}
              alt="idk"
            />
          </a>
        </footer>
      </div>
    );
  }
}

export default Banner;

有人可以帮忙改进这段代码吗?

最佳答案

您可以将从 setInterval 返回的数字放在您的实例上,并在 componentWillUnmount 中使用 clearInterval 停止间隔,这样它们就不会继续在组件卸载后运行。

class Banner extends React.Component {
  constructor(props) {
    super(props);

    this.bannerInterval = null;
    this.currentImageInterval = null;
    this.state = {
      images: [],
      currentImage: logo,
      isOpen: false,
      sidebarOpen: true
    };
  }

  async componentDidMount() {
    await this.getBanners();
    this.setState({ currentImage: this.state.images[0].url });

    this.bannerInterval = setInterval(async () => {
      await this.getBanners();
    }, 300000);

    let i = 0;
    this.currentImageInterval = setInterval(
      () => {
        this.setState({ currentImage: this.state.images[i].url });
        if (i >= this.state.images.length - 1) {
          i = 0;
        } else {
          i++;
        }
      },
      10000,
      i
    );
  }

  componentWillUnmount() {
    clearInterval(this.bannerInterval);
    clearInterval(this.currentImageInterval);
  }

  // ...
}

关于javascript - 警告 react : setState(. ..):只能更新已安装或正在安装的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55340431/

相关文章:

javascript - 通过单击按钮删除子项

javascript - React - 组件中的折射状态

javascript - immutablejs (react/redux) , "push"进入不可变状态

javascript - Redux-Toolkit createAsyncThunk Dispatch 显示为未定义

javascript - 有没有办法在浏览器中本地运行 C 程序?

javascript - 如何根据条件应用AngularJS ng-class?

javascript - 哈希登录 jQuery 调用

reactjs - 将异步结果从父组件传递到子组件 react 功能组件

html - 如何在 React 中为 svg 图像添加颜色

reactjs - React Redux : More containers v. 秒。更少的容器