react-redux的Provider和Connect的引发的思考
react是当下非常流行的JS框架,react秉承的设计原则是一切皆组件;react-redux是react中使用redux的桥接工具,react-redux也继承react的设计原则,使用组件的形式提供服务。
react-redux向用户暴漏了两个核心组件,分别是Provider和Connect。相信使用过react-redux的小伙伴都不难理解Provider是组件,其实connect本质也是一个组件,即是常说的HOC组件(高阶组件),官方对connect的介绍是:“连接 React 组件与 Redux store”。
1、先介绍一下Provider和connect的使用常场景
(1)Provider的使用方法如下所示,只要把需要使用store的组件(通常是App根组件)包裹起来就可以
<Provider store={store}>
<App></App>
</Provider>
(2)connect的使用方法如下所示,可见connect其实是一个高阶函数,接收两个参数(还有可选参数),返回一个新的函数,新的函数接收一个组件为输入,返回新的组件。这不就是react中HOC组件的定义吗,接收子组件,返回新的容器组件。由此可知,connect其实也是一个组件。
1 connect(mapStateToProps, mapDispatchToProps)(App);
2、下面再来看看Provider和connect是如何提供服务的:
(1)Provider组件有一个属性store,其接收一个用户定义的js对象作为store,给所有子组件提供state;
(2)connect组件接收两个属性(不考虑可选参数),mapStateToProps将store中的state转化为新的容器组件的props,mapDispatchToProps则是将redux中的action转化为新的容器组件的props,返回可使用的props的新的组件。这整个即是使用connect组件返回的新的组件。
<connect mapStateToProps={mapStateToProps} mapDispatchToProps={mapDispatchToProps}>
<App></App>
</connect>
这个场景是不是似曾相识,没错,provider和connect的功能都是通过给自身的属性赋值,将需要的功能传递给子组件,使得子组件也拥有相应的功能;这不就是熟悉的依赖注入吗,将需要的功能通过第三方的形式提供给需要的组件,从而实现逻辑上的解耦。熟悉angular的同学可能更加清晰,angular是通过模块加载时将提前设定好的功能注入到相应的组件,react中也是一样,只不过变成了更为熟悉的组件的形式来提供服务,换句话说,provider和connect都是依赖注入的语法糖,其本质是通过引入第三方组件(这里即是Provider组件),将需要的功能通过属性的形式注入到子组件(熟悉angular的同学可自行脑补service的使用场景)。 HOC的原始需求不外乎如此,通过高阶组件将action和view进行逻辑上的解耦,从而实现view的复用。
react-redux的Provider和Connect的引发的思考的更多相关文章
- React & Redux 的一些基本知识点
一.React.createClass 跟 React.Component 的区别在于后者使用了ES6的语法,用constructor构造器来构造默认的属性和状态. 1. React.createCl ...
- react+redux教程(一)connect、applyMiddleware、thunk、webpackHotMiddleware
今天,我们通过解读官方示例代码(counter)的方式来学习react+redux. 例子 这个例子是官方的例子,计数器程序.前两个按钮是加减,第三个是如果当前数字是奇数则加一,第四个按钮是异步加一( ...
- [Redux] Generating Containers with connect() from React Redux (VisibleTodoList)
Learn how to use the that comes with React Redux instead of the hand-rolled implementation from the ...
- webpack+react+redux+es6开发模式
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- react+redux教程(四)undo、devtools、router
上节课,我们介绍了一些es6的新语法:react+redux教程(三)reduce().filter().map().some().every()....展开属性 今天我们通过解读redux-undo ...
- angular开发者吐槽react+redux的复杂:“一个demo证明你的开发效率低下”
曾经看到一篇文章,写的是jquery开发者吐槽angular的复杂.作为一个angular开发者,我来吐槽一下react+redux的复杂. 例子 为了让大家看得舒服,我用最简单的一个demo来展示r ...
- React + Redux 入坑指南
Redux 原理 1. 单一数据源 all states ==>Store 随着组件的复杂度上升(包括交互逻辑和业务逻辑),数据来源逐渐混乱,导致组件内部数据调用十分复杂,会产生数据冗余或者混用 ...
- webpack+react+redux+es6
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- React+Redux学习笔记:React+Redux简易开发步骤
前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文 ...
随机推荐
- discuz数据库函数使用
- OpenSSL 使用 base64 编码/解码(liang19890820)
关于 OpenSSL 的介绍及安装请参见:Windows 下编译 OpenSSL 下面主要介绍有关 OpenSSL 使用 base64 编码/解码. 简述 编码解码 更多参考 编码/解码 #inclu ...
- JieBaNet+Lucene.Net
基于JieBaNet+Lucene.Net实现全文搜索 实现效果: 上一篇文章有附全文搜索结果的设计图,下面截一张开发完成上线后的实图: 基本风格是模仿的百度搜索结果,绿色的分页略显小清新. 目前 ...
- C# 异步和多线程
C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿! 说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开 ...
- RabbitMq核心概念和术语
简介 越来越多的消息中间件很容易让人产生混淆,在学习一种消息中间件的时候,最好先了解他的几种抽象概念,方便你理解,明白了这些概念,你学习起来的时候也就得心应手,同时也是使用好RabbitMQ的基础. ...
- 关于提高UDP发送效率的方法
UDP的发送效率和什么因素有关呢? 直观觉得,UDP的切包长越大,应该发送效率越高(最长为65536).可是依据实际測试和在网上查到的资料的结果,包长度为1024为发送效率最高. 这样的结果让人感到疑 ...
- uwp - RichEditBox 解决设置字体样式后滚动条自动回滚顶部的问题
原文:uwp - RichEditBox 解决设置字体样式后滚动条自动回滚顶部的问题 开发中碰到一个问题,当RichEditBox输入的文本达到一定行数的时候,滚动条此时位于底部,改变文本样式(如字体 ...
- 采用Fiddler建立Asp.net webapi与Android/IOS调试环境
最近,他们正在做Android+Asp.net WebApi练习,通过发现visual studio debug模式启动Asp.net之后,无法响应Android寄过来http求,设置一个很好的休息不 ...
- WPF图形/文字特别效果之一:交叉效果探讨(续)
原文:WPF图形/文字特别效果之一:交叉效果探讨(续) 在"WPF图形/文字特别效果之一:交叉效果探讨"(http://blog.csdn.net/johnsuna/archive ...
- python3实现万年历(包括公历、农历、节气、节日)
#!/usr/local/bin/python3 # coding=utf-8 # Created: 20/07/2012 # Copyright: http://www.cnblogs.com/tx ...