React深入源碼--瞭解Redux用法之Provider


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的實現原理,也就知道了它的封裝過程和方法,也能更加靈活的運用了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章