反应为什么我的clearInterval无法停止setInterval?

Zihao Li

我对React完全陌生。我尝试实现的是一个计时器。当单击小时,分钟或秒时,计时器将停止,并且在单击Enter按钮后,对于选定的计时器,它将变成一个输入字段,它不应再显示任何输入字段并重新开始计时。看起来怎么样

单击flexbox容器时,我尝试停止将新道具传递给子组件。我写了一个handleClick函数和setInterval()或clearInterval()基于状态中的update变量。

我想要的是,当我单击小时/分钟/秒中的任何一个时,选择字段将更改为输入字段,并且计时器停止。一旦我按回车,它将返回到计时器。

class Timer extends React.Component{
    constructor(props){
        super (props);
        this.timerRef = React.createRef();
        this.state = {
            hh: new Date().getHours().toString().padStart(2,"0"),
            mm: new Date().getMinutes().toString().padStart(2,"0"),
            ss: new Date().getSeconds().toString().padStart(2,"0"),
            suffix: new Date().getHours() > 12 ? "PM" : "AM",
            update:true,
        };
    }

    tick() {
        this.setState({
            hh: new Date().getHours().toString().padStart(2,"0"),
            mm: new Date().getMinutes().toString().padStart(2,"0"),
            ss: new Date().getSeconds().toString().padStart(2,"0"),
            suffix: new Date().getHours() > 12 ? "PM" : "AM",
        })
    }


    componentDidMount(){
        this.intervalId = setInterval(
            () => this.tick(), 1000
        );
    }
    
    componentWillUnmount(){
        clearInterval(this.intervalId);
    }

    handleClick(){       
        this.setState(state => ({update: !state.update}));
        console.log("1",this.state.update);
        if (this.state.update){
            this.intervalId = setInterval(
                () => this.tick(), 1000
            );
            console.log("2 set interval",this.intervalId);
        }
        else{
            clearInterval(this.intervalId);
            console.log("2 clear interval");
        }
    }

    render() {
        const { hh, mm, ss, suffix } = this.state;
        return (
          <div className="box" > London Clock
              <div className="flexbox-container" onClick={() => this.handleClick()}>
                <Content time={hh}></Content>
                <div><p>:</p></div>
                <Content time={mm}></Content>
                <div><p>:</p></div>
                <Content time={ss}></Content>
                <div className="suffix"><p>{suffix}</p></div>
              </div>
          </div>
        );
    }
}

class Content extends React.Component {
    state = {
        editMode: false,
        time: ""
    };

    componentDidMount(){
        this.setState({
            time: this.props.time,
        })
    }
    
    
    handleKeyDown(event){
        console.log(event,event.key === 'Enter');
        if (event.key === 'Enter'){
            this.setState({
                editMode: false,
            })
        } 
    }
    
    render() {
        const {editMode} = this.state;
        return (
            <div> 
              {editMode? (
                    <p>
                        <input
                        defaultValue={this.props.time}
                        onKeyPress={e => this.handleKeyDown(e)}
                    />
                    </p>
              ) : (
                    <p onClick={() => this.setState({ editMode: true })}>{this.props.time}</p>
              )}
            </div>
          );
    }
}

ReactDOM.render(
    <Timer/>,
    document.body
  );
.flexbox-container {
    display: flex;
    flex-direction: row;
}

.suffix{
    padding-left: 20px;
}

