深入理解Provider


在Redux中最核心的自然是組件,以及組件相關的事件與數據流方式。但是我們在Redux中並沒有采用傳統的方式在getInitialState()中去初始化數據,而是采用Provider統一處理,省去了開發者不少工作,但是Redux到底如何將state中的數據傳遞給各組件的呢?還得看看Provider的源碼實現(微信:react-javascript)。

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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM