前言
最近在學 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。
資源搜索網站大全 https://www.renrenfan.com.cn 廣州VI設計公司https://www.houdianzi.com
修改 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 修改哪些數據。