[Redux] react-redux API 筆記
react-redux documentation @ github
connect API
connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options]);
在 Redux 中可以透過 connect
將傳入該 components 的 states 和 actions 進行篩選或初步處理,這個方法不會改變你原本的 components,而是回傳一個加料後新的 components 給你。
mapStateToProps:使用 connect 來取得 Redux 中的 states
mapStateToProps @ react-redux
// ownProps 指的是該 component 本身所擁有的 props
// state 則是指在 Redux store 中的所有資料
function mapStateToProps(state, [ownProps]) {
return {
// 在該 components 中會用到的資料
};
}
- 當在
connect
中代入這個參數後,新的元件會訂閱 Redux store 的更新,也就是說每次只要 store 有更新,mapSateToProps
都會被呼叫到。 mapStateToProps
回傳的內容必需是一個物件,它會合併到該元件的props
屬性中。- 如果你不希望訂閱 Redux 中 store 的更新,那麼可以把這個參數代入
null
或undefined
。 - 在
mapStateToProps
中第一個參數會是整個 Redux store 中的 state,可以從中篩選希望進到此元件的資料作為props
,因此它也常被稱作 selector。
程式範例
// @/containers/post_index.js
import React from 'react';
import { connect } from 'react-redux';
class PostIndex extends React.Component {
/* 原本在 Redux 中的 state.posts 可以透過 this.props.posts 取得 */
console.log(this.props.posts);
render() {
return <h1>I'm a Redux container.</h1>;
}
}
/* 不篩選任何資料,全部 Redux 的 states 都進來此元件 */
// const mapStateToProps = state => state;
const mapStateToProps = (state, ownProps) => {
/* 這裡 return 的內容將可以在 this.props 中使用 */
return {
posts: state.posts // 這裡只傳入 Redux states 中的 posts 資料進來此元件
}
}
connect(mapStateToProps)(PostIndex);
mapDispatchToProps:使用 connect 來 dispatch actions
mapDispatchToProps @ react-redux
[mapDispatchToProps(dispatch, [ownProps]): dispatchProps] (Object or Function)
代入函式:針對 action generator 進行篩選或前置處理
// @/containers/post_index.js
import React from 'react';
import { connect } from 'react-redux';
import { fetchPosts } from '@/actions';
class PostIndex extends React.Component {
render() {
/* 不需要 this.props.dispatch(fetchPosts()) */
this.props.fetchPosts();
return <h1>I'm a Redux container.</h1>;
}
}
const mapDispatchToProps = (dispatch, ownProps) => {
/* 這裡 return 的內容將可以在 this.props 中使用 */
return {
fetchPosts: () => dispatch(fetchPosts()),
};
};
connect(mapStateToProps, mapDispatchToProps)(PostIndex);