在Redux中最核心的自然是组件,以及组件相关的事件与数据流方式。但是我们在Redux中并没有采用传统的方式在getInitialState()中去初始化数据,而是采用Provider统一处理,省去了开发者不少工作,但是Redux到底如何将state中的数据传递给各组件的呢?还得看看Provider的源。

1.常用数据传递写法

在ReactJS中的数据传递一般采用state和props,而props作为父组件向子组件的主要方式。如:

const TodoList = ({ todos, onTodoClick }) => (

<ul>

{todos.map(todo =>

<Todo

key={todo.id}

{...todo}

onClick={() => onTodoClick(todo.id)}

/>

)}

</ul>

)

以上代码可以看出key, todo数据对象,包括onClick函数都是采用props的方式传递给Todo子组件的。

但是作为统一的数据传递方式Provide,是怎样做的呢。

2.Provider的实现方式。

在我们在调用Provider时,采用的是以下的方式:

const store = createStore(reducer)

render(

<Provider store={store}>

<App />

</Provider>,

document.getElementById('root')

);

a.首先我们看到的是先创建store对象;

b.然后将store传递给Provider;

c.然后将应用组件做为Provider的子组件。

不过问题又来了:我们并没有看到Provider将store作为props传递给子组件啊。

3.Provider源码实现

打开Provider源码,我们看到Provider的源码实现并不多,除去一些安全性检查的代码外,仅仅剩下面的代码。

export default class Provider extends Component {

getChildContext() {

return { store: this.store }

}

constructor(props, context) {

super(props, context)

this.store = props.store

}

render() {

return Children.only(this.props.children)

}

}

上面的代码可以看出Provider是通过getChildContext的的方式传递给子组件的,并且我们也在connect中看到子组件取数据的过程:constructor(props, context) {

super(props, context)

this.version = version

this.store = props.store || context.store

.......

}

在没有定义props的情况下,通过context直接取得store中的数据,或者说取得context中的数据。而常见的场景一般如下:

<Provider store={store}>

<App />

</Provider>

看来Provider的实现原理,也就知道了它的封装过程和方法,也能更加灵活的运用了

React深入源码--了解Redux用法之Provider的更多相关文章

  1. 精读《React PowerPlug 源码》

    1. 引言 React PowerPlug 是利用 render props 进行更好状态管理的工具库. React 项目中,一般一个文件就是一个类,状态最细粒度就是文件的粒度.然而文件粒度并非状态管 ...

  2. React Fiber源码分析 (介绍)

    写了分析源码的文章后, 总觉得缺少了什么, 在这里补一个整体的总结,输出个人的理解~ 文章的系列标题为Fiber源码分析, 那么什么是Fiber,官方给出的解释是: React Fiber是对核心算法 ...

  3. 《React Native 精解与实战》书籍连载「React Native 源码学习方法及其他资源」

    此系列文章将整合我的 React 视频教程与 React Native 书籍中的精华部分,给大家介绍 React Native 源码学习方法及其他资源. 最后的章节给大家介绍 React Native ...

  4. React的React.createContext()源码解析(四)

    一.产生context原因 从父组件直接传值到孙子组件,而不必一层一层的通过props进行传值,相比较以前的那种传值更加的方便.简介. 二.context的两种实现方式 1.老版本(React16.x ...

  5. React的React.createElement源码解析(一)

    一.什么是jsx  jsx是语法糖  它是js和html的组合使用  二.为什么用jsx语法 高效定义模版,编译后使用 不会带来性能问题 三.jsx语法转化为js语法  jsx语法通过babel转化为 ...

  6. 从 源码 谈谈 redux compose

    compose,英文意思 组成,构成. 它的作用也是通过一系列的骚操作,实现任意的.多种的.不同的功能模块的组合,用来加强组件. 看看源码 https://github.com/reactjs/red ...

  7. redux源码解析-redux的架构

    redux很小的一个框架,是从flux演变过来的,尽管只有775行,但是它的功能很重要.react要应用于生成环境必须要用flux或者redux,redux是flux的进化产物,优于flux. 而且r ...

  8. 精读《Epitath 源码 - renderProps 新用法》

    1 引言 很高兴这一期的话题是由 epitath 的作者 grsabreu 提供的. 前端发展了 20 多年,随着发展中国家越来越多的互联网从业者涌入,现在前端知识玲琅满足,概念.库也越来越多.虽然内 ...

  9. springMVC源码分析--@SessionAttribute用法及原理解析SessionAttributesHandler和SessionAttributeStore

    @SessionAttribute作用于处理器类上,用于在多个请求之间传递参数,类似于Session的Attribute,但不完全一样,一般来说@SessionAttribute设置的参数只用于暂时的 ...

随机推荐

  1. Linux 之 Memcached

    Memcached的安装使用 参考教程:[千峰教育] 环境:CentOS 6.8 一.简介: memcached作为高速运行的分布式缓存服务器,具有以下的特点. · 协议简单 · 基于libevent ...

  2. yii 数据库添加,修改,删除相关操作总结

    yii中关于数据信息的添加数据,修改数据,删除数据的相关操作,刚刚学习没几天,仅记录了一些,以后慢慢再充实,有需要的朋友可以看看. 添加数据的方法 (1)save 方法(对象形式操作) $user=n ...

  3. LeetCode OJ--Regular Expression Matching

    http://oj.leetcode.com/problems/regular-expression-matching/ 问题给想复杂了,只有p中可以含有. *,s中的字符都是确定的.想了好久,最终还 ...

  4. String()和.toString()的区别

    一.相同点:都可以转为字符串类型: 二.不同点: 1..toString() :null.toString()和undefined.toString() 程序报错误; 2..toString(): . ...

  5. win7快捷键和ubuntu快捷键

    http://www.cnblogs.com/xfiver/archive/2010/12/08/1899905.html http://www.pc841.com/article/20121203- ...

  6. Springboot的Bean的Scope

    这周在项目中遇到这样一个Bug,代码大致是这样的,有一个LogEntity日志类,里面有一个InnerLog负责存储每次请求的RPCInfo相关信息, 每次请求的时候会把RPC相关信息加入到Inner ...

  7. android -- 存储byte

    public static String byteArrayToHexStr(byte[] byteArray) { if (byteArray == null){ return null; } ch ...

  8. 纯CSS3美化radio和checkbox

    如题,主要通过CSS3来实现将radio和checkbox美化的效果.可是兼容性并非非常好,PC端仅仅支持chrome浏览器(IE和Firefox測试不行,其它没有很多其它測试).然后微信端和QQ端訪 ...

  9. SilverLight:基础控件使用(1)

    ylbtech-SilverLight-Basic-Control:基础控件使用(1) 本文详解控件有: Label, TextBox, PasswordBox, Image, Button , Ra ...

  10. Delphi图像处理 -- 文章索引

    转载:http://blog.csdn.net/maozefa/article/details/7188354 本文对已发布<Delphi图像处理>系列文章进行索引链接,以方便阅读和查找. ...