在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>