前言
最近在學 React
,看到 react-redux
這裡,剛開始覺得一臉懵逼,後面通過查閱相關資料和一些對原始碼的解釋,總算有點頭緒,今天在這裡總結下。
類似於 Vue
,React
中元件之間的狀態管理 第三方包為:react-redux
。react-redux
其實是 Redux
的官方React
繫結庫,它能夠使你的React
元件從Redux
store
中讀取資料,並且向store
分發actions
以更新資料。
值得一提的是 redux
其實是一個第三方 資料狀態管理的庫,它不僅僅可以和react
結合使用,你也可以把它應用到 vue
中 , react-redux
其實是幫我們封裝了 redux
連線 react
的一些操作,使用 react-redux
可以非常簡單的在 react
中使用 redux
來管理我們應用的狀態。
使用 redux 來管理 react 資料
開始之前先安裝
npm install redux react-redux --save
安裝完這兩個庫之後,可以用 redux
來建立 store
, 利用 react-redux
獲取 store
中的資料或者更新資料。
react-redux
提供了兩個常用的 api
,一個是: Provider
,一個是:connect
。 元件之間共享的資料是 Provider
這個頂層元件通過 props
傳遞下去的,store必須作為引數放到Provider元件中去。而 connect
則提供了元件獲取 store 中資料或者更新資料的介面。
建立 store
瞭解一些基本的概念之後,我們現在開始來用。
在外圍頂層元件中引入 redux
和 react-redux
兩個庫。我們在做業務之前都需要將頁面拆分成不同的元件,這裡的外圍元件通常指的是我們拆分後的所有元件的父元件。
import { createStore } from 'redux'
import { Provider } from 'react-redux'
引入 createStore
來建立元件共享的資料,這個是 redux
中提供的一個方法,我們直接引入。
const themeReducer = (state, action) => {
if (!state) return {
themeColor: 'red'
}
switch (action.type) {
case 'CHANGE_COLOR':
return { ...state, themeColor: action.themeColor }
default:
return state
}
}
const store = createStore(themeReducer)
上面的程式碼建立了一個 {themeColor: 'red'}
的 store
,並且提供了修改顏色的方法,元件通過指定的 action.type
中的 CHANGE_COLOR
欄位來修改主體顏色。程式碼中可以看出,我們傳入非法的修改欄位名,則返回原始的 state
,即修改失敗。
使用 store 中的 state
建立完資料之後,元件中怎樣使用到全域性的資料狀態呢?請看下面:
在需要使用資料的元件中引入 react-redux
import { connect } from './react-redux'
我們從 react-redux
中引入了 connect
這個方法。其實 connect
方法一共有4個引數,這裡主要講前兩個。
connect(mapStateToProps, mapDispatchToProps)(MyComponent)
mapStateToProps
字面含義是把state對映到props中去,意思就是把Redux中的資料對映到React中的props中去。
也就是說你React想把Redux中的哪些資料拿過來用。
class Header extends Component {
static propTypes = {
themeColor: PropTypes.string
}
render () {
return (
<h1 style={{ color: this.props.themeColor }}>React.js 小書</h1>
)
}
}
const mapStateToProps = (state) => {
return {
themeColor: state.themeColor
}
}
Header = connect(mapStateToProps)(Header)
上面程式碼是拿到 Redux store
中 themeColor
資料, 這是我們前面自己建立的資料,然後元件通過 this.props.themeColor
呼叫。
那麼這樣就可以實現渲染,就是把Redux中的state變成React中的props。
修改 store 中 state
現在的主題顏色是自己定義的紅色,如果我們想在某個元件中修改這個全域性的狀態,比如修改為藍色,該如何操作,這就涉及到修改 store 中 state。
修改 Redux 中的 state ,需要用到前面 connect 中的第二個引數:mapDispatchToProps
,通過上面的分析,相信這個函式也很好理解,就是把各種 dispatch
也變成了 props
讓你可以直接使用,進而修改 store
中的資料。
class SwitchColor extends Component {
handleChangeColor (color) {
this.props.changeColor(color)
}
render() {
return (
<div>
<button style={{color: this.props.themeColor}} onClick={this.handleChangeColor.bind(this, 'blue')}>blue</button>
<button style={{color: this.props.themeColor}} onClick={this.handleChangeColor.bind(this, 'red')}>red</button>
</div>
)
}
}
const mapStateToProps = (state) => {
return {
themeColor: state.themeColor
}
}
const mapDispatchToProps = (dispatch) => {
return {
changeColor: (color) => {
dispatch({type: 'CHANGE_COLOR', themeColor: color})
}
}
}
SwitchColor = connect(mapStateToProps, mapDispatchToProps)(SwitchColor)
上面的程式碼實現了通過點選按鈕來修改主題顏色,我們在 mapDispatchToProps
中呼叫了 dispatch()
來通知 Redux store
修改 資料,這裡需要注意傳入 dispatch()
的引數為一物件,其中必須有 type
屬性來告訴 store 修改哪些資料。
說明
本篇文章 出自於 我們 GitHub
倉庫 web-study
,詳情可見:戳這裡, 歡迎 star
,一起交流學習前端。