写了一个基于React+Redux的仿Github进度条

曾经实现过Angular版,这次感觉用了高大上的React却写了更多的代码,需要的配置也更多了,有利有弊吧。

但这个“导航条问题”很有意思,涉及到在Redux中写timer,其实我很困惑,到底如何完美模拟用户的页面加载,

貌似浏览器并没有提供进度API,只能以这样拙劣的方式进行模拟,有兴趣的朋友不妨与我交流。

代码附上:

LoadingBar.jsx

import React, { Component, PropTypes } from ‘react‘;
import { connect } from ‘react-redux‘;

export class LoadingBar extends Component {
  constructor(props) {
    super(props);

    this.state = {
      timer: null,
      style: {
        display: ‘none‘,
        position: ‘absolute‘,
        width: ‘0%‘,
        height: ‘3px‘,
        backgroundColor: ‘blue‘,
        transition: ‘width 400ms ease-out, height 400ms linear‘
      }
    };
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.status) {
      let progress = 0;
      this.setState({
        style: Object.assign({}, this.state.style, {
          width: ‘0%‘
        })
      });

      let timer = setInterval(() => {
        if (progress <= (100 - nextProps.step)) {
          this.setState({
            style: Object.assign({}, this.state.style, {
              width: `${progress += nextProps.step}%`,
              display: ‘block‘
            })
          });
        }
      }, nextProps.speed);

      this.setState({
        timer: timer
      });
    } else {
      clearInterval(this.state.timer);

      this.setState({
        timer: null,
        style: Object.assign({}, this.state.style, {
          width: ‘100%‘,
          display: ‘none‘
        })
      });
    }
  }

  render() {
    return (
      <div>
        <div style={this.state.style} className={this.props.className}></div>
        <div style={{ display: ‘table‘, clear: ‘both‘ }}></div>
      </div>
    )
  }
}

LoadingBar.propTypes = {
  className: PropTypes.string,
  speed: PropTypes.number,
  step: PropTypes.number,
  status: PropTypes.bool,
}

function mapStateToProps(state) {
  return {...state.loading};
}

export default connect(mapStateToProps)(LoadingBar)

App.jsx

import LoadingBar from ‘LoadingBar‘;

const App = ({children}) => {
  return (
    <div>
      <LoadingBar speed={5} step={2} />
      {children}
    </div>
  );
};

App.propTypes = {
  children: PropTypes.object
};

export default App;

loadingReducer.js

export default function loading(
  state = {
    status: false
  },
  action = {}
) {
  switch (action.type) {
    case ‘SHOW_LOADING‘:
      return Object.assign({}, state, {
        status: true,
      });
    case ‘HIDE_LOADING‘:
      return Object.assign({}, state, {
        status: false,
      });
    default:
      return state
  }
}

loadingActions.js

export function show() {
  return { type: ‘SHOW_LOADING‘ }
}

export function hide() {
  return { type: ‘HIDE_LOADING‘ }
}

loadingMiddleware.js

import { show, hide } from ‘./loadingActions‘;

const defaultTypeSuffixes = [‘REQUEST‘, ‘SUCCESS‘, ‘FAILURE‘]

export default function loadingBarMiddleware(config = {}) {
  const typeSuffixes = config.typeSuffixes || defaultTypeSuffixes;

  return ({ dispatch }) => next => action => {
    next(action);

    if (action.type === undefined) {
      return;
    }

    const [PENDING, FULFILLED, REJECTED] = typeSuffixes;

    const isPending = `_${PENDING}`;
    const isFulfilled = `_${FULFILLED}`;
    const isRejected = `_${REJECTED}`;

    if (action.type.indexOf(isPending) !== -1) {
      dispatch(show());
    } else if (action.type.indexOf(isFulfilled) !== -1 || action.type.indexOf(isRejected) !== -1) {
      dispatch(hide());
    }
  }
}

配置Store

import { createStore, applyMiddleware } from ‘redux‘;
import { loadingMiddleware } from ‘loadingMiddleware‘;
import rootReducer from ‘./reducers‘;

const store = createStore(
  rootReducer,
  applyMiddleware(loadingMiddleware())
)

配置RootReducer

import { combineReducers } from ‘redux‘;
import { loadingReducer } from ‘./loadingReducer‘;

const reducer = combineReducers({
  loading: loadingReducer,
});
时间: 2024-08-28 06:39:00

写了一个基于React+Redux的仿Github进度条的相关文章

一个不是那么优美的圆形进度条续(基本还原原应用里面的效果)

