反应原生显示当前时间并实时更新秒数

时间:2016-12-23 02:54:18

标签: reactjs timer react-native clock

我想在响应原生应用程序(如时钟)中显示当前时间(MM / DD / YY hh:mm:ss),并且每秒都获得更新,我尝试使用新的Date()并将其设置为状态,但是除非我刷新页面,否则时间不会更新。 我也尝试在render()中使用setInterval函数,它确实有更新,但它对CPU来说很昂贵。有没有一种很好的方法来实现这个功能?

state = {
    curTime: null,
}
render(){
    setInterval(function(){this.setState({curTime: new  Date().toLocaleString()});}.bind(this), 1000);
    return (
        <View>
            <Text style={headerStyle.marginBottom15}>Date: {this.state.curTime}</Text>
        </View>
    );
}

6 个答案:

答案 0 :(得分:22)

setInterval移至componentDidMount函数。

像这样:

  componentDidMount() {
    setInterval( () => {
      this.setState({
        curTime : new Date().toLocaleString()
      })
    },1000)
  }

这将改变状态并每1秒更新一次。

我在RNPlayground中做了一个简单的例子。看一看 : here

答案 1 :(得分:9)

此方法正常运行并显示 MM / DD / YY hh:mm:ss 格式

class Clock extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          time: new Date().toLocaleString()
        };
      }
      componentDidMount() {
        this.intervalID = setInterval(
          () => this.tick(),
          1000
        );
      }
      componentWillUnmount() {
        clearInterval(this.intervalID);
      }
      tick() {
        this.setState({
          time: new Date().toLocaleString()
        });
      }
      render() {
        return (
          <p className="App-clock">
            The time is {this.state.time}.
          </p>
        );
      }
    }

原始链接:https://openclassrooms.com/courses/build-web-apps-with-reactjs/build-a-ticking-clock-component

答案 2 :(得分:7)

在react hooks中,可以这样完成:

import React, { useState, useEffect } from "react";

const [dt, setDt] = useState(new Date().toLocaleString());

useEffect(() => {
    let secTimer = setInterval( () => {
      setDt(new Date().toLocaleString())
    },1000)

    return () => clearInterval(secTimer);
}, []);

答案 3 :(得分:3)

我得到了答案。以下代码也有效。

componentWillMount(){
    setInterval(function(){
        this.setState({
            curTime: new Date().toLocaleString()
        })
    }.bind(this), 1000);
}

答案 4 :(得分:2)

我建议您更喜欢使用setTimeout而不是setInterval,实际上,浏览器可能会被繁重的处理所压倒,在这种情况下,您可能更愿意更频繁地更新时钟而不是排队多次更新国家。

使用setTimeout,当隐藏页面时,利用页面可见性API完全停止时钟也会更容易一些(参见https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API)。

export default class MyClock {
  constructor(props) {
    super(props);

    this.state = {
      currentTime: Date.now(),
    }; 
  }

  updateCurrentTime() {
    this.setState(state => ({
      ...state,
      currentTime: Date.now(),
    }));
    this.timeoutId = setTimeout(this.updateCurrentTime.bind(this), 1000);
  }

  componentWillMount() {
    this.updateCurrentTime();
    document.addEventListener('visibilitychange', () => {
      if(document.hidden) {
        clearTimeout(this.timeoutId);
      } else {
        this.updateCurrentTime();
      }
    }, false);
  }

  componentWillUnmount() {
    clearTimeout(this.timeoutId);
  }
} 

答案 5 :(得分:1)

完整代码在这里:

import React, { Component } from 'react';
import { Text, View } from 'react-native';


export default class KenTest extends Component {

  componentDidMount(){ 

    setInterval(() => (

      this.setState(
        { curTime : new Date().toLocaleString()}

      )
    ), 1000);
  }


state = {curTime:new Date().toLocaleString()};


  render() {
    return (
      <View>
  <Text>{'\n'}{'\n'}{'\n'}The time is: {this.state.curTime}</Text>

      </View>
    );
  }
}