曾经看到一篇文章,写的是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的。

上述代码,我们干了三件事:

  1. 编写一个可视化组件(其实就是个input);
  2. 将state的value属性绑定在组件的props上;
  3. 将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。

上述代码,我们干了三件事:

  1. 将reducer放进store
  2. 将store放进provider
  3. 将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')
    ]
};

好了,开始吐槽

槽点如下:

  1. 概念太多,props,state,action,reducer,store,provider,就这还没引入router呢,对新手而言,无法在脑海中立马形成一个清晰的流程
  2. 很多概念冗余,比如reducer和store
  3. 很简单一个功能,写了这么多代码,如果用angular一行代码都不用写
  4. 看看我们为了虚拟dom的高性能以及服务器渲染,牺牲了多少,虚拟dom的设计如果被angular引入,那么react的优点何在?
  5. 看看react所谓的简单,平滑的学习曲线,在引入某种框架后,还不是照样复杂。react本身非常简单,可是又有什么用呢?我们绝大多数人,还不是得结合backbone或者angular或者flux,reflux,redux来用。这样看来还简单吗?
  6. 更新太快,如果我不列出package.json清单,几个月后你能运行这个程序吗?
  7. 一个页面的HTML模板被完全碎片化了,angular的指令虽说也有此嫌疑,但是angular旨在”拓展html的能力“,并没有完全碎片化模板。
  8. ……

这些想法,我想对于angular开发者来说,都是有共鸣的。

没有用过angular的react开发者觉得react好,可能是因为他们没有用过angular,拿react和jquery对比得出的结论。

用过angular的react开发者觉得react好,无非就是因为

  1. react牛逼的服务器渲染
  2. 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证明你的开发效率低下”的更多相关文章

  1. 用react + redux + router写一个todo

    概述 最近学习redux,打算用redux + router写了一个todo.记录下来,供以后开发时参考,相信对其他人也有用. 注意: 我只实现了Footer组件的router,其它组件的实现方法是类 ...

  2. [译] Angular 2 VS. React: 血色将至

    Angular 2 VS. React: 血色将至 原文链接:https://medium.com/@housecor/angular-2-versus-react-there-will-be-blo ...

  3. 【原】react+redux实战

    摘要:因为最近搞懂了redux的异步操作,所以觉得可以用react+redux来做一个小小的项目了,以此来加深一下印象.切记,是小小的项目,所以项目肯定是比较简单的啦,哈哈. 项目效果图如图所示:(因 ...

  4. 我的第一个phonegap开发WebApp的demo 怎么搭建安卓开发环境以及安装phonegap

    一.先来张图,赏心悦目观赏一下,哈 . 这个就是使用phonegap框架搭建起来的,运行在安卓环境上的第一个demo. 安卓的开发环境,大家都会搭建了,所以不赘述.讲一下,安装phonegap的步骤. ...

  5. 一个资深iOS开发者对于React Native的看法

    一个资深iOS开发者对于React Native的看法 当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道.   我认为一个js开发者可以使用javasc ...

  6. [转] 一个资深iOS开发者对于React Native的看法

    当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javascript来构建iPhone应用确实是一件很酷的事情,但是我很 ...

  7. react+redux+generation-modation脚手架添加一个todolist

    当我遇到问题: 要沉着冷静. 要管理好时间. 别被bug或error搞的不高兴,要高兴,又有煅炼思维的机会了. 要思考这是为什么? 要搞清楚问题的本质. 要探究问题,探究数据的流动. TodoList ...

  8. 我的第一个 react redux demo

    最近学习react redux,先前看过了几本书和一些博客之类的,感觉还不错,比如<深入浅出react和redux>,<React全栈++Redux+Flux+webpack+Bab ...

  9. react+redux+generation-modation脚手架搭建一个todolist

    TodoList 1. 编写actions.js 2. 分析state 试着拆分成多个reducer 3. 了解store 4. 了解redux数据流生命周期 5. 分析容器组件和展示组件 搞清楚,数 ...

随机推荐

  1. IDEA+Tomcat+JRebel热部署

    在完成idea工程简单应用后,接下来实现热部署. 简单应用地址:http://wibiline.iteye.com/admin/blogs/2072454 一.安装JRebel插件 1. 在线安装 F ...

  2. C# winfrom HttpWebRequest 请求获取html网页信息和提交信息

    string result =GetRequest("http://localhost:32163/DuoBao/ajax.aspx", "time=5"); ...

  3. 编译可在Android上运行的qemu user mode

    前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的”NDK”若无特殊说明均指”Android NDK”. 下文中”$NDK ...

  4. 减小ipa体积之删除frameWork中无用mach-O文件

    最近项目末期, 我们团队为了ipa的大小使用不少的体积减小的方法, 除了一些常规的方法之外, 我分享一下自己研究出来的新思路. 首先我们来简单的介绍一下mach-O. 什么是mach-O? Mach- ...

  5. 分分钟用上C#中的委托和事件

    每一个初学C#的程序猿,在刚刚碰到委托和事件的概念时,估计都是望而却步,茫然摸不到头脑的.百度一搜,关于概念介绍的文章大把大把的,当然也不乏深入浅出的好文章.可看完这些文章,大多数新手,估计也只是信心 ...

  6. ABP理论学习之Web API控制器(新增)

    返回总目录 本篇目录 介绍 AbpApiController基类 本地化 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器 ...

  7. 领域驱动设计系列 (六):CQRS

    CQRS是Command Query Responsibility Seperation(命令查询职责分离)的缩写. 世上很多事情都比较复杂,但是我们只要进行一些简单的分类后,那么事情就简单了很多,比 ...

  8. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  9. EF Codefirst 多对多关系 操作中间表的 增删改查(CRUD)

    前言 此文章只是为了给新手程序员,和经验不多的程序员,在学习ef和lambada表达式的过程中可能遇到的问题. 本次使用订单表和员工表建立多对多关系. 首先是订单表: public class Ord ...

  10. 《Entity Framework 6 Recipes》中文翻译系列 (28) ------ 第五章 加载实体和导航属性之测试实体是否加载与显式加载关联实体

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-11  测试实体引用或实体集合是否加载 问题 你想测试关联实体或实体集合是否已经 ...