- 浏览: 5161509 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
silence19841230:
先拿走看看
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
masuweng 写道发下源码下载地址吧!三个相关文件打了个包 ...
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
发下源码下载地址吧!
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
水淼火 写道你好,我使用以后,图标不显示,应该怎么引用呢,谢谢 ...
前端框架iviewui使用示例之菜单+多Tab页布局
React是状态改变引起组件外观界面的变化。刚学时,很自然想到组件间通信、控制组件状态的方法:获取某组件的状态,修改,进而控制组件外观。可上网一查,好像套路不是这样的。研究了一个上午,搞清楚了其中的门道。正统的方法是:维护一个全局状态,通过发布/定阅机制,组件注册感兴趣的状态变化监听器(回调函数),状态变化时通知监听器,监听器修改组件的状态,然后引发界面变化。
原理弄明白了,准备开始弄。
可是,笔记本电脑发生了一件很诡异的事件:chrome怎么也打不开开发者工具,热键、右键、菜单都不行。没有console输出的错误的提示,找不到错误代码的位置,只能靠猜,代码很快就写好了,调试、除错花了一个上午的时间也没有搞定。
下午卸载、重新安装chrome,开发者工具好了,很快就把代码调好了。
一个状态管理器、几个组件,代码、逻辑、流程很简单,画个示意图。
一、状态管理器
状态管理器维护组件的全局状态,使用EventEmitter模块注册事件监听器、激活事件。事件管理可以使用node.js带的EventEmitter模块,也可以自己定义一个简单的订阅/发布管理器。
二、当前步展示组件及测试按钮组件
三、执行效果
状态指示组件及三个测试按钮。当点击按钮时,状态指示组件的内容会发生相应的变化。
四、自己定义的发布/订阅实现的简单类,上面代码运行不需要这个类
原理弄明白了,准备开始弄。
可是,笔记本电脑发生了一件很诡异的事件:chrome怎么也打不开开发者工具,热键、右键、菜单都不行。没有console输出的错误的提示,找不到错误代码的位置,只能靠猜,代码很快就写好了,调试、除错花了一个上午的时间也没有搞定。
下午卸载、重新安装chrome,开发者工具好了,很快就把代码调好了。
一个状态管理器、几个组件,代码、逻辑、流程很简单,画个示意图。
一、状态管理器
状态管理器维护组件的全局状态,使用EventEmitter模块注册事件监听器、激活事件。事件管理可以使用node.js带的EventEmitter模块,也可以自己定义一个简单的订阅/发布管理器。
/** * 用于GO的状态管理。管理所有组件的状态,所有组件订阅事件,同步状态 */ var Events = require('events'); class GoStateManager { constructor() { this.current = { index:1,//当前步数 black:false,//是否是黑子 place:false,//是否是布局摆子,如果是,不改变当前步数,布局时摆的棋子上面不显示数字 }; this.eventEmitter = new Events.EventEmitter(); }; //订阅状态变化事件 subCurrentChange(listener) { this.eventEmitter.addListener('currentChange',listener); } //状态变化事件发生,通知监听器 pubCurrentChange(){ this.eventEmitter.emit("currentChange",this.current); } //下一步 next(){ if(this.current.place==true){ } else{ this.current.index++; this.current.black=!this.current.black; this.pubCurrentChange(); } } //设置布局状态 setPlace(bPlace){ this.current.place=bPlace; this.pubCurrentChange(); } //重新开始 restart(){ this.current.index=1; this.current.black=true; this.current.place=false; this.pubCurrentChange(); } } module.exports = new GoStateManager();
二、当前步展示组件及测试按钮组件
var React = require('react'); var ReactDOM = require('react-dom'); var StateManager = require('../../store/main/GoStateManager'); //当前步状态指示器,可以指标当前步数、落子方、是否处理布局状态等信息 class CurrentLabel extends React.Component{ constructor(props){ super(props); //使用全局的状态作为初始状态 this.state={ index:StateManager.current.index, black:StateManager.current.black, place:StateManager.current.place, }; //设置currentChange函数的this this.currentChange=this.currentChange.bind(this); //注册事件监听器 StateManager.subCurrentChange(this.currentChange); } //状态改变事件监听器,调整组件的状态 currentChange(current){ this.setState({ index:current.index, black:current.black, place:current.place, }); } render(){ return <span> <strong>当前步数:</strong>{this.state.index} <strong> 落子方:</strong>{this.state.black==true?'黑方':'白方'} <strong> 是否是布局状态:</strong>{this.state.place==true?'布局':'行棋'} </span>; } } //状态指标器测试按钮:下一步 class CurrentTestBtn_Next extends React.Component{ constructor(props ){ super(props); this.state={} this.clickHandle = this.clickHandle.bind(this); } clickHandle(){ //点击事件,通知状态管理器,下一步 StateManager.next(); } render(){ return <button className="btn btn-primary" onClick={this.clickHandle}>下一步</button>; } } //状态指标器测试按钮:切换布局状态 class CurrentTestBtn_Place extends React.Component{ constructor(props ){ super(props); this.state={} this.clickHandle = this.clickHandle.bind(this); } clickHandle(){ StateManager.setPlace(!StateManager.current.place); } render(){ return <button className="btn btn-primary" onClick={this.clickHandle}>切换布局状态</button>; } } //状态指标器测试按钮:切换布局状态 class CurrentTestBtn_Restart extends React.Component{ constructor(props ){ super(props); this.state={} this.clickHandle = this.clickHandle.bind(this); } clickHandle(){ //点击事件,重新开始 StateManager.restart(); } render(){ return <button className="btn btn-primary" onClick={this.clickHandle}>重新开始</button>; } } ReactDOM.render( <div> <CurrentLabel /><br/> <CurrentTestBtn_Next /> <CurrentTestBtn_Place /> <CurrentTestBtn_Restart /> </div>, document.getElementById('main-container') );
三、执行效果
状态指示组件及三个测试按钮。当点击按钮时,状态指示组件的内容会发生相应的变化。
四、自己定义的发布/订阅实现的简单类,上面代码运行不需要这个类
/** * 自定义的发布定阅实现类 */ class MyEventEmitter { constructor() { this.handlers = { }; }; //增加监听 addListener(eventName,handler) { var self = this; if (!(eventName in self.handlers)){ self.handlers[eventName] = []; } self.handlers[eventName].push(handler); return self; } //删除对应的监听 removeListener(eventName,handler) { var self = this; if (!(eventName in self.handlers)){ return; } var idx=-1; for(var i=0; i<self.handlers[eventName].length; i++){ if(self.handlers[eventName][i]==handler){ idx = i; break; } } if(idx!=-1){ self.handlers[eventName].splice(idx,1); } return self; } emit(eventName){ var self = this; var args = Array.prototype.slice.call(arguments,1); if (!(eventName in self.handlers)){ return; } var idx = self.handlers[eventName].length; while(idx--){ self.handlers[eventName][idx].apply(self,args); } return self; } } module.exports = new MyEventEmitter();
发表评论
-
gradle编译错误:Could not find method compile() for arguments
2020-09-19 10:50 18515编译(IDEA+Gradle)一个别人的工程,出现一个 ... -
netty心跳检查之UDP篇
2019-09-15 08:50 2396部分UDP通信场景中,需要客户端定期发送心跳信息,以获取终 ... -
解决tomcat部署两个SpringBoot应用提示InstanceAlreadyExistsException
2019-06-30 11:49 3392两个SpringBoot应用部署在一个Tomcat中,单独 ... -
Eclipse配置MyBatis代码自动化功能
2019-06-29 10:16 17741.安装插件 Eclipse中,Help->Ecli ... -
vue.js中使用qrcode生成二维码
2019-05-20 00:00 7656一、安装包 npm install qrcodejs2 --s ... -
MySQL插入数据报错: Incorrect string value: '\xFD\xDE'
2019-03-31 23:19 1254我MySQL数据库用的uft-8字符集,插入数据一直很正常 ... -
vue自定义组件并双向绑定属性
2019-03-08 22:46 3258做了两个子组件,原理基本一样,一个是使用原生的select ... -
vue-router简单示例
2019-03-05 00:32 1153写个基本完整、稍有借鉴意义的示例,防止自己忘记。 &l ... -
“联通充值系统繁忙”轻松应对
2019-02-06 11:03 3973大过年的,联通充个值一直报“充值系统繁忙”。昨天晚上试了几 ... -
electron.js数据库应用---导航菜单(element-ui+mysql)
2019-02-05 21:33 2364一、环境搭建 略, ... -
electron.js数据库应用---入门(mysql+element-ui)
2019-01-27 23:19 7504我的机器:Windows10,64 ... -
SpringMVC 在controller层中注入成员变量request,是否线程安全
2018-12-17 21:17 2748@RestController public class ... -
VueJS 组件参数名命名与组件属性转化
2018-12-03 00:00 2077转自:https://www.cnblogs.com/meiy ... -
vue-resource拦截器实现token发送及检验自动化
2018-11-16 22:38 3079用了很长时间vue-resource,最近思考$http发 ... -
element-ui试用手记
2018-10-29 20:25 1748element-ui、iviewui都以vue.js为基础 ... -
iviewui中表格控件中render的使用示例
2018-07-07 16:46 9790示例了如何在表格中显示按钮,如何将代码转化为文字。 i ... -
Tomcat错误“Alias name tomcat does not identify a key entry”解决
2018-07-05 21:39 6576申请到了阿里云的证书后,下载、按照说明生成jks格式证书、 ... -
阿里云免费证书“fileauth.txt内容配置错误”解决
2018-07-05 20:43 5302最近研究微信小程序开发,上阿里云申请了个证书,使用文件验证 ... -
springboot2.0跨域配置
2018-07-04 22:11 5286springboot2.0跨域配置: 一、代码 ... -
微信小程序使用code换openid的方法(JAVA、SpringBoot)
2018-07-01 21:52 10400微信小程序序的代码中提示,使用code换取openid,但 ...
相关推荐
在本篇“React学习之围棋记谱本制作(七)总结”中,我们将深入探讨如何利用React技术栈创建一个功能完善的围棋记谱本应用。React是Facebook开发的一个用于构建用户界面的JavaScript库,尤其适用于构建单页应用。在...
总结来说,这个React围棋记谱本项目涉及React基础、组件化开发、状态管理、事件处理以及可能的前后端交互。通过这个项目,你不仅可以深入理解React的工作原理,还能提升你的JavaScript和Web开发技能。后续章节将介绍...
在本项目中,“React学习之围棋记谱本制作(四)前端开发初步完成”是一个教程,旨在教授如何使用React框架构建一个围棋记谱本的前端应用。从给出的标签“源码”和“工具”来看,我们可以推断这个教程会涉及实际的...
React 是 Facebook 提出的前端框架,作为 View 层很好地解决了视图层渲染问题,但是却缺乏有效的状态管理,在构建大型的前端应用就会显得十分乏力时,需要有一个良好的状态管理,如:Flux,Redux,Mobx 等等.
本React学习手册将深入探讨React的核心概念和实战技巧,帮助你从入门到精通。 首先,React的核心概念包括组件化开发。组件是React的基础单元,可以理解为可复用的代码块,它们像乐高积木一样组合起来构建整个应用。...
《掌控React状态管理》是一本全面介绍了React状态管理和Redux使用的书籍。通过阅读本书,不仅可以学习到React的基础知识,还能深入了解如何利用Redux来管理更复杂的应用程序状态。这对于任何想要提高React应用开发...
8. **Redux和MobX**:React本身并不提供全局状态管理解决方案,但有Redux和MobX这样的第三方库。手册可能会对比这两者,讲解如何在React应用中实现状态管理。 9. **服务器端渲染(SSR)**:React还支持服务器端渲染...
总结来说,"react学习课件.docx"可能会涵盖以上这些知识点,包括React的基本原理、组件化开发、虚拟DOM、状态管理、生命周期方法、Hooks、路由管理、状态管理库以及React Native的介绍。通过学习这些内容,开发者...
在“React开发-其它杂项”这个标签下,可能涵盖了React与其他工具和技术的整合,比如样式库(如Material-UI、Bootstrap)、状态管理库(如Redux、MobX)、测试工具(如Jest、Enzyme)以及构建工具(如Webpack、...
在React开发中,状态管理是应用复杂性的重要组成部分。通常,React本身提供的组件状态和props可以处理大部分小型项目的需求,但对于大型、多组件交互的应用,就需要一个统一的状态管理工具。Vuex是Vue.js生态系统中...
这个压缩包“react-一个ReactHooks状态管理器”很可能包含了一个自定义的状态管理库,名为 "flooks",它是对 React Hooks 的进一步封装和扩展,用于帮助开发者更高效地管理组件的状态。 React Hooks 主要包括 `...
本篇文章将深入探讨如何使用React Hooks实现一个简单的全局状态管理库,就像`react-simple-global-state-store-hook`一样,它仅用44行代码就完成了这一功能。 首先,我们需要理解React Hooks的基本概念。Hooks是自...
在React世界中,创建一个记账本应用是一个经典的练习,它可以帮助我们理解React的基本概念、组件化编程以及状态管理。让我们深入探讨这个“react之记账本案例”。 首先,React是一个由Facebook开发并维护的...
虽然React本身提供了状态管理的基础,但随着应用复杂度增加,可以使用Redux或MobX等第三方库来管理全局状态。 7. **路由**:React Router是React应用中的路由库,它允许根据URL定义组件的显示,实现页面间的导航。 ...
**React-Concent:React的状态管理框架** React-Concent是一个针对React框架设计的状态管理工具,它的主要目标是简化React应用中的状态管理和组件之间的通信,让开发者能够更高效地编写业务代码,同时保持应用的...
通过学习这些基础知识,开发者能够掌握React的使用方法,并能够进一步深入学习更高级的主题,如React的生命周期方法、高阶组件、以及与Redux和MobX等状态管理库的集成。随着学习的深入,开发者将能够构建出高性能、...
学习如何编写高效、可维护的组件,包括状态管理、props传递、生命周期方法等,是进阶的关键。了解如何通过`React.createClass`或ES6的类语法创建组件,并掌握无状态函数组件(PureComponent)与状态组件的区别。 2....
8. **社区支持和工具**:学习和使用基于RxJs的状态管理可能需要一些额外的学习资源,包括社区讨论、教程和第三方库。 9. **适用场景**:虽然不是所有React应用都需要复杂的流状态管理,但对于有大量组件交互,需要...
React+antd后台管理系统模板是一个利用...通过学习和实践这个React+antd后台管理系统模板,开发者可以加深对React组件化开发、UI设计、路由管理和状态管理的理解,同时提升前端开发技能,为构建更复杂的应用奠定基础。
总的来说,React全家桶涵盖了许多前端开发的各个方面,从基础到进阶,从UI设计到状态管理,再到性能优化和测试,都是前端从业者必须掌握的知识点。通过系统学习和实践,可以构建出高效、可维护的React应用。