React
是咱們的視圖框架,但在大型項目開發的時候須要公用的數據狀態是很難管理的,有明顯父子關係的組件還比較方便傳遞值,但不要緊的組件傳值是很是麻煩的,這時候就須要用到咱們的狀態管理庫Redux
,該文章會講解在實際React
項目開發中redux + react-redux + redux-thunk
組合應用,這也是咱們如今企業項目開發中最經常使用的搭配,讓你可以快速應用起來!react
Redux
是搭配 React
項目開發中最經常使用的狀態管理庫,你們知道在咱們 React
項目開發時,組件的公用數據狀態(如用戶信息等),可能多組件都會用到,若是組件間的關係比較明確(如父子關係),傳遞還比較方便,但若是關係不明確或者毫無關係,這時候就很是麻煩了,但藉助咱們的Redux
能夠把這些狀態存到Redux
的store
中,哪一個組件須要就去store
裏面取,哪一個組件想要改變store
,就去調取相應的action
,action
會觸發reducer
改變store
,這樣每一個組件的store
都會改變。es6
npm i redux react-redux redux-thunk
複製代碼
這裏咱們一次安裝了三個庫:ajax
redux
:核心庫,完成store
數據狀態管理,reducer
(觸發會返回新的store
替換老的store
)管理,action
(reducer
咱們不能直接觸發,須要調用action
來觸發reducer
)管理。npm
react-redux
:用來簡化在React
中使用Redux
的流程,其中Provider
提供器,全局提供store
狀態,connect
鏈接器,須要store
狀態的用他來鏈接。redux
redux-thunk
:使redux
的action
可以寫異步方法,自己action
中是不能寫異步方法的,用了redux-thunk
才能夠。bash
在項目src目錄中建立相應目錄和文件 app
store/index.js
:建立
store
,並把
reducer
傳入做爲第一個參數,應用中間件
redux-thunk
做爲第二個參數,具體代碼以下
import { createStore, applyMiddleware } from "redux";
import reducer from "./reducer";
import thunk from "redux-thunk";
const store = createStore(reducer, applyMiddleware(thunk));
export default store;
複製代碼
store/reducer.js
:建立了一個count
的reducer
,每次觸發action
的時候會把傳過來的值做爲第二個參數,第一個參數爲老的state
,reducer
執行完畢返回新的state
會替換老的state
,其中咱們還引入redux
的combineReducers
是用來合併多個reducer
最終返回一個集成的reducer
框架
import { combineReducers } from "redux";
import { COUNT_ADD, COUNT_REDUCE } from "./action-type";
const initCount = {
count: 0,
};
function count(state = initCount, action) {
switch (action.type) {
case COUNT_ADD:
return state.count + 1;
case COUNT_REDUCE:
return state.count - 1;
default:
return state;
}
}
export default combineReducers({
count,
});
複製代碼
store/action.js
:每次咱們想要改變store
,都須要先觸發action
,另外咱們用了redux-thunk
後。能夠在action
中執行異步方法(如ajax數據請求等),action去觸發reducer
發生store
的改變。在此示例中,個人action
比較簡單,實際中你們的可能比較複雜,可是原理相同,一個action
方法,執行相應邏輯(如ajax請求,或邏輯判斷等),最後返回一個action
對象,reducer
會根據action
對象的type
和data
來執行相應的store
更改dom
import { COUNT_ADD, COUNT_REDUCE } from "./action-type";
export const receiveCountAdd = () => ({ type: COUNT_ADD });
export const receiveCountReduce = () => ({ type: COUNT_REDUCE });
複製代碼
store/action-type.js
:這裏面是咱們相應action
對象的type
,爲何我要作這麼一個步驟,由於咱們須要在action.js
傳遞action
對象的時候加上他,也要在reducer.js
判斷相應的type
,避免由於type
比較長比較複雜,兩邊不一致,程序也不會報錯(由於reducer
判斷沒有相應type
就會走default
),因此咱們設置一個常量做爲type
異步
// count自增
export const COUNT_ADD = 'COUNT_ADD'
// count自減
export const COUNT_REDUCE = 'COUNT_REDUCE'
複製代碼
到此咱們相應的store
就總體建立完畢,接下來就是在相應組件中使用它了。
store
及觸發action
改變store
在此以前咱們要在全局用react-redux
的Provider
全局提供store
狀態,這裏咱們直接在index.js
中使用它,並把store
傳遞給他的屬性store
import React from "react";
import ReactDOM from "react-dom";
import App from "./views/App";
import { Provider } from "react-redux";
import store from './store'
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById("root")
);
複製代碼
接下來咱們就能夠在組件中使用connect
鏈接器獲取咱們須要的store
以及相應的action
了,首先引入connect
和咱們建立的相應action
:receiveCountAdd
,在暴露組件的使用connect
,它是一個高階函數(執行函數返回一個函數),執行第一個函數時有兩個參數(第一個爲須要接收的state
,這裏咱們是count,第二個爲action
,這裏用的es6寫法),第二個函數再傳入咱們的組件名,作此步驟後,咱們須要的store
和action
就會掛載到咱們的props
上,而後咱們獲取或者執行就很是簡單了(見useEffect
中)
import React, { useEffect } from "react";
import { connect } from "react-redux";
import { receiveCountAdd } from "../../store/action";
function Article(props) {
useEffect(() => {
props.receiveCountAdd();
console.log(props.count);
}, []);
return <div>文章信息</div>;
}
export default connect(
(state) => ({ count: state.count }),
{ receiveCountAdd },
)(Article);
複製代碼
至此,Redux + React-Redux + Redux-Thunk 在 React 實際項目開發中使用詳解就講解完畢了,若是有不太明白的小夥伴,能夠留言哦!