热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

React:Redux实战案例分析(第三篇)

大家好,我是梅巴哥er。本文将深入探讨Redux框架中的第三个实战案例,具体实现每两秒自动点击按钮以触发颜色变化的功能。该案例中,一个关键点在于是否需要使用异步操作来处理定时任务,我们将详细分析其必要性和实现方式。通过这一实例,读者可以更好地理解Redux在实际项目中的应用及其异步处理机制。

大家好,我是梅巴哥er。本篇介绍redux第三个小案例,每2秒自动点击按钮触发变色。这个案例有个需要特别注意的地方是,这是否需要用到异步action? 在什么情况下会用到异步action?

所谓异步,就是上一个事件和下一个事件不是同步进行的。
在该案例中,上一个事件是点击,下一个事件是触发变色。这两个事件是同步的,即点击后马上就会变色。只不过是每两次点击之间会间隔两秒时间。所以,这个案例仍然是同步action。

如果,案例是点击2秒后触发变色,那么点击时间和触发变色的时间就是先后进行,而非同步进行,这时候就是异步action了。

这个案例用了两种方法写的。方便大家更好的学习和加深认识。

老规矩,先看视图渲染效果:
在这里插入图片描述


Redux案例三


Redux红绿灯案例:每2秒自动点击按钮触发变色

PS:前面已经有过几个小案例了,这里就直接写代码,不重复赘述了。


1,用React编码

// 入口文件 index.js
import React from 'react'
import ReactDOM from 'react-dom'
import App1 from &#39;./components/App1&#39;ReactDOM.render(<App1 />,document.getElementById(&#39;root&#39;)
)// 组件 components/App1.js
import React, { Component } from &#39;react&#39;export default class App1 extends Component {constructor(props) {super(props)this.state &#61; {val: 1}}componentDidMount() {let val &#61; this.state.val this.timerID &#61; setInterval(() &#61;> this.handleClick(val),2000)}componentWillUnmount() {clearInterval(this.timerID)}handleClick (val) {this.setState({val: this.state.val &#43; 1})console.log(&#39;setval: &#39;, this.state.val)}render() {let val &#61; this.state.val console.log(&#39;val&#61; &#39;, val)let isColorif(val % 3 &#61;&#61;&#61; 1) {isColor &#61; &#39;red&#39;} else if(val % 3 &#61;&#61;&#61; 2) {isColor &#61; &#39;yellow&#39;} else if(val % 3 &#61;&#61;&#61; 0) {isColor &#61; &#39;green&#39;}return (<div style&#61;{{width: 100, height: 100,textAlign: &#39;center&#39;}}><div style&#61;{{backgroundColor: isColor, width: 100, height: 100, borderRadius: &#39;50%&#39;}}></div><button style&#61;{{marginTop: 5}}onClick&#61;{() &#61;> this.handleClick(val)} >切换颜色</button></div>)}
}

2&#xff0c;Redux编码&#xff1a;2秒后自动点击触发变色


  • 注意&#xff0c;这个案例不是redux的异步action
  • 因为这个是2秒后自动点击触发变色&#xff0c;是触发变色的同步action写在点击函数里&#xff0c;定时器里写点击函数
  • 点击和变色是同步的&#xff0c;所以不是异步action
  • 如果是点击后2秒再触发变色&#xff0c;就完全不一样了
  • 这时的点击和变色是不同步的&#xff0c;也就是异步action
  • 写法就变成了 计时器写在点击函数里面&#xff0c;然后定时器写在异步action里&#xff0c;在定时器里分发同步action。
  • 在react中的异步&#xff0c;是在componentDidMount中完成的

入口文件index.js

import React from &#39;react&#39;
import ReactDOM from &#39;react-dom&#39;
import App2 from &#39;./containers/App2&#39;
import {Provider} from &#39;react-redux&#39;
import store from &#39;./redux/store&#39;ReactDOM.render(<Provider store&#61;{store}><App2 /></Provider>,document.getElementById(&#39;root&#39;)
)

UI组件App1.js

