angular开发者吐槽react+redux的复杂:“一个demo证明你的开发效率低下”
曾经看到一篇文章,写的是jquery开发者吐槽angular的复杂。作为一个angular开发者,我来吐槽一下react+redux的复杂。
例子
为了让大家看得舒服,我用最简单的一个demo来展示react+redux的“弯弯绕”,下面这个程序就是我用react和redux写的。然而这个程序在angular中一行js都不用写!!!

展示组件
App.js
import React, { findDOMNode, Component } from 'react';
import ReactDOM from 'react-dom';
import { connect } from 'react-redux';
import * as action from './actions'
class App extends Component {
render() {
return (
<div>
<input type='text' value={this.props.propsValue} onChange={this.changeHandle.bind(this)} ref="input"/>
{this.props.propsValue}
</div>
);
}
changeHandle(){
const node = ReactDOM.findDOMNode(this.refs.input);
const value = node.value.trim();
this.props.change(value);
}
}
function mapStateToProps(state) {
return {
propsValue: state.value
}
}
//将state的指定值映射在props上,将action的所有方法映射在props上
export default connect(mapStateToProps,action)(App);
没有玩过redux的同学们可能已经看得有点晕了,redux的设计是这样的:
state就是数据,组件就是数据的呈现形式,action是动作,action是通过reducer来更新state的。
上述代码,我们干了三件事:
- 编写一个可视化组件(其实就是个input);
- 将state的value属性绑定在组件的props上;
- 将action的所有方法绑定在组件的props上。
action和reducer两个好基友负责更新state
actions.js
//定义一个change方法,将来把它绑定到props上
export function change(value){
return{
type:"change",
value:value
}
}
reducers.js
//reducer就是个function,名字随便你起,功能就是在action触发后,返回一个新的state(就是个对象)
export default function change(state,action){
if(action.type=="change")return{value:action.value};
return {value:'default'};
}
上述代码我们就干了一件事:用户触发action后,更新状态。
因为状态和组件的props是绑定的,所以,组件也跟着变化了!
store出场,将reducer注入组件
index.js
import React from 'react'
import { render } from 'react-dom'
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import App from './App'
import inputApp from './reducers'
let store = createStore(inputApp);
render(
<Provider store={store}>
<App />
</Provider>,
document.querySelector("#app")
);
provider是组件顶层,用来乘放store。
上述代码,我们干了三件事:
- 将reducer放进store
- 将store放进provider
- 将provider放在组件顶层,并渲染
最后用webpack编译运行
webpack.config.js
var path = require('path');
var webpack = require('webpack');
module.exports = {
entry: {
app:path.join(__dirname, 'src'),
vendors: ['react','redux']
},
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')
]
};
好了,开始吐槽
槽点如下:
- 概念太多,props,state,action,reducer,store,provider,就这还没引入router呢,对新手而言,无法在脑海中立马形成一个清晰的流程
- 很多概念冗余,比如reducer和store
- 很简单一个功能,写了这么多代码,如果用angular一行代码都不用写
- 看看我们为了虚拟dom的高性能以及服务器渲染,牺牲了多少,虚拟dom的设计如果被angular引入,那么react的优点何在?
- 看看react所谓的简单,平滑的学习曲线,在引入某种框架后,还不是照样复杂。react本身非常简单,可是又有什么用呢?我们绝大多数人,还不是得结合backbone或者angular或者flux,reflux,redux来用。这样看来还简单吗?
- 更新太快,如果我不列出package.json清单,几个月后你能运行这个程序吗?
- 一个页面的HTML模板被完全碎片化了,angular的指令虽说也有此嫌疑,但是angular旨在”拓展html的能力“,并没有完全碎片化模板。
- ……
这些想法,我想对于angular开发者来说,都是有共鸣的。
没有用过angular的react开发者觉得react好,可能是因为他们没有用过angular,拿react和jquery对比得出的结论。
用过angular的react开发者觉得react好,无非就是因为
- react牛逼的服务器渲染
- diff算法带来的高性能。
但是,不考虑性能和seo,单从开发效率上来讲,angular以及mvvm的其他框架相对优秀一点!
当然这里还有适用场景的问题,因为我们研究所目前在做的是大数据平台,全是crud和表单,使用angular开发会非常合适。
一定要看
最后,我想说这篇文章中的demo有一定的局限性。因为redux是用来管理状态的框架,通常在大型复杂的项目中会发挥优势,而我用这样一个简单的demo来说明问题,有点以管窥豹的意思。
在大型项目中,单一数据源以及只读的state,会让你的程序的状态管理非常清晰。为什么?因为我们要更改state,只能通过action,action是我们自己定义的,我们可以预测这个action将带来怎样的改变,而且会留下痕迹,便于管理和掌控程序数据流程。
当然初学者也可以通过这篇文章来学习react+redux。
示例代码:
https://github.com/lewis617/react-redux-tutorial/tree/master/input-redux
运行方法:
npm install
npm run build
手动打开index.html
angular开发者吐槽react+redux的复杂:“一个demo证明你的开发效率低下”的更多相关文章
- 用react + redux + router写一个todo
概述 最近学习redux,打算用redux + router写了一个todo.记录下来,供以后开发时参考,相信对其他人也有用. 注意: 我只实现了Footer组件的router,其它组件的实现方法是类 ...
- [译] Angular 2 VS. React: 血色将至
Angular 2 VS. React: 血色将至 原文链接:https://medium.com/@housecor/angular-2-versus-react-there-will-be-blo ...
- 【原】react+redux实战
摘要:因为最近搞懂了redux的异步操作,所以觉得可以用react+redux来做一个小小的项目了,以此来加深一下印象.切记,是小小的项目,所以项目肯定是比较简单的啦,哈哈. 项目效果图如图所示:(因 ...
- 我的第一个phonegap开发WebApp的demo 怎么搭建安卓开发环境以及安装phonegap
一.先来张图,赏心悦目观赏一下,哈 . 这个就是使用phonegap框架搭建起来的,运行在安卓环境上的第一个demo. 安卓的开发环境,大家都会搭建了,所以不赘述.讲一下,安装phonegap的步骤. ...
- 一个资深iOS开发者对于React Native的看法
一个资深iOS开发者对于React Native的看法 当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javasc ...
- [转] 一个资深iOS开发者对于React Native的看法
当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javascript来构建iPhone应用确实是一件很酷的事情,但是我很 ...
- react+redux+generation-modation脚手架添加一个todolist
当我遇到问题: 要沉着冷静. 要管理好时间. 别被bug或error搞的不高兴,要高兴,又有煅炼思维的机会了. 要思考这是为什么? 要搞清楚问题的本质. 要探究问题,探究数据的流动. TodoList ...
- 我的第一个 react redux demo
最近学习react redux,先前看过了几本书和一些博客之类的,感觉还不错,比如<深入浅出react和redux>,<React全栈++Redux+Flux+webpack+Bab ...
- react+redux+generation-modation脚手架搭建一个todolist
TodoList 1. 编写actions.js 2. 分析state 试着拆分成多个reducer 3. 了解store 4. 了解redux数据流生命周期 5. 分析容器组件和展示组件 搞清楚,数 ...
随机推荐
- python Django 进阶篇
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- 个人查阅资料-Sql语句
SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRAN ...
- Unity - Apk包的代码与资源提取
最近在研究如何给Unity游戏进行加密,让别人不能轻易破解你的apk包,不过网上的加密方法都是有对应的破解方法~_~!!结果加密方法没找到好的,逆向工程倒会了不少.今天就来讲解如何提取一个没做任何保护 ...
- C#用扩展方法进行自动生成添加删除对象转换的功能
public static class ExtendedModel { #region 实体类的增删改查 #region 添加 public static string AddStr(this obj ...
- radio相关
radio 按钮组, name=”sex”. <input type="radio" name="sex" value="Male"& ...
- 浏览器中CSS的BUG
对于web2.0的过度,请尽量用xhtml格式写代码,而且DOCTYPE 影响 CSS 处理,作为W3C的标准,一定要加 DOCTYPE声明. 其它请参考:CSS hack 针对IE6,IE7,fir ...
- HTML input小结
一.Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍. 1.type=text 输入类型是text,这是我们 ...
- io.js的服務器突破
Node.js与io.js那些事儿 InfoQ中文站 05月20日 14:26 去年12月,多位重量级Node.js开发者不满Joyent对Node.js的管理,自立门户创建了io.js.io.js的 ...
- PostgreSQL 与 MySQL 相比,优势何在?
一. PostgreSQL 的稳定性极强, Innodb 等引擎在崩溃.断电之类的灾难场景下抗打击能力有了长足进步,然而很多 MySQL 用户都遇到过Server级的数据库丢失的场景——mysql系统 ...
- ENode 2.6 架构与设计简介以及全新案例分享
前言 ENode是一个应用开发框架,为开发人员提供了一整套基于DDD+CQRS+ES+EDA架构风格的解决方案.ENode从发布1.0开始到现在的差不多两年时间,我几乎每周都在更新设计或实现代码.以至 ...