React和Angular
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的更多相关文章
- React vs Angular 2: 冰与火之歌
黄玄 · 3 个月前 本文译自 Angular 2 versus React: There Will Be Blood ,其实之前有人翻译过,但是翻得水平有一点不忍直视,我们不希望浪费这篇好文章. 本 ...
- 【翻译】React vs Angular: JavaScript的双向性
翻译原文链接:https://blog.prototypr.io/react-vs-angular-two-sides-of-javascript-b850de22b413 我的翻译小站:http:/ ...
- React 和 Angular 各有什么优缺点,各自又适合什么开发场景?
最近正在学习React,便谈一点自己的浅见. Angular.js首先Angular的背后是Google,所以社区基础是不用担心的,整个生态也已经是非常的完整了,从最基本的Tutorial到Stack ...
- Vue-起步篇:Vue与React、 Angular的区别
毋庸置疑,Vue.React. Angular这三个是现在比较火的前端框架.这几个框架都各有所长,选择学习哪种就得看个人喜好或者实际项目了.相比之下, Vue 是轻量级且容易学习掌握的. 1.Vue和 ...
- vue、react、angular三大框架对比 && 与jQuery的对比
前端当前最火的三大框架当属vue.react以及angular了. 但是在做项目的时候,我们怎么去选择呢? 这里做一个比较,希望大家可以有一个比较清晰的认识. vue与react vue和react ...
- vue、react、angular三大框架对比
前端的三大框架当属vue.react以及angular了,个人比较偏向react,它的社区比较繁荣,有很多丰富的组件 .angular的话感觉编译时间有点长,等待很恼火. vue与react vue和 ...
- React vs Angular vs Vue 2019
React vs Angular vs Vue 看待这三个主流框架给出的想法 Angular is the entire kitchen that gives you all the tools ne ...
- React vs. Angular vs. Vue
原文连接 历史 React是一个用于构建Web应用程序UI组件的JavaScript库. React由Facebook维护,许多领先的科技品牌在其开发环境中使用React. React被Faceboo ...
- vue入门 vue与react和Angular的关系和区别
一.为什么学习vue.js vue.js兼具angular.js和react的优点,并且剔除了他们的缺点 官网:http://cn.vuejs.org/ 手册:http://cn.vuejs.org/ ...
随机推荐
- matlab求方差,均值,均方差,协方差的函数
1. 均值 数学定义: Matlab函数:mean >>X=[1,2,3] >>mean(X)=2 如果X是一个矩阵,则其均值是一个向量组.mean(X,1)为列向量的均值,m ...
- mysql学习(六)-索引
主键索引: 确定唯一的一条记录,只能有一个主键(primary key) 主键不能为空 1.create table if not exists t1(id int not null auto_inc ...
- 关于http状态码204理解
HTTP的状态码有很多种,主要有1xx(临时响应).2xx(成功).3xx(已重定向).4xx(请求错误)以及5xx(服务器错误)五个大类,每个大类还对应一些具体的分类.平时我们接触比较多的是200. ...
- SQL Server带游标的SQL
DECLARE test_cursor CURSOR FOR SELECT ID FROM dbo.T_BD_Restaurant WHERE id <> '0AAB2E55-79F8-4 ...
- ORACLE RAC中一个实例不能随crs自动启动的解决
现象:在两个节点上做CRS的重启,这个实例都不能随CRS的启动而启动.CRS启动后做crs_start -all可以把没启动的资源起来,而且无报错. 分析:去crsd.log中找原因,发现CRS根本就 ...
- 学习Emacs系列教程
emacs最简单入门,只要10分钟 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...
- iOS多线程总结(二)NSOperation
NSOperation.h定义了NSOperation,内容非常的简洁,NSOperation本身是一个抽象类,定义了一个要执行的Task,NSOperationQueue是一个Task队列,当Tas ...
- sql 多条件查询 拼接字符串 改成 普通查询格式
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROC [dbo].[usp_SRV_CheckServiceDemandOrder] ) = ...
- SVG 教程
SVG 意为可缩放矢量图形(Scalable Vector Graphics). SVG 使用 XML 格式定义图像. 现在开始学习 SVG! <html> <body> &l ...
- Struts2 四、Struts2 处理流程
1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可 ...