gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:56:50 24 4
gpt4 key购买 nike

警告: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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com