хорошо, setState вызовет некоторые из жизненных циклов этого компонента, повторно выполнит его рендеринг и, между прочим, заново воспроизведет все дочерние элементы этого компонента, вот рабочий пример https://codesandbox.io/s/blazing-resonance-kjoyi
import React, { Component } from "react";
class Clock extends Component {
constructor(props) {
super(props);
this.state = {
time: null
};
this.handleSetTime = this.handleSetTime.bind(this);
this.timer = null;
}
componentDidMount() {
this.handleSetTime();
this.timer = setInterval(this.handleSetTime, 1000);
}
handleSetTime() {
this.setState({
time: new Date().toLocaleTimeString()
});
}
render() {
const { time } = this.state;
return <div className="time">the time is:{time}</div>;
}
componentWillMount() {
clearInterval(this.timer);
this.timer = null;
}
}
export default Clock;
Я предлагаю вам использовать ref, чтобы выбрать элемент dom и обновлять его каждую секунду, делая это, никакой повторной визуализации не будет, и поскольку это будет компонент без состояния, он будет иметь еще лучшую производительность .
вот пример с состоянием с ref https://codesandbox.io/s/still-framework-xxxeg
import React, { Component, createRef } from "react";
class Clock extends Component {
constructor(props) {
super(props);
this.ref = createRef();
this.timer = null;
this.handleUpdateTimer = this.handleUpdateTimer.bind(this);
}
componentDidMount() {
this.handleUpdateTimer();
this.timer = setInterval(this.handleUpdateTimer, 1000);
}
handleUpdateTimer() {
this.ref.current.innerText = new Date().toLocaleTimeString();
}
render() {
return (
<div className="App">
time is: <span ref={this.ref} />
</div>
);
}
componentWillUnmount() {
clearInterval(this.timer);
this.timer = null;
}
}
export default Clock;
и, наконец, лучший компонент без компонента, использующего хуки https://codesandbox.io/s/silent-leftpad-cc4mv
import React, { useRef, useEffect } from "react";
const Clock = () => {
const ref = useRef();
useEffect(() => {
setTimer();
const timer = setInterval(setTimer, 1000);
return () => {
clearInterval(timer);
};
}, []);
const setTimer = () => {
ref.current.innerText = new Date().toLocaleTimeString();
};
return (
<div className="App">
time is : <span ref={ref} />
</div>
);
};
export default Clock;