React深入源码--了解Redux用法之Provider

24 篇文章 0 订阅


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


1.常用数据传递写法

ReactJS中的数据传递一般采用stateprops,而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的子组件。

不过问题又来了:我们并没有看到Providerstore作为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的实现原理,也就知道了它的封装过程和方法,也能更加灵活的运用了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值