npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

rn-countdown

v1.0.0

Published

A smart countdown component for react-native apps.

Downloads

10

Readme

rn-countdown

npm npm npm npm

适用于 React Native App 的一个倒计时组件,基于 render-props 方式实现,使用者可完全把重心放在 UI 定制上面,无须关注倒计时逻辑实现。

重要更新

由于组件进行了重构,之前版本的大部分 props 有重大变更,罗列如下:

  • overTitle:倒计时结束文本(移除)
  • titleStyle:文本样式(移除)
  • countingStyle:倒计时中的容器样式(移除)
  • countingTitleTemplate:文本模板(移除)
  • countingTitleStyle:倒计时中的文本样式(移除)
  • timeFontStyle:针对时间文本的样式(移除)
  • shouldStartCountdown:是否允许开始倒计时回调(移除)
  • onCountdownOver:重命名为 onDidFinishCountdown,触发机制保持与之前一致(更新)
  • onNetworkFailed:网络出错情况下,点击触发的回调(保留)
  • style:容器样式(保留)
  • time:倒计时总时长(单位秒,保留)
  • activeOpacity:点击时的透明度(新增)
  • children:添加对 children 的一个类型检测,必须为 function(新增)
  • onPress:点击组件的回调(新增,新版本组件将控制权交给了开发人员,通过实例方法按需开启,或是停止倒计时)

以下实例方法将继续保留:

  • startCountdown:立即开始倒计时,如果网络错误,将触发 onNetworkFailed 回调,可按需进行弹框提示处理
  • stopCountdown:立即停止倒计时,将触发 onDidFinishCountdown 回调,按需添加后续处理

支持的版本

React Native 版本 | 对应支持的组件版本 ----------------------- | ------------------------------ 0.48.0+ | v0.3.0+ (NetInfo change -> connectionChange for eventListener) < 0.48.0 | v0.2.1

预览

demo

安装

通过 npm 安装:

// >= 0.48.0
npm install rn-countdown --save

// < 0.48.0
npm install [email protected] --save 

或者基于 yarn 安装:

// >= 0.48.0
yarn add rn-countdown

// < 0.48.0
yarn add [email protected]

使用

import React, { Component } from 'react'
import {
    StyleSheet,
    Text,
    View,
    Dimensions,
    TextInput,
    Button
} from 'react-native'
import Countdown, { CountdownStatus } from 'rn-countdown'

export default class App extends Component {

    state = {
        hasText: false
    };
    phoneNumber = ''

    handleClickCountdown = () => {
        if (!this.phoneNumber) {
            alert('电话号码不能为空!')
            return
        }
        this.countdown && this.countdown.startCountdown()
    };

    handleNetworkFailed = () => alert('network failed')

    handleStopCountdown = () => this.countdown && this.countdown.stopCountdown()

    handleChangeText = text => {
        this.phoneNumber = text;
        this.setState({ hasText: !!this.phoneNumber })
    }

    handleCountdownOver = () => alert('over')

    render() {
        const { hasText } = this.state
        return (
            <View style={styles.container}>
                <View style={styles.phoneCell}>
                    <View style={styles.phoneInfo}>
                        <Text>账号:</Text>
                        <TextInput
                            style={styles.input}
                            placeholder="请输入手机号码"
                            underlineColorAndroid="transparent"
                            onChangeText={this.handleChangeText}
                        />
                    </View>
                    <Countdown
                        ref={r => this.countdown = r}
                        time={10}
                        onPress={this.handleClickCountdown}
                        onNetworkFailed={this.handleNetworkFailed}
                        onDidFinishCountdown={this.handleCountdownOver}
                    >
                        {({ status, time }) => {
                            let title, containerStyle, titleStyle
                            switch (status) {
                                case CountdownStatus.Idle:
                                    title = '发送验证码'
                                    containerStyle = [
                                        styles.countdown,
                                        hasText && { backgroundColor: 'rgb(59, 197, 81)', borderWidth: 0 }
                                    ]
                                    titleStyle = [
                                        styles.countdownTitle,
                                        hasText && { color: '#fff' }
                                    ]
                                    break
                                case CountdownStatus.Counting:
                                    title = `发送中(${time})`
                                    containerStyle = styles.countdown
                                    titleStyle = styles.countdownTitle
                                    break
                                case CountdownStatus.Over:
                                    title = '重新发送'
                                    containerStyle = [
                                        styles.countdown,
                                        hasText && { backgroundColor: 'rgb(59, 197, 81)', borderWidth: 0 }
                                    ]
                                    titleStyle = [
                                        styles.countdownTitle,
                                        hasText && { color: '#fff' }
                                    ]
                                    break
                            }
                            return (
                                <View style={containerStyle}>
                                    <Text style={titleStyle}>{title}</Text>
                                </View>
                            )
                        }}
                    </Countdown>
                </View>
                <Button title="停止" onPress={this.handleStopCountdown}/>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    phoneCell: {
        flexDirection: 'row',
        alignItems: 'center',
        justifyContent: 'space-between',
        paddingHorizontal: 15,
        height: 40,
        borderBottomWidth: StyleSheet.hairlineWidth,
        borderColor: '#ebebeb',
        width: Dimensions.get('window').width,
        backgroundColor: '#fff'
    },
    phoneInfo: {
        flexDirection: 'row',
        alignItems: 'center',
    },
    input: {
        height: 30,
        width: Dimensions.get('window').width * 0.4,
        marginLeft: 10,
        padding: 0,
        fontSize: 14
    },
    countdown: {
        borderRadius: 15,
        borderWidth: StyleSheet.hairlineWidth,
        borderColor: '#ebebeb',
        height: 30,
        width: 100,
        justifyContent: 'center',
        alignItems: 'center',
    },
    countdownTitle: {
        color: '#ccc',
        fontSize: 12
    },
})

参数说明

名称 | 类型 | 是否可选 | 默认值 | 描述 ---------------- | ------ | -------- | ----------- | ----------- style | ViewPropTypes | 是 | 无 | 自定义容器样式,这里应该关注于容器相对于其父组件、兄弟组件的样式,比如:marginpadding 等,真正业务上的 UI 定制,可在 children 中进行定制 time | number | 是 | 30s | 倒计时时长 activeOpacity | number | 是 | 0.75 | 按钮交互时的透明度 children | function | 否 | 无 | 一个返回 React 元素的函数,该函数接受一个参数,其格式为: ({ status: CountdownStatus, time: number }) => React.Element<any> status: - Idle: 默认状态 - Counting: 正在倒计时 - Over: 倒计时结束 onPress | function | 是 | 无 | 点击组件时必会触发的回调 onNetworkFailed | function | 是 | 无 | 网络出错情况下,点击组件的回调,按需添加弹窗处理 onDidFinishCountdown| function | 是 | 无 | 倒计时结束回调

方法

名称 | 描述 ---------------- | ----------- startCountdown | 立即开始倒计时,网络出错情况下,将触发 onNetworkFailed 回调 stopCountdown | 立即停止倒计时,将触发 onDidFinishCountdown 回调

以上方法皆可通过 ref 进行引用触发,比如:this.countdownRef && this.countdownRef.startCountdown()

运行示例

克隆之后,需要先开启 TypeScript 的编译监听:

// 根目录
$ npm install
$ npm start

然后进入到 example 目录,开启服务(当然也可以直接通过 Xcode 或是 Android Studio 运行):

$ cd example
$ npm install
$ npm start