3 回答
TA贡献1797条经验 获得超4个赞
您在 onChange 处理程序中使用 setState,这将导致重新渲染。这就是您的倒计时重置的原因。我想处理这个问题的一种方法是将 Countdown 放在一个单独的类中并扩展 React.PureComponent 让它为你处理更新。或者,在该类中编写您自己的shouldComponentUpdate(),尽管不建议这样做。
TA贡献1942条经验 获得超3个赞
应用此更改:
import ReactDOM from "react-dom";
import React, { Component } from "react";
import Countdown from "react-countdown-now";
import ReactCodeInput from "react-code-input";
const lengthToken = 6;
class Test extends Component {
countdownDate;
constructor(props) {
super(props);
this.state = {
token: "",
secondsToExpire: 600000
};
this.countdownDate = Date.now() + this.state.secondsToExpire;
}
saveTokenToState = token => {
this.setState({ token });
};
render() {
const renderer = ({ minutes, seconds }) => (
<span>
{minutes}:{seconds}
</span>
);
return (
<div>
<label htmlFor="token">
<ReactCodeInput
inputmode="numeric"
pattern="[0-9]*"
type="number"
name="test"
fields={lengthToken}
value={this.state.token}
onChange={this.saveTokenToState}
/>
</label>
<Countdown renderer={renderer} date={this.countdownDate} />
</div>
);
}
}
TA贡献1812条经验 获得超5个赞
如果存储在到期日,而不是延迟在组件的状态,重新渲染您的组件将不会触发重新计算Date.now() + secondsToExpire的Countdown孩子:
constructor(props) {
super(props);
let date = Date.now() + delay;
this.state = {
token: "",
expirationDate: date
};
}
...
return <div>
...
<Countdown date={this.state.expirationDate} ...>
</div>
添加回答
举报