React-Redux源码解析(二) -- Provider

上篇文章已经说了,provider主要的作用就是将外界传入的store设置成可以通过this.context获取。 所以它的实现方式也比较简单:

主要就是定义childContextTypes,还有getChildContext。

export function createProvider(storeKey = 'store', subKey) {
    const subscriptionKey = subKey || `${storeKey}Subscription`

    class Provider extends Component {
        getChildContext() {
          // 在这里将它赋值给this.context
          return { [storeKey]: this[storeKey], [subscriptionKey]: null }
        }

        constructor(props, context) {
          super(props, context)
          // 将外面传入的store赋值给this.store
          this[storeKey] = props.store;
        }

        render() {
         // Children.only用于获取仅有的一个子组件,多过或者少一一个都会报错
          return Children.only(this.props.children)
        }
    }

    if (process.env.NODE_ENV !== 'production') {
      Provider.prototype.componentWillReceiveProps = function (nextProps) {
        if (this[storeKey] !== nextProps.store) {
          warnAboutReceivingStore()
        }
      }
    }

    Provider.propTypes = {
        store: storeShape.isRequired,
        children: PropTypes.element.isRequired,
    }
    Provider.childContextTypes = {
        [storeKey]: storeShape.isRequired,
        [subscriptionKey]: subscriptionShape,
    }

    return Provider
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杂烩

分布式服务框架之Dubbo整合Spring项目(二)

822
来自专栏Phoenix的Android之旅

伪造客户端IP

XFF字段在我之前的推送中有介绍过具体是什么含义跟作用, 那些伪造IP的软件都是什么原理 但是在那篇推送中没有公开源码,其实也是出于安全考虑。说到这里就要来回答...

1382
来自专栏岑志军的专栏

ReactNative-ListView

1873
来自专栏游戏杂谈

cocos2d-x 2.x版本接入bugly的总结

最开始项目使用的是自己DIY的很简陋的上报系统,后来改成google breakpad来上报,发现其实都做的不太理想,游戏引擎因为版本历史问题存在一些崩溃问题。...

800
来自专栏黑白安全

来做个Google Hack吗?

storemanager/contents/item.php?page_code=

3056
来自专栏Android开发经验

Volley从源码梳理主要工作流程简记

重点来了。 这里开启了一个缓存调度线程CacheDispatcher,一个网络请求调度线程NetworkDispatcher。

522
来自专栏图形学与OpenGL

9.3.3编程实例-图形拾取

int select_point = 0; //1 是第一个点,2是第二个,以此类推

1224
来自专栏哈雷彗星撞地球

iOS 中获取某个视图的截图

最近在做SDK的截图,想触发类似系统的截屏功能,找了一圈,总结一下靠谱的几种方式。 我写了个UIView 的category,将这几种方式封装和简化了一下。

1293
来自专栏bboysoul

linux下的彩蛋和各种有趣的命令

循环输出 for ((i=1;i<=30;i++));do linux_logo -f -L $i;sleep 0.1;done

1314
来自专栏Rindew的iOS技术分享

iOS地图找房(类似链家、安居客等地图找房)

2086

扫码关注云+社区