首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用clearInteval让计时器在ReactJS中自我清除?

如何使用clearInteval让计时器在ReactJS中自我清除?
EN

Stack Overflow用户
提问于 2020-01-11 21:15:47
回答 1查看 79关注 0票数 0

我是新的反应,我试图写一个反应组件,组件有几个特点。

'stop'.

  • continue

  • 用户可以输入一个随机数,然后在页面中显示数字。

  • 实现了一个文本值为“开始”的按钮,一旦单击该按钮,所显示的数字值将每1秒减少一个,文本值将变为“

  • 单击”按钮,减去一个按钮,按钮的文本值将返回“开始”。当数字减去到0时,

  • 将自动停止其自身。

我已经实现了前三个特性。但我不知道如何开始最后一次。我应该设置另一个clearInteval吗?当计时器下降到0的时候,基于if statement

代码在这里:

代码语言:javascript
运行
复制
    var myTimer;

    class App extends Component {
      constructor(props) {
        super(props);
        this.state = {
          details: [{ id: 1, number: "" }],
          type: false
        };
        this.handleClick = this.handleClick.bind(this);
      }
      changeNumber = (e, target) => {
        this.setState({
          details: this.state.details.map(detail => {
            if (detail.id === target.id) {
              detail.number = e.target.value;
            }
            return detail;
          })
        });
      };

      handleClick = () => {
        this.setState(prevState => ({
          type: !prevState.type
        }));
        if (this.state.type === false) {
          myTimer = setInterval(
            () =>
              this.setState({
                details: this.state.details.map(detail => {
                  if (detail.id) {
                    detail.number = parseInt(detail.number) - 1;
                  }
                  return detail;
                })
              }),
            1000
          );
        }
        if (this.state.type === true) {
          clearInterval(myTimer);
        }
      };

      render() {
        return (
          <div>
            {this.state.details.map(detail => {
              return (
                <div key={detail.id}>
                  Number:{detail.number}
                  <input
                    type="number"
                    onChange={e => this.changeNumber(e, detail)}
                    value={detail.number}
                  />
                  <input
                    type="button"
                    onClick={() => this.handleClick()}
                    value={this.state.type ? "stop" : "start"}
                  />
                </div>
              );
            })}
          </div>
        );
      }
    }

    export default App;
EN

回答 1

Stack Overflow用户

发布于 2020-01-11 21:42:09

只需加上

代码语言:javascript
运行
复制
if (detail.number === 0) {
 clearInterval(myTimer);
}

在……里面

代码语言:javascript
运行
复制
handleClick = () => {

    this.setState(prevState => ({
        type: !prevState.type
    }));

    if (this.state.type === false) {
        myTimer = setInterval(
            () =>
                this.setState({
                    details: this.state.details.map(detail => {
                        if (detail.id) {
                            detail.number = parseInt(detail.number) - 1;
                            if (detail.number === 0) {
                                clearInterval(myTimer);
                            }
                        }
                        return detail;
                    })
                }),
            1000
        );
    }
    if (this.state.type === true) {
        clearInterval(myTimer);
    }
};

这里有一个关于Hooks的解决方案:)

代码语言:javascript
运行
复制
const Test2 = () => {

    const [on, setOn] = useState(false)

    const initialDetails = [{ id: 1, number: "" }]
    const [details, setDetails] = useState(initialDetails)

    const changeNumber = (e, target) => {
        setDetails({ details: details.map(detail => { if (detail.id === target.id) { detail.number = e.target.value; } return detail; }) });
        if (this.state.details.number === 0) { setOn(false) }
    };


    const handleClick = () => {
        if (on === false) {myTimer = setInterval(() =>
                    setDetails({details: details.map(detail => {if (detail.id) {detail.number = parseInt(detail.number) - 1; if (detail.number === 0) {clearInterval(myTimer);} }
                            return detail;})}),1000);}
        if (on === true) { clearInterval(myTimer); }
    };

    return (
        <div>
            {details.map(detail => {
                return (
                    <div key={detail.id}>
                        Number:{detail.number}
                        <input
                            type="number"
                            onChange={e => changeNumber(e, detail)}
                            value={detail.number}
                        />
                        <input
                            type="button"
                            onClick={() => handleClick()}
                            value={on ? "stop" : "start"}
                        />
                    </div>
                );
            })}
        </div>
    )
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59698693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档