javascript - 递减计数器有奇怪的行为

标签 javascript react-native

我正在使用 setInterval 构建一个计数器,它每秒减少时间,在开始的几秒钟内工作,然后卡住并同时增加和减少。

在我的例子中,我从 5:00 (m:ss) 开始,几秒钟后大约 4:49 开始增加然后减少......

不确定发生了什么。

start = () => {
        console.log('starting')
        let timeLeft = this.state.totalDuration
        setInterval(() => {
            if (timeLeft > 0) {
                timeLeft = (timeLeft - 1000)
                this.setState({ totalDuration: timeLeft })
            }
        }, 1000)
    }



 render() {

        return (
            <View style={styles.container}>
                <Timer interval={this.state.totalDuration}></Timer>
                <ButtonsRow>
                    <RoundButton title='Reset' color='white' background='grey'></RoundButton>
                    <RoundButton onPress={this.start()} title='Start' color='white' background='red'></RoundButton>
                </ButtonsRow>
</View>

最佳答案

您正在间隔函数外的闭包中捕获 timeLeft 变量。因此,当按下开始时它会被捕获一次,之后保持相同的值。而是使用接受回调的 setState 变体。

start = () => {
        console.log('starting')
        const interval = setInterval(() => {
             this.setState(state => { 
                  if (state.totalDuration > 0) 
                    return { totalDuration : state.totalDuration - 1000 }
                  else {
                    clearInterval(interval)
                    return {}
                  }
              })
        }, 1000)
    }

关于javascript - 递减计数器有奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56620146/

相关文章:

javascript - 使用连续的 D3.html() 方法连接 html;而不是替换

javascript - 为什么我的 onclick 函数没有被调用?

java - 使用 SpringBoot 和 React Native 的提醒推送通知

Javascript IFFE TypeError "string"不是函数

javascript - 如何从大标题平滑过渡到小静态标题 (Javascript/CSS)

javascript - vue 如何监听子列表变化或者v-model

react-native - 全局更改导航背景颜色

java - 如何在 React Native (android) 中启用 Tls 1.1 和 1.2

javascript - React Native TextInput 显示后不会聚焦

javascript - 使消息消失。 react native