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ù)”统耍可以參考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 會接受真實(shí)的 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缸濒,因而實(shí)現(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 增強(qiáng)器 依次執(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)系作者
  • 序言:七十年代末塘娶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虹曙,更是在濱河造成了極大的恐慌,老刑警劉巖疏哗,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異污尉,居然都是意外死亡仿村,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門岳悟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人堆缘,你說我怎么就攤上這事滔灶。” “怎么了吼肥?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵录平,是天一觀的道長。 經(jīng)常有香客問我缀皱,道長斗这,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任啤斗,我火速辦了婚禮表箭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钮莲。我一直安慰自己免钻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布臂痕。 她就那樣靜靜地躺著伯襟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪握童。 梳的紋絲不亂的頭發(fā)上姆怪,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機(jī)與錄音澡绩,去河邊找鬼稽揭。 笑死,一個胖子當(dāng)著我的面吹牛肥卡,可吹牛的內(nèi)容都是我干的溪掀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼步鉴,長吁一口氣:“原來是場噩夢啊……” “哼揪胃!你這毒婦竟也來了璃哟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤喊递,失蹤者是張志新(化名)和其女友劉穎随闪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骚勘,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铐伴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俏讹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片当宴。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泽疆,靈堂內(nèi)的尸體忽然破棺而出户矢,到底是詐尸還是另有隱情,我是刑警寧澤于微,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布逗嫡,位于F島的核電站,受9級特大地震影響株依,放射性物質(zhì)發(fā)生泄漏驱证。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一恋腕、第九天 我趴在偏房一處隱蔽的房頂上張望抹锄。 院中可真熱鬧,春花似錦荠藤、人聲如沸伙单。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吻育。三九已至,卻和暖如春淤井,著一層夾襖步出監(jiān)牢的瞬間布疼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工币狠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留游两,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓漩绵,卻偏偏與公主長得像贱案,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子止吐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

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