第 27 天 !
昨天我們把 redux 給接入到我們的專案上,
那今天試著把 store 的 state 給導入到我們的 component 裡,
那我們要如何取得 store 的資訊呢?
在 redux 裡, 我們是不能直接的去存取 store 的資料,
所以我們必須去用間接的方式去取得我們想要的資訊,
首先,我們先使用 redux 提供的 connect ,
connect 會幫我們去連接 store ,並且讓我們設定要提取哪些資料跟 action
connect(mapStateToProps?, mapDispatchToProps?, mergeProps?, options?)
用法:
connect(mapStateToProps, mapDispatchToProps, mergeProps, options)(Component);
當我們希望從 store 上獲取 state 時,就需要去設定 mapStateToProps , 格式是 function,
它會導入 store 的 state , return 的值,會被當成 props , 傳給指定的 component,
只要 store 發生變化,就會觸發這個 function
like:
const mapStateToProps = (state, ownProps) => {
return {
...state,
};
};
當返回值發生變化的話, 就會觸發 re-render,
如果,mapStateToProps 沒有設定, 那 store 的變化,將不會影響到這個 component
在 redux , dispatch 是無法隨意引入的,要引入必須從 mapDispatchToProps ,
它會提供 dispatch 來讓我們導入 action
格式是 function :
const mapDispatchToProps = (dispatch, ownProps) => {
return {
action: (payload) => {
dispatch(actionCreator(payload));
},
};
};
格式是 object:
const mapDispatchToProps = {
actionCreator: (payload) => ({
type: '',
payload,
}),
};
有兩種綁定方式, 一種是 function ,一種是 object ,
function 比較屬於客製化, 就是說假如還想在裡面加上額外邏輯,那就選用 function ,
最後都會把我們設定的當做 props 傳入 component
export default function Home({ action }) {
return <div className={cls.root}></div>;
}
假如沒有,其實可以考慮傳入 actionCreator , connect 會幫你自動綁定 dispatch
最後假如不設定,最後會把 dispatch function 當 props 傳入,
export default function Home({ dispatch }) {
return <div className={cls.root}></div>;
}
redux 相關的參數都會是 props 傳遞, 那如何跟 component 的 props 做合併,那就必須要去考慮順序,
原本的順序是:
那我們可以根據我們的需求,去調整這部份,
格式是:
function mergeProps(stateProps, dispatchProps, ownProps) {
return {
...stateProps,
...dispatchProps,
...ownProps
}
}