React和Angular

你若装逼,请带我飞!

从前,从前,听说React只负责UI,话说写Angular代码就像写后端,现在看来,React赢在情怀上了;

我认为没必要老是拿React和Angular做比较,Angular是一套大而全的相对完备的框架;而React确实是只负责UI,只是多出很多概念层的东西,需要自己以此去构造;React更像是打造一个由React作为主线的生态;以component为基础,虚拟DOM解决性能瓶颈,单向数据流统一管理components,webpack、ES6、JSX完美融合,还有Flux、Redux等架构方案及其周边扩展,加上React Native;说好的只负责UI呢,这是通吃的节奏啊!这是一条情怀路线,击中了很多前端人长期以来对Web探索的痛点:Web Components;所以才能振臂一呼,应者云集;而当你真正开始走进React,你会发现,正如老罗所说:“漂亮的不像实力派!”;

实在是机缘巧合,之前的博客有一篇《富文本编辑器小记 — 关于撤销、重做操作》,是关于简单的canvas操作和富文本编辑器里自定义撤销重做的方法,现在发现LOW爆了,因为Redux的文档中就有一个关于撤销重做的实例;算是被Redux教做人了,所以正式决定要开始Redux了;话说Redux对于一般不是那么复杂的有很多状态管理的地方并不是必须的,本来state和props可以好好的玩耍,现在半路杀出了个Redux,并全权掌控了state,这么高逼格,请带我飞吧!

不要问Redux是什么。。。就是那个将要全权代管你所有组件state的那家伙!用Redux的自述来说就是:

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。

如果你之前不懂Redux,那么看到这句话,你可能依然很平静,或是脑子开始打转,有些似懂非懂,甚至有点迷惑,唉,其实就是依然不懂嘛!

既然state从此是路人,那么咱就得安心的开始写action和reducer了,一起走进Redux;

Redux提供的是一套机制,所以并不太容易一下子接受,话说React从开始到现在有太多不太容易一下子接受的地方了,关键是都是很有逼格的玩意,所以要想飞的更高,就该把地平线忘掉!Redux 是 JavaScript 状态容器也叫Store,它是由所有组件state组成的一个对象树,也可以把它看作一个大的JSON,或是一个属于前端的小数据库,不再操作state,而是对这个大的JSON进行增删改查;只是操作方式由Redux提供;

1、action和actionCreator

action是Store数据的来源,本身就是一个普通的js对象,type字段是必须的,指明干了什么;不同业务类型的action可以各自单独存放,actionCreator函数仅返回一个action,由dispatch(action)调用来更新state;

 1 // action type:datas
2 export const ADD='ADD';
3 export const DEL='DEL';
4
5 // action creator:datas
6 export function addOne(data){
7 return {
8 type:ADD,
9 payload:data
10 }
11 }
12 export function delOne(ins){
13 return {
14 type:DEL,
15 index:ins
16 }
17 }

如上,声明了两个action的type:ADD和DEL;两个actionCreator:addOne和delOne,分别返回一个action;

2、reducer

action只是指明干了什么,reducer则指明该怎么干什么;

 1 // reducer
2 import {ADD,DEL} from './actions';
3 const initDatasState={datas:[],length:0};
4 export function datasJson(state=initDatasState,action){
5 switch (action.type) {
6 case ADD:
7 return {datas:[...state.datas,action.payload],length:state.length+1};
8 case DEL:
9 if (state.length<=0) {
10 return state;
11 }
12 state.datas.forEach((a,i)=>{
13 i==action.index&&state.datas.splice(i,1);
14 });
15 return {datas:state.datas,length:state.length-1};
16 default:
17 return state;
18 }
19 }

reducer是一个纯函数,接收旧state和action,返回新state;(previousState,action)=>newState;

reducer可以拆分为多个,最后由combineReducers合并;

1 import {combineReducers} from 'redux';
2 //reducer1
3 function reducer1(initState,action){
4 //return newState
5 }
6 function reducer2(initState,action){
7 //return newState
8 }
9 export default combineReducers({reducer1:reducer1,reducer2:reducer2});

3、连接Redux

引入Redux后,你的App.js可能该这么写了:

 1 import React from 'react';
2 import {connect} from 'react-redux';
3 import {addOne,delOne} from './actions';
4
5 class App extends React.Component{
6 render(){
7 return (
8 <div>
9 <input type="button" onClick={this.props.onAdd} value="addOneItem"/><br/>
10 length:<b>{this.props.length}</b>;datas:<i>{this.props.value}</i><br/>
11 <input type="button" onClick={this.props.onDel} value="delFirst"/>
12 {this.props.children}
13 </div>
14 );
15 }
16 }
17
18 function mapStateToProps(state){
19 return {
20 value:JSON.stringify(state.datas),
21 length:state.length
22 }
23 }
24 function mapDispatchToProps(dispatch){
25 return {
26 onAdd:()=>{
27 let data={id:Math.round(Math.random()*10),text:Math.round(Math.random()*1000000000).toString(16)};
28 dispatch(addOne(data));
29 },
30 onDel:()=>{
31 dispatch(delOne(0));
32 }
33 }
34 }
35
36 export default connect(mapStateToProps,mapDispatchToProps)(App);

如今state已全部交由Redux代管了:mapStateToProps将state绑定映射为props;mapDispatchToProps将修改state的操作映射为props,connect来连接该组件与Redux;既然state都聚集到了Store里,那么映射后的props的取值和修改将都指向Store,这个由Provider解决;