import React, { Component } from &#39;react&#39;
import PropTypes from &#39;prop-types&#39;export default class App1 extends Component {static propTypes &#61; {val: PropTypes.number.isRequired,changeNumber: PropTypes.func.isRequired}componentDidMount() {let {val} &#61; this.props this.timerID &#61; setInterval(() &#61;> this.handleClick(val),2000)}componentWillUnmount() {clearInterval(this.timerID)}handleClick &#61; (val) &#61;> {this.props.changeNumber(val)}render() {let {val} &#61; this.props let isColorif(val % 3 &#61;&#61;&#61; 1) {isColor &#61; &#39;red&#39;} else if(val % 3 &#61;&#61;&#61; 2) {isColor &#61; &#39;yellow&#39;} else if(val % 3 &#61;&#61;&#61; 0) {isColor &#61; &#39;green&#39;}return (<div style&#61;{{width: 100, height: 100,textAlign: &#39;center&#39;}}><div style&#61;{{backgroundColor: isColor, width: 100, height: 100, borderRadius: &#39;50%&#39;}}></div><button style&#61;{{marginTop: 5}}onClick&#61;{() &#61;> this.handleClick(val)} >切换颜色</button></div>)}
}

容器组件App2.js

import {connect} from &#39;react-redux&#39;
import App1 from &#39;../components/App1&#39;
import {changeNumber} from &#39;../redux/actions&#39;export default connect(state &#61;> ({val: state}),{changeNumber}
)(App1)

action事件类型 action-types

// 事件类型// 改变数字的action
export const CHANGENUMBER &#61; &#39;changeNumber&#39;

事件actions.js

// 事件actions
import {CHANGENUMBER} from &#39;./action-types&#39;export const changeNumber &#61; () &#61;> ({type: CHANGENUMBER,
})

管理员reducers.js

// 管理员reducers
import {CHANGENUMBER} from &#39;./action-types&#39;export function isChange(state &#61; 1, action) {switch(action.type) {case CHANGENUMBER:return state &#43; 1default:return state }
}

仓库store.js

import {createStore} from &#39;redux&#39;
import {isChange} from &#39;./reducers&#39;const store &#61; createStore(isChange)export default store

推荐阅读
  • 在基于.NET框架的分层架构实践中,为了实现各层之间的松散耦合,本文详细探讨了依赖注入(DI)和控制反转(IoC)容器的设计与实现。通过合理的依赖管理和对象创建,确保了各层之间的单向调用关系,从而提高了系统的可维护性和扩展性。此外,文章还介绍了几种常见的IoC容器实现方式及其应用场景,为开发者提供了实用的参考。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
  • 优化升级版数据采集与赋值方法,专为前文内容设计
    在前一篇文章中,方法的局限性主要体现在需要传递参数,并且参数数量受限。当页面布局与所需参数不匹配时,该方法将无法正常工作。为此,我们推出了优化升级版1.1,旨在解决这些问题并提高灵活性和适用性。 ... [详细]
  • 在探讨C语言编程文本编辑器的最佳选择与专业推荐时,本文将引导读者构建一个基础的文本编辑器程序。该程序不仅能够打开并显示文本文件的内容及其路径,还集成了菜单和工具栏功能,为用户提供更加便捷的操作体验。通过本案例的学习,读者可以深入了解文本编辑器的核心实现机制。 ... [详细]
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
  • 我正在使用 Ruby on Rails 构建个人网站。总体而言,RoR 是一个非常出色的工具,它提供了丰富的功能和灵活性,使得创建自定义页面变得既高效又便捷。通过利用其强大的框架和模块化设计,我可以轻松实现复杂的功能,同时保持代码的整洁和可维护性。此外,Rails 的社区支持也非常强大,为开发过程中遇到的问题提供了丰富的资源和解决方案。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • 深入解析:JavaScript中的表达式与语句有何不同
    深入解析:JavaScript中的表达式与语句有何不同 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 【前端开发】深入探讨 RequireJS 与性能优化策略
    随着前端技术的迅速发展,RequireJS虽然不再像以往那样吸引关注,但其在模块化加载方面的优势仍然值得深入探讨。本文将详细介绍RequireJS的基本概念及其作为模块加载工具的核心功能,并重点分析其性能优化策略,帮助开发者更好地理解和应用这一工具,提升前端项目的加载速度和整体性能。 ... [详细]
author-avatar
玩玩r28g
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有