最终编辑:
请参见下面的工作代码:
import React, { Component } from 'react';
var images = [
"https://www.royalcanin.com/~/media/Royal-Canin/Product-Categories/cat-adult-landing-hero.ashx",
"https://upload.wikimedia.org/wikipedia/commons/4/4d/Cat_March_2010-1.jpg"
]
class App extends Component {
constructor(props) {
super(props);
this.state = { imgPath: "url(" + images[1] + ")" };
}
componentDidMount() {
this.interval = setInterval(() => {
this.setState({ imgPath: "url(" + images[0] + ")" })
}, 1000);
}
componentWillUnmount() {
clearInterval(this.interval);
}
render() {
return (
<div className="App">
<div className='dynamicImage' style={{ backgroundImage: this.state.imgPath }} >
{console.log(this.state.imgPath)}
</div>
</div >
);
}
}
原始螺纹:
我正在尝试使用setInterval()每隔X秒动态地更改图像。
我只是不知道setInterval应该放在代码中的什么位置,或者它的输出应该是什么。
我当前的代码是:
import React, { Component } from 'react';
// Paths to my images
var images = [
"https://www.royalcanin.com/~/media/Royal-Canin/Product-Categories/cat-adult-landing-hero.ashx",
"https://upload.wikimedia.org/wikipedia/commons/4/4d/Cat_March_2010-1.jpg"
]
var imgPath = "url(" + images[1] + ")" // Set original value of path
function f1() {
imgPath = "url(" + images[0] + ")" // Change path when called ?
}
class App extends Component {
render() {
setInterval(f1, 500); // Run f1 every 500ms ?
return (
<div className="App">
<div className='dynamicImage' style={{ backgroundImage: imgPath }} > // Change background image to one specified by imgPath
</div>
</div >
);
}
}
export default App;
当前代码输出第一个imgPath的URL,但是无法将其更新为函数f1中指定的URL。据我所知,函数f1确实可以运行,因为将其删除或设置未定义的变量确实会返回错误。我只是无法更改imgPath。
关于我做错了什么或如何改进代码的任何想法?
欢呼
编辑:注释代码+删除了不必要的行
答案 0 :(得分:1)
您可能想使用this.props
或this.state
来存储imgPath
,否则React不会知道您已进行任何更改。
答案 1 :(得分:1)
将图像路径置于状态和componentDidMount中,使用setInterval并在其内部使用setState更改图像路径。
答案 2 :(得分:1)
您可以创建与此类似的无限循环,您可能需要使用图像URL数组并为此编写一些逻辑。但是如您所见,我为函数setImage()
创建了一个无限循环:
constructor(props) {
super();
this.state = {
image1: props.imageUrls[0],
image2: props.imageUrls[1],
changeImage: true
};
this.setImage();
}
setImage() {
setTimeout(() => {
this.setState({ changeImage: !this.state.changeImage }, this.setImage());
}, 3000);
}
答案 3 :(得分:0)
您需要使用componentDidMount()React Lifecycle方法来注册setInterval函数。
这是一个可行的例子
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
images: [
"https://picsum.photos/200/300/?image=523",
"https://picsum.photos/200/300/?image=524"
],
selectedImage: "https://picsum.photos/200/300/?image=523"
};
}
componentDidMount() {
setInterval(() => {
this.setState(prevState => {
if (prevState.selectedImage === this.state.images[0]) {
return {
selectedImage: this.state.images[1]
};
} else {
return {
selectedImage: this.state.images[0]
};
}
});
}, 1000);
}
render() {
return (
<div className="App">
<img src={this.state.selectedImage} />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
您可以更改代码并在此处找到实时演示: https://codesandbox.io/s/0m12qmvprp
答案 4 :(得分:0)
我会将所有变量都移到组件中,并且如Akash Salunkhe所建议的那样,使用componnentDidMount设置setInterval。不要忘记在卸载组件时清除间隔。
此答案也适用于使用任意数量的图像。
class App extends React.Component {
constructor(props) {
super(props);
const images = [
"https://www.royalcanin.com/~/media/Royal-Canin/Product-Categories/cat-adult-landing-hero.ashx",
"https://www.petfinder.com/wp-content/uploads/2013/09/cat-black-superstitious-fcs-cat-myths-162286659.jpg",
"https://upload.wikimedia.org/wikipedia/commons/4/4d/Cat_March_2010-1.jpg"
];
this.state = {
images,
currentImg: 0
}
}
componentDidMount() {
this.interval = setInterval(() => this.changeBackgroundImage(), 1000);
}
componentWillUnmount() {
if (this.interval) {
clearInterval(this.interval);
}
}
changeBackgroundImage() {
let newCurrentImg = 0;
const {images, currentImg} = this.state;
const noOfImages = images.length;
if (currentImg !== noOfImages - 1) {
newCurrentImg = currentImg + 1;
}
this.setState({currentImg: newCurrentImg});
}
render() {
const {images, currentImg} = this.state;
const urlString = `url('${images[currentImg]}')`;
return (
<div className="App">
<div className='dynamicImage' style={{backgroundImage: urlString}} >
</div>
</div >
);
}
}
答案 5 :(得分:0)
@Anurag是正确的。您需要在setInterval
中使用componentDidMount
,如果要重新渲染render方法,请确保调用this.setState
。当然,这要求您将图像路径存储在this.state