4、Provider

 1 import React from 'react';
2 import ReactDOM from 'react-dom';
3 import {createStore} from 'redux';
4 import {Provider} from 'react-redux';
5 import {reducers} from './reducers';
6 import App from './app';
7
8 const Store=createStore(reducers);
9 console.log(Store.getState());
10 ReactDOM.render(
11 <Provider store={Store}>
12 <App>
13 <Inpt />
14 </App>
15 </Provider>,
16 document.getElementById('views')
17 );

现在Provider作为最外层容器并绑定Store的值,这样,里面的组件中映射成为props的state就都能取到值了;至此,就基本将Redux引进来了;可能把这个简单的增删datas的玩意,用Angular和JQuery都是几行代码的事,而到了这里却要几十行代码,又混进来了一堆概念,而Redux并不仅仅就这些,像Middleware、高阶函数什么的在往后的探索中将再一次刷新你的眼界;我只想说,你咋不上天呢!但是,就这高逼格,哈哈,请带我飞吧!

如果你已在路上,就勇敢的向前吧!

原文来自:花满楼的博客

React和Angular的更多相关文章

  1. React vs Angular 2: 冰与火之歌

    黄玄 · 3 个月前 本文译自 Angular 2 versus React: There Will Be Blood ,其实之前有人翻译过,但是翻得水平有一点不忍直视,我们不希望浪费这篇好文章. 本 ...

  2. 【翻译】React vs Angular: JavaScript的双向性

    翻译原文链接:https://blog.prototypr.io/react-vs-angular-two-sides-of-javascript-b850de22b413 我的翻译小站:http:/ ...

  3. React 和 Angular 各有什么优缺点,各自又适合什么开发场景?

    最近正在学习React,便谈一点自己的浅见. Angular.js首先Angular的背后是Google,所以社区基础是不用担心的,整个生态也已经是非常的完整了,从最基本的Tutorial到Stack ...

  4. Vue-起步篇:Vue与React、 Angular的区别

    毋庸置疑,Vue.React. Angular这三个是现在比较火的前端框架.这几个框架都各有所长,选择学习哪种就得看个人喜好或者实际项目了.相比之下, Vue 是轻量级且容易学习掌握的. 1.Vue和 ...

  5. vue、react、angular三大框架对比 && 与jQuery的对比

    前端当前最火的三大框架当属vue.react以及angular了. 但是在做项目的时候,我们怎么去选择呢?  这里做一个比较,希望大家可以有一个比较清晰的认识. vue与react vue和react ...

  6. vue、react、angular三大框架对比

    前端的三大框架当属vue.react以及angular了,个人比较偏向react,它的社区比较繁荣,有很多丰富的组件 .angular的话感觉编译时间有点长,等待很恼火. vue与react vue和 ...

  7. React vs Angular vs Vue 2019

    React vs Angular vs Vue 看待这三个主流框架给出的想法 Angular is the entire kitchen that gives you all the tools ne ...

  8. React vs. Angular vs. Vue

    原文连接 历史 React是一个用于构建Web应用程序UI组件的JavaScript库. React由Facebook维护,许多领先的科技品牌在其开发环境中使用React. React被Faceboo ...

  9. vue入门 vue与react和Angular的关系和区别

    一.为什么学习vue.js vue.js兼具angular.js和react的优点,并且剔除了他们的缺点 官网:http://cn.vuejs.org/ 手册:http://cn.vuejs.org/ ...

随机推荐

  1. How to recover a skipped tablespace after an incomplete recovery with resetlogs? [ID 1561645.1]

    n this Document   Goal   Solution This document is being delivered to you via Oracle Support's Rapid ...

  2. eclipse 各种版本spring插件安装

    一.安装之前先得知道怎么下载吧: 一般网上找到的资料是到这里就GG了的 --> http://spring.io/tools/sts/all 很明显这点版本是不够我们需要的,假如我们的eclip ...

  3. About

    about: Thanks to NetEase company, the people contribute to NetEase online course, Stephen Prata(< ...

  4. 南阳师范学院ACM集训队博客使用方法

    南阳师范学院ACM集训队博客使用方法 为方便大家交流,我们使用的是同一个用户名和密码,所以请不要随意修改用户名和密码,不然大家都登不上了,谢谢! 首先进入主页:http://www.cnblogs.c ...

  5. 前端中的SEO

    前端中的SEO: mate.title META标签分两大部分:HTTP标题信息(HTTP-EQUIV)和页面描述信息(NAME). <Meta name="Keywords" ...

  6. c语言 文件写入和读取

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 10 struct studen ...

  7. sqlmap的详细使用

    各项参数讲的太仔细了,对于只会几个参数的我来说,太受用了. 先mark下 http://drops.wooyun.org/tips/143 http://drops.wooyun.org/tips/4 ...

  8. html5介绍 之亮点特性

    html5 兴起- 乔帮助在2010年发布的:关于对flash的思考,提到有了h5放弃 flash   1 富图形,富媒体      2 本地存储     cookie   3 LBS      基于 ...

  9. Oracle EBS-SQL (BOM-9):检查系统BOM总数.sql

    SELECT      ITM.SEGMENT1                         物料编码     ,ITM.DESCRIPTION                     物料描述  ...

  10. Delphi 获取北京时间(通过百度和timedate网站)

    方法一: uses ComObj, DateUtils; function GetInternetTime: string; var XmlHttp: OleVariant; datetxt: str ...