【问题标题】:How can I initiate my countdown timer with a button click instead of it starting on page load?如何通过单击按钮而不是在页面加载时启动倒数计时器?
【发布时间】:2021-05-14 01:53:46
【问题描述】:

在我的代码下面,我有一个计时器,它会在页面加载后立即开始倒计时。我正在尝试使用 onClick 在按下按钮后启动倒计时,但在页面加载后它仍在启动。如何让它启动 onClick?

import * as React from "react";
import { render } from "react-dom";
import { View, Switch, StyleSheet, Text, Button, TouchableOpacity } from "react-native";

import CircularProgressBar from '../components/CircularProgressBar';

function SimpleTimer() {
  const [counter, setCounter] = React.useState(60);

  function timer () {
    React.useEffect(() => {
        counter > 0 && setTimeout(() => setCounter(counter - 1), 1000);
      }, [counter]);
    
  }

  return (
    <View className="App">
      <Text>Countdown: {counter}</Text>
      <CircularProgressBar percent={counter}></CircularProgressBar>
      <TouchableOpacity><Button style={styles.button} title='start timer' onPress={timer()}></Button></TouchableOpacity>
    </View>
  );
}


export default SimpleTimer;

【问题讨论】:

    标签: reactjs react-native callback


    【解决方案1】:

    我不知道你为什么要使用 useEffect,你应该仔细检查它的用例。除此之外,您还在这里:

    function SimpleTimer() {
      const [counter, setCounter] = React.useState(60);
      const [intervalId, setIntervalId] = React.useState(null)
    
      function timer () {
        if (counter > 0) {
            const id = setInterval(() => setCounter(counter - 1), 1000);
            setIntervalId(id)
        }
      }
    
      return (
        <View className="App">
          <Text>Countdown: {counter}</Text>
          <CircularProgressBar percent={counter}></CircularProgressBar>
          <TouchableOpacity><Button style={styles.button} title='start timer' onPress={timer}></Button></TouchableOpacity>
        </View>
      );
    }
    

    除了 useEffect 问题之外,在启动时触发计时器的是 onPress={timer()} 行。这是一个拼写错误,您不想在渲染时运行该函数,但是当按下按钮时,您应该有onPress={timer}onPress={() =&gt; timer()}

    尽我所能用我所掌握的英语:D

    【讨论】:

    • 这就是我想要的!但是由于某种原因,当单击按钮时,每次单击按钮一次只能倒计时一秒...
    • 当然,抱歉,您正在寻找的是间隔而不是超时。会更新答案。
    • 好的,非常感谢!没问题,解释很好。我很感激。这主要是工作接受现在它正在停止倒计时......这非常有帮助我会尝试继续使用它
    • 我认为它需要以某种方式循环它似乎只运行一次函数......也许是while循环?
    • 找到了,这是 setCounter 的异步问题。很难用我的英语解释,但很容易用谷歌搜索。修复: setCounter(counter => counter - 1)
    猜你喜欢
    • 2020-09-09
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    相关资源
    最近更新 更多