.box{
    border-style: solid;
    padding: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

杜比

装入组件后,它将开始一个间隔并将其分配给intervalId

您的点击处理程序会修改状态,然后立即尝试查看状态,而无需等待其更新。此时状态可能尚未更新,因此它重新分配了间隔,从而导致了僵尸更新程序。

将回调传递给setState(updater, [callback])或将interval-logic移至componentDidUpdate,这将允许您删除间隔逻辑的重复数据

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我无法控制 setinterval 和 clearinterval javascript?

来自分类Dev

为什么setInterval不能被clearInterval停止

来自分类Dev

无法使用clearInterval停止setInterval

来自分类Dev

为什么我无法清除setInterval?

来自分类Dev

为什么我无法清除setInterval?

来自分类Dev

为什么我的React中的clearInterval无法正常工作?

来自分类Dev

Javascript clearInterval()无法正常工作,如何停止setInterval()?

来自分类Dev

为什么我的scrapy响应为空?

来自分类Dev

反应为什么卸载组件速度慢

来自分类Dev

为什么我的反应状态无法正确更新?

来自分类Dev

为什么我的班级样式无法被识别?反应

来自分类Dev

为什么babel预设反应无法解析我的JSX?

来自分类Dev

Javascript:停止使用 clearInterval 时的 setInterval 计时器无法再次重新启动

来自分类Dev

clearInterval停止setInterval完全基于时间工作

来自分类Dev

每次单击如何停止(clearInterval)setInterval

来自分类Dev

clearInterval()不会停止setInterval()javascript

来自分类Dev

为什么我的程序“停止”了?

来自分类Dev

为什么setInterval无法正常工作?

来自分类Dev

为什么我无法在chrome控制台中看到我的对象的反应?

来自分类Dev

反应为什么调用函数对其进行初始化时状态不会更新?

来自分类Dev

为什么在我的表组件反应中无法映射对象数组?

来自分类Dev

为什么给我“无法读取未定义的属性'deleteProduct'”错误反应

来自分类Dev

nodejs-为什么setInterval突然停止工作?

来自分类Dev

停止setInterval只能运行一次,为什么?

来自分类Dev

您能给我些什么线索,为什么“无法在已停止的SparkContext上调用方法”?

来自分类Dev

为什么clearInterval()函数没有停止JavaScript计时器?

来自分类Dev

为什么我的快速排序无法对大于35000的阵列停止工作?(C ++)

来自分类Dev

反应-我无法停止在表格内传播标签点击

来自分类Dev

我如何找出为什么gdb停止了

Related 相关文章

  1. 1

    为什么我无法控制 setinterval 和 clearinterval javascript?

  2. 2

    为什么setInterval不能被clearInterval停止

  3. 3

    无法使用clearInterval停止setInterval

  4. 4

    为什么我无法清除setInterval?

  5. 5

    为什么我无法清除setInterval?

  6. 6

    为什么我的React中的clearInterval无法正常工作?

  7. 7

    Javascript clearInterval()无法正常工作,如何停止setInterval()?

  8. 8

    为什么我的scrapy响应为空?

  9. 9

    反应为什么卸载组件速度慢

  10. 10

    为什么我的反应状态无法正确更新?

  11. 11

    为什么我的班级样式无法被识别?反应

  12. 12

    为什么babel预设反应无法解析我的JSX?

  13. 13

    Javascript:停止使用 clearInterval 时的 setInterval 计时器无法再次重新启动

  14. 14

    clearInterval停止setInterval完全基于时间工作

  15. 15

    每次单击如何停止(clearInterval)setInterval

  16. 16

    clearInterval()不会停止setInterval()javascript

  17. 17

    为什么我的程序“停止”了?

  18. 18

    为什么setInterval无法正常工作?

  19. 19

    为什么我无法在chrome控制台中看到我的对象的反应?

  20. 20

    反应为什么调用函数对其进行初始化时状态不会更新?

  21. 21

    为什么在我的表组件反应中无法映射对象数组?

  22. 22

    为什么给我“无法读取未定义的属性'deleteProduct'”错误反应

  23. 23

    nodejs-为什么setInterval突然停止工作?

  24. 24

    停止setInterval只能运行一次,为什么?

  25. 25

    您能给我些什么线索,为什么“无法在已停止的SparkContext上调用方法”?

  26. 26

    为什么clearInterval()函数没有停止JavaScript计时器?

  27. 27

    为什么我的快速排序无法对大于35000的阵列停止工作?(C ++)

  28. 28

    反应-我无法停止在表格内传播标签点击

  29. 29

    我如何找出为什么gdb停止了

热门标签

归档