之前帮别人写了一个不是那么优美的圆形进度条,效果图大家也看过了.但是后某人不满意,说原应用是倒计时时间最后5s,才开始显示数字的,同时转完一圈需要的时间只能是30s左右.然后我掐时间看了一下虽然总时间设置的是30s,但是总共转完一圈却耗费了50多秒的样子. 问题出来了: 1. 转圈总时间30s不正确 2. 数字显示时间不正确 3. 数字1的动画没原应用的好(2144手机令牌) 花了一个小时搞了一下,忍不住终于射出来了什么东西,解决了上面的3个问题(请看1从有到无):国际惯例效果图先行,先看下改善

基于Jquery的音乐播放器进度条插件

自己基于豆瓣FM的ui仿写qq音乐时,基于Jquery手写的进度条插件,效果图如下: 主要特色: ① 可自适应挂载元素的宽度,也可以自己设置进度条宽度: ② 支持部分默认参数修改(具体见使用说明): ③ 允许最大时间为23:59:59,高于此值将默认修改为此值: ④ 可以自己控制进度条动画的开关及重置: ⑤ 可以获取进度条当前时间和宽度,与H5的audio标签协调使用. 使用说明: /* * 功能描述:播放器进度条 * 参数: * option:挂载父元素 * inTime:进度条时间长度 *

Html5基于SVG的扁平风格圆形进度条javascript插件教程

一.使用方法 使用该圆形进度条需要引入circleDonutChart.js文件. <script type="text/javascript" src="circleDonutChart.js"></script> 二.Html结构 你可以使用一个空的<div>元素来制作圆形进度条. <div id="example1"></div> 三.初始化插件 要制作圆形进度条,可以使用下面的方

mk-js,一个基于react、nodejs的全栈框架

前言 在这个前端技术爆炸的时代,不自己写套开源框架出门都不好意思跟别人说自己搞前端.去年年初接触的react,16年7月份在github开源了一套针对react.redux探索的项目,近期和伙伴们一起重构了这个项目,等待大伙拍砖...搞不明白为什么一发布到首页区就会被移除... 框架介绍 mk框架 = monkey king框架 = 齐天大圣框架 基础技术栈:react.redux.immutable.antd.webpack.nodejs.hapi.sequelize.node-zookeep

用 C 语言和 nkCEngine 写了一个基于命令的迷你脚本编译器与脚本播放器

首先,博主感到非常高兴,就在很久以前,博主就想写一个属于自己的脚本引擎,哪怕功能再简单也好,只要能跑起来就行了,直到今天,博主终于向这个梦想迈出了第一步,将脚本引擎的雏形给做了出来,因为这个脚本系统属于 nkCEngine 的一部分,所以博主将其命名为 nkScript,nkScript 是一门基于命令的语言,没有复杂的函数调用,没有复杂的循环语句,它拥有的,是简单的数值运算语句.条件跳转语句.无条件跳转语句.命令语句,等等:nkScript 的开发目标主要是用于制作简单的文字冒险游戏,就是那种

写了一个基于微信公众平台的图片识别应用!

这个东西的来由主要是因为我之前看到一些默生的植物.水果等不知道名字,心里痒痒的,上百度又无从搜索.效果请看图... 想体验的同学请关于博主的微信公众平台微信号: webworking 或 扫下面二维码进行关注:

一个简短小巧的带百分比的进度条

大家在安装程序或下载文件时,通常都能看到进度条,提示你当前任务的进度.其实,在python中实现这个功能很简单,下面是具体代码.在实际应用中,你完全可以根据自己的要求进行修改!比如,示例中是通过time.sleep()方法进行时间延迟,你完全可以根据实际的程序运行耗时进行控制:同样,在进度百分比处,你也可以显示实际的进度比,而不是例子中机械的自增百分比. import sys import time def view_bar(num, total): rate = num / total rat

Android自定义控件实现一个带文本与数字的圆形进度条

实现的效果图如下所示: 第一步:绘制下方有缺口的空心圆,称为外围大弧吧 anvas.clipRect(0, 0, mWidth, mHeight / 2 + radius - textHeight * 3 / 4); 第二步:计算绘制圆弧进度条时的起始角度,设置为外围大弧的左端点为进度值得起点,扫过的角度所占外围大弧的百分比就是进度值 第三步:绘制数字.文字.百分号 第四步:使用Handler Runnable 和DecelerateInterpolator是进度条和数字动起来 测试代码: fi

基于react的nextjs服务端渲染框架学习使用

开发文档 https://nextjs.frontendx.cn/ 源码 该博客的示例代码我已经上传到github,欢迎star或者fork react-next-hello Next介绍 Next.js是一个基于React的一个服务端渲染简约框架.它使用React语法,可以很好的实现代码的模块化,有利于代码的开发和维护. Next.js带来了很多好的特性: 默认服务端渲染模式,以文件系统为基础的客户端路由 代码自动分隔使页面加载更快 (以页面为基础的)简洁的客户端路由 以webpack的热替换