reactjs - ReactJS UseEffect 方法中的渲染循环问题
问题描述
嗨,我是 ReactJs 的新开发人员。我对 useEffect 渲染有疑问。我有一个示例,我正在尝试随时间更改背景图像,但是 useEffect 使渲染变得如此之多,并且我的背景图像随着时间保持在一个循环中。我只想按照 bg1 bg2 bg3 等顺序更改图像。如何解决这个无限渲染?
我的例子 .tsx
import React, { useEffect, useState } from 'react';
import { connect } from "../../../store/store";
const LeftPart = (props: any) => {
const [value, setValue] = useState(1);
const {loginLeftImagesLength} = props;
const changeLeftBackgroungImage : any = () =>{
const interval = setInterval(() => {
if (value <= loginLeftImagesLength.payload) {
setValue(value+1);
} else{
setValue(1);
}
}, 3000);
return () => clearInterval(interval);
};
useEffect(() => {
changeLeftBackgroungImage();
});
return (
<div className="col-xl-7 col-lg-7 col-md-7 col-sm col-12">
<img id="image" src={"../../../assets/images/bg"+value+".jpg"} style={{ width: "100%", height: "99vh" }} alt="Login Images"></img>
</div >
)
}
export default connect((store: any) => ({ loginLeftImagesLength: store.loginLeftImagesLength }))(LeftPart) as any;
解决方案
你有无限渲染,因为你没有在你的useEffect
useEffect(() => {
changeLeftBackgroungImage();
},[]); // Will run this hook on component mount.
你也可以这样做
useEffect(()=>{
const timer = setTimeout(()=>{
if (value <= loginLeftImagesLength.payload) {
setValue(value+1);
} else{
setValue(1);
}
},3000)
return ()=>{ // Return this function from hook which is called before the hook runs next time
clearTimeout(timer)
}
},[,value]) // RUN THIS HOOK ON componendDidMount and whenever `value` changes
推荐阅读
- c++ - 根据设置的位数对数组进行排序
- vb.net - Visual Sudio - MSAccess 数据库。删除失败。请出主意
- javascript - 如何最好地为 .findAll() 等 Sequelize 函数创建单元测试(使用 Mocha、Chai)
- c - 函数在 main 中调用但不在另一个中时有效
- laravel - Laravel 应用和暴露
- azure - Azure 应用服务找不到新创建的证书
- airflow - DataflowTemplateOperator 参数
- angular - 我如何打开(matdaterangepicker-calendar 以及一些按钮,输入文本)-这是一个通过单击其他组件中的按钮的组件?
- c - 在 C 中使用信号量来保护 for 循环中的变量
- amazon-web-services - API Gateway:REST APIs和HTTP APIs在同一个域名上的混合只能通过API Gateway的V2 DomainName接口错误来完成