react和redux中的幾種常用的方法
1. createStore(reducer, [initState, enhancer])------redux中的方法
- 作用:建立一個Redux store來存放應用中所有的state,一個應用只能有個store。函式返回store物件。
- 引數:
- reducer(Function):兩個引數:state和action,返回一個state。 不要對引數state進行修改,需要返回一個新的物件。
- initStatate:初始state。如果不為空,需要和reducer中處理的state結構一致
- enhancer:一箇中間件,如logger等。
例如:
import { createStore, applyMiddleware, compose } from 'redux'
import thunk from 'redux-thunk'
import createLogger from 'redux-logger'
import api from '../middleware/api'
import rootReducer from '../reducers'
import DevTools from '../containers/DevTools'
export default function configureStore(preloadedState) {
const store = createStore(
rootReducer,
preloadedState,
compose(
applyMiddleware(thunk, api, createLogger()),
DevTools.instrument()
)
)
return store
}
2. Store
Store是用來維持應用所有state樹的一個物件。改變state的唯一方法是store dispatch一個action。
Store不是類,而只是一個有幾個方法的物件,可以採用createStore進行建立。
- getState()
返回應用當前的 state 樹。它與 store 的最後一個 reducer 返回值相同。 - dispatch(action)
分發action,這是改變state的唯一方法。 - subscribe(listener)
新增一個變化監聽器,每當 dispatch action 的時候就會執行,state 樹中的一部分可能已經變化。你可以在回撥函式裡呼叫 getState() 來拿到當前 state。函式返回一個解綁的函式。可以參考 - replaceReducer(nextReducer)
替換Reducer,用處較少。// 渲染和訂閱渲染 function render() { valueEl.innerHTML = store.getState().toString() } store.subscribe(render)
3. combineReducers(reducers)
combineReducers輔助函式的作用是,把一個由多個不同 reducer 函式作為 value 的 object,合併成一個最終的 reducer 函式,然後就可以對這個 reducer 呼叫 createStore。
多個子reducer函式合併後,相當於整體函式會為state特定欄位進行對映產生特定的reducer函式。 如頁面中的例子;todos和counter只會處理對應欄位過來的action。
4. applyMiddleware(...middlewares)
輸入一個middlewares陣列,返回一個函式,函式以createStore為引數:
export default function applyMiddleware(...middlewares) {
return (createStore) => (reducer, preloadedState, enhancer) => {
var store = createStore(reducer, preloadedState, enhancer)
var dispatch = store.dispatch
var chain = []
var middlewareAPI = {
getState: store.getState,
dispatch: (action) => dispatch(action)
}
chain = middlewares.map(middleware => middleware(middlewareAPI))
dispatch = compose(...chain)(store.dispatch)
return {
...store,
dispatch
}
}
}
使用示例:
import { createStore, applyMiddleware } from 'redux'
import todos from './reducers'
function logger({ getState }) {
return (next) => (action) => {
console.log('will dispatch', action)
// 呼叫 middleware 鏈中下一個 middleware 的 dispatch。
let returnValue = next(action)
console.log('state after dispatch', getState())
// 一般會是 action 本身,除非
// 後面的 middleware 修改了它。
return returnValue
}
}
let createStoreWithMiddleware = applyMiddleware(logger)(createStore)
let store = createStoreWithMiddleware(todos, [ 'Use Redux' ])
每個 middleware 接受 Store 的 dispatch 和 getState 函式作為命名引數,並返回一個函式。該函式會被傳入 被稱為 next 的下一個 middleware 的 dispatch 方法,並返回一個接收 action 的新函式,這個函式可以直接呼叫next(action),或者在其他需要的時刻呼叫,甚至根本不去呼叫它。呼叫鏈中最後一個 middleware 會接受真實的 store 的 dispatch 方法作為 next 引數,並藉此結束呼叫鏈。所以,middleware 的函式簽名是 ({ getState, dispatch }) => next => action。
5. bindActionCreators(actionCreators,dispatch)
經過bindActionCreators處理的actions,直接呼叫函式而不需呼叫dispatch即可觸發state的改變。
可以參考文章。
6. compose(...functions)
從右到左來組合多個函式。
這是函數語言程式設計中的方法,為了方便,被放到了 Redux 裡。 當需要把多個 store 增強器 依次執行的時候,需要用到它。
參考文章:文章
7. <Provider store>和connect([mapStateToProps], [mapDispatchToProps],[mergeProps], [options])
<Provider store>使元件層級中的 connect()方法都能夠獲得 Redux store。正常情況下,你的根元件應該巢狀在 <Provider>中才能使用 connect()方法。
ReactDOM.render(
<Provider store={store}>
<MyRootComponent />
</Provider>,
rootEl
);
connect: 連線 React 元件與 Redux store。
// mapStateToProps: 哪些 Redux 全域性的 state 是我們元件想要通過 props 獲取的?
function mapStateToProps(state) {
return {
todos: state.todos
}
}
// mapDispatchToProps: 哪些 action 建立函式是我們想要通過 props 獲取的?
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(TodoActions, dispatch)
}
}
mergeProps和options: 再議