react+reflux入门教程
为了简化react的flux带来的冗余操作,社区的同仁们给我们带来了很多优秀的轮子,诸如redux,reflux等。今天我们就通过逐行讲解代码实例的方法,感受一番reflux的设计之美。
例子
这个例子是非常简单的todo例子,学习语言从helloworld开始,学习框架从todo开始,这是我们码农界的文化传统!
组件
components/todo.js
import React from 'react' import Reflux from 'reflux' import ReactMixin from 'react-mixin' import store from '../stores/store' import actions from '../actions/actions' export default class Todo extends React.Component{ //组件渲染完成后,通过action获取所有的数组,刷新绑定到this.state上 componentDidMount() { actions.getAll(); } add(){ var item =this.refs.item.value; this.refs.item.value=''; actions.add(item); } remove(i){ actions.remove(i); } render() { //items用于乘放li的集合 let items; if(this.state.list){ items=this.state.list.map( (item,i)=> { //设置key是因为react的diff算法,是通过key来计算最小变化的 return <li key={i}> {item.name} <button onClick={this.remove.bind(this,i)}>remove</button> </li> }) } return ( <div> <input type="text" ref="item"/> <button onClick={this.add.bind(this)}>add</button> <ul> {items} </ul> </div> ) } } // ES6 mixin写法,通过mixin将store的与组件连接,功能是监听store带来的state变化并刷新到this.state ReactMixin.onClass(Todo, Reflux.connect(store));
上述代码,我们干了3件事:
- 渲染了一个组件,这个组件包括一个input,一个add按钮,一个列表,列表每项包含名称和remove按钮
- 给这个组件添加了几个方法,其中componentDidMount()在组件渲染完成后触发,componentDidMount()、add()和remove()方法分别调用actions的方法去更新状态
- 最后一行代码,使用es6的mixin写法,使得组件监听store带来的state变化,并刷新界面。
看到这里,很多没有接触过reflux的同学可能已经晕了,我来图解下reflux的功能流程吧!
组件就是用户界面,actions就是组件的动作,store用于执行actions的命令,并返回一个state对象给组件。组件通过state来更新界面。
这里我想说说react和angular的某个相同之处,就是将数据和界面绑定起来,通过操作数据来更新界面(不用苦逼的操作dom了)。我们把数据和界面的规则建好后,更新数据,界面自动就变化了。在这里,数据指的是this.state,界面指的是组件。
那么为何要用actions和store这么多层去更新state呢?为了以后项目业务逻辑变复杂后便于管理。为什么便于管理,因为actions有很多钩子,钩子就是“触发之前,触发之后的回调什么的”,这些钩子我们以后会用得上。
actions和store两个好基友开始更新状态
actions/actions.js
import Reflux from 'reflux' export default Reflux.createActions(['getAll','add','remove']);
stores/store.js
import Reflux from 'reflux' import actions from '../actions/actions' //给数组添加remove方法,用于去除指定下标的元素 Array.prototype.remove=function(dx) { if(isNaN(dx)||dx>this.length){return false;} for(var i=0,n=0;i<this.length;i++) { if(this[i]!=this[dx]) { this[n++]=this[i] } } this.length-=1 }; export default Reflux.createStore({ items:[], //监听所有的actions listenables: [actions], //on开头的都是action触发后的回调函数 onGetAll () { //更新状态(就是个对象) this.trigger({list:this.items}); }, onAdd(item){ this.items.push({name:item}); this.trigger({list:this.items}); }, onRemove(i){ this.items.remove(i); this.trigger({list:this.items}); } });
上述代码,我们干了3件事:
- 给数组对象的原型添加一个remove的方法,用于删除指定下标的元素
- 创建一个store,监听actions的方法
- 在store里,on开头的都是actions对应的回调函数,this.trigger(),负责更新state(这里指的是{list:this.items}这个对象)
渲染组件
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import Todo from './components/todo'; ReactDOM.render( <Todo> </Todo>, document.querySelector('#app') );
最后,用webpack编译
webpack.config.js
var path = require('path'); var webpack = require('webpack'); module.exports = { entry: { app:path.join(__dirname, 'src'), vendors: ['react','reflux','react-mixin'] }, output: { path: path.join(__dirname, 'dist'), filename: '[name].js' }, module: { loaders: [ { test:/\.js?$/, exclude:/node_modules/, loader:'babel', query:{ presets:['react','es2015'] } } ] }, plugins: [ new webpack.optimize.CommonsChunkPlugin('vendors', 'vendors.js') ] };
总结
相比较redux而言,
- reflux没有reducer的概念,取而代之,和action做基友的是store
- reflux没有把状态的一部分值绑定在组件的props上,而是将状态绑定在组件的state上,我们来看react dev tool的截图
- reflux可以直接调用action的方法,而redux必须将方法绑定在组件的props上,或者使用props的dispatch方法来执行actions的方法
- ……
有此看来,reflux好理解的多,但是redux的单一state是实际项目中是非常好用的,所以,redux在github上的星星比reflux多得多!两个都是社区同仁智慧的结晶,都是优秀的值得学习的轮子!
源代码:
https://github.com/lewis617/react-redux-tutorial/tree/master/todo-reflux
运行方法:
npm install
npm run build
手动打开index.html
教程源代码及目录
如果您觉得本博客教程帮到了您,就赏颗星吧!
https://github.com/lewis617/react-redux-tutorial
react+reflux入门教程的更多相关文章
- 基于Nodejs生态圈的TypeScript+React开发入门教程
基于Nodejs生态圈的TypeScript+React开发入门教程 概述 本教程旨在为基于Nodejs npm生态圈的前端程序开发提供入门讲解. Nodejs是什么 Nodejs是一个高性能Ja ...
- React Native入门教程 3 -- Flex布局
上一篇文章中介绍了基本组件的使用 React Native入门教程(笔记) 2 – 基本组件使用及样式 本节内容将继续沿用facebook官方例子介绍如何使用Flexbox布局把界面设计的多样化. 转 ...
- React Native入门教程2 -- 基本组件使用及样式
在上一篇文章中,我们学会了如何搭建React Native的环境(React Native入门教程(笔记) 1 – 开发环境搭建),不知道你们是否搭建好了呢,如果还没有,那么快动起小手,来体验RN带给 ...
- React Native入门教程 1 -- 开发环境搭建
有人问我为啥很久不更新博客..我只能说在学校宿舍真的没有学习的环境..基本上在宿舍里面很颓废..不过要毕业找工作了,我要渐渐把这个心态调整过来,就从react-native第一篇博客开始.话说RN也出 ...
- React实例入门教程(1)基础API,JSX语法--hello world
前 言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发 ...
- 【原创】React实例入门教程(1)基础API,JSX语法--hello world
前 言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发效率 ...
- 前端框架React Js入门教程【精】
现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领 ...
- React快速入门教程
简介 Facebook官网介绍:React 是一个用来构建用户界面的 JavaScript 库.相当于 MVC 架构的 V 层. React 的核心思想是:封装组件,各个组件维护自己的状态和UI,当状 ...
- React JS快速入门教程
翻译至官方文档<Tutorial>http://facebook.github.io/react/docs/tutorial.html 转载请注明出处:http://blog.csdn.n ...
随机推荐
- css3复杂选择器+内容生成+Css Hack
1.复杂选择器2.内容生成3.多列4.CSS Hack(浏览器兼容性)=======================================1.复杂选择器 1.兄弟选择器 1.特点: 1.通过 ...
- 在linux中设置静态ip地址
在linux中设置静态ip地址1.在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0 2.开始编辑,填写ip地址.子网掩码.网关.DNS等[root ...
- CentOS安装配置redis
安装前准备,安装gcc 先用 gcc -v命令检测本机是否安装gcc,如果没有则用下面命令安装: yum install cpp yum install binutils yum install gl ...
- css3 filter的十种特效
filter默认值是none,他不具备继承性,其中filter-function具有一下属性: grayscale灰度 sepia褐色(求专业指点翻译) saturate饱和度 hue-rotate色 ...
- 异常处理_Maven多模块web项目整合ssm+dubbo
异常如下: [ERROR][org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader. ...
- 线程处理模型 由于 SynchronizationContext 引起的死锁问题解决
由于GUI 应用程序 不能使用线程池的线程更新UI,只能使用 GUI 线程更新,所以在 await 前后需要保证是同一个 GUI 线程 ASP.NET 程序 的线程处理客户端请求的时候,需要假定客户端 ...
- 【转】最大流EK算法
转自:http://www.cnblogs.com/kuangbin/archive/2011/07/26/2117636.html 图-1 如图-1所示,在这个运输网络中,源点S和汇点T分别是1,7 ...
- Java虚拟机
虚拟机每次方法的调用和返回都伴随着栈帧的入栈和出栈,而每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用(表明该栈帧执行的是哪个方法),持有这个引用是为了支持方法调用中的动态连接.这些符号引用中 ...
- bzoj 2739 最远点
Description 给你一个N个点的凸多边形,求离每一个点最远的点. Input 本题有多组数据,第一行一个数T,表示数据组数. 每组数据第一行一个数N,表示凸多边形点的个数,接下来N对数,依次表 ...
- JS、JQuery和ExtJs的跨域处理
1.什么是跨域?跨域,JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.简单地理解就是因为JavaScript同源策略的限制,a.com 域名下的js无法操作b.com或是c.a. ...