redux常用的幾個函數(shù)

1. createStore(reducer, [initState, enhancer])
  • 作用:創(chuàng)建一個Redux store來存放應(yīng)用中所有的state,一個應(yīng)用只能有個store。函數(shù)返回store對象。
  • 參數(shù):
    • reducer(Function):兩個參數(shù):state和action,返回一個state。 不要對參數(shù)state進(jìn)行修改,需要返回一個新的對象。
    • initStatate:初始state。如果不為空,需要和reducer中處理的state結(jié)構(gòu)一致
    • 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是用來維持應(yīng)用所有state樹的一個對象。改變state的唯一方法是store dispatch一個action。
Store不是類,而只是一個有幾個方法的對象,可以采用createStore進(jìn)行創(chuàng)建。

  • getState()
    返回應(yīng)用當(dāng)前的 state 樹。它與 store 的最后一個 reducer 返回值相同。
  • dispatch(action)
    分發(fā)action,這是改變state的唯一方法。
  • subscribe(listener)
    添加一個變化監(jiān)聽器,每當(dāng) dispatch action 的時候就會執(zhí)行,state 樹中的一部分可能已經(jīng)變化。你可以在回調(diào)函數(shù)里調(diào)用 getState() 來拿到當(dāng)前 state。函數(shù)返回一個解綁的函數(shù)??梢詤⒖?a target="_blank" rel="nofollow">counter-vanilla
  • replaceReducer(nextReducer)
    替換Reducer,用處較少。
// 渲染和訂閱渲染
function render() {
      valueEl.innerHTML = store.getState().toString()
}
store.subscribe(render)
3. combineReducers(reducers)

combineReducers輔助函數(shù)的作用是,把一個由多個不同 reducer 函數(shù)作為 value 的 object,合并成一個最終的 reducer 函數(shù),然后就可以對這個 reducer 調(diào)用 createStore。
多個子reducer函數(shù)合并后,相當(dāng)于整體函數(shù)會為state特定字段進(jìn)行映射產(chǎn)生特定的reducer函數(shù)。 如頁面中的例子;todos和counter只會處理對應(yīng)字段過來的action。

4. applyMiddleware(...middlewares)

輸入一個middlewares數(shù)組,返回一個函數(shù),函數(shù)以createStore為參數(shù):

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)

    // 調(diào)用 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
函數(shù)作為命名參數(shù),并返回一個函數(shù)。該函數(shù)會被傳入 被稱為 next 的下一個 middleware 的 dispatch 方法,并返回一個接收 action 的新函數(shù),這個函數(shù)可以直接調(diào)用next(action),或者在其他需要的時刻調(diào)用,甚至根本不去調(diào)用它。調(diào)用鏈中最后一個 middleware 會接受真實的 store 的 dispatch
方法作為 next 參數(shù),并借此結(jié)束調(diào)用鏈。所以,middleware 的函數(shù)簽名是 ({ getState, dispatch }) => next => action。

5. bindActionCreators(actionCreators,dispatch)

經(jīng)過bindActionCreators處理的actions,直接調(diào)用函數(shù)就相當(dāng)于進(jìn)行了dispatch,因而實現(xiàn)了不調(diào)用dispatch即可觸發(fā)state的改變。
使用場景: 當(dāng)你需要把 action creator 往下傳到一個組件上,卻不想讓這個組件覺察到 Redux 的存在,而且不希望把 Redux store 或 dispatch
傳給它。

// app.js
import { selectReddit } from '../actions'
  ...
class App extends Component {
  render() {
    const { selectedReddit, posts, isFetching, lastUpdated, dispatch } = this.props
    let boundActionCreators = bindActionCreators({selectReddit}, dispatch);

    return (
      <div>
        <Picker value={selectedReddit}
                onChange={this.handleChange}
                {...boundActionCreators}
                options={[ 'reactjs', 'frontend' ]} />
       </div>
    )
  }
}
export default connect(mapStateToProps)(App)

// picker.js
export default class Picker extends Component {
  render() {
    const { value, onChange, options, selectReddit } = this.props
    console.log(this.props)

    return (
      <span>
        <h1>{value}</h1>
        <select onChange={e => selectReddit(e.target.value)}
                value={value}>
          {options.map(option =>
            <option value={option} key={option}>
              {option}
            </option>)
          }
        </select>
      </span>
    )
  }
}

可以參考文章。

6. compose(...functions)

從右到左來組合多個函數(shù)。
這是函數(shù)式編程中的方法,為了方便,被放到了 Redux 里。 當(dāng)需要把多個 store 增強器 依次執(zhí)行的時候,需要用到它。
參考文章:文章

7. <Provider store>和connect([mapStateToProps], [mapDispatchToProps],[mergeProps], [options])

<Provider store>使組件層級中的 connect()方法都能夠獲得 Redux store。正常情況下,你的根組件應(yīng)該嵌套在 <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 創(chuàng)建函數(shù)是我們想要通過 props 獲取的?
function mapDispatchToProps(dispatch) {
  return {
    actions: bindActionCreators(TodoActions, dispatch)
  }
}
  mergeProps和options: 再議
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • http://gaearon.github.io/redux/index.html ,文檔在 http://rac...
    jacobbubu閱讀 80,410評論 35 198
  • 學(xué)習(xí)必備要點: 首先弄明白,Redux在使用React開發(fā)應(yīng)用時,起到什么作用——狀態(tài)集中管理 弄清楚Redux是...
    賀賀v5閱讀 9,066評論 10 58
  • 一、什么情況需要redux? 1、用戶的使用方式復(fù)雜 2、不同身份的用戶有不同的使用方式(比如普通用戶和管...
    初晨的筆記閱讀 2,129評論 0 11
  • 做React需要會什么? react的功能其實很單一,主要負(fù)責(zé)渲染的功能,現(xiàn)有的框架,比如angular是一個大而...
    蒼都閱讀 14,949評論 1 139
  • 前言 本文 有配套視頻,可以酌情觀看。 文中內(nèi)容因各人理解不同,可能會有所偏差,歡迎朋友們聯(lián)系我討論。 文中所有內(nèi)...
    珍此良辰閱讀 12,169評論 23 111

友情鏈接更多精彩內(nèi)容