Redux基本使用

簡(jiǎn)介

本文介紹 redux 的使用方法。

主要包括以下幾個(gè)部分

  • redux 基本思路
  • 單獨(dú)使用 redux
  • 配合 react-redux 使用
  • redux-devtools
  • 使用修飾器

redux 基本思路

redux 是用來管理公共狀態(tài),公共 state 都存放在 store 中碍论。使用 createStore() 方法新建一個(gè) store

直接修改容易引起誤操作,需要有條件的操作 store ,不能直接修改

使用 store.getState() 來獲取 state

使用 store.dispatch(action) 修改 state

使用 store.subscribe(listener) 實(shí)現(xiàn)監(jiān)聽,如果有改動(dòng)合蔽,進(jìn)行對(duì)應(yīng)的響應(yīng)操作

action 是一個(gè)對(duì)象,基本格式 { type: TEST, payload: { name: 'ddd' } }

action creator 是 action 生成函數(shù)介返,根據(jù)傳入的參數(shù)生成對(duì)應(yīng)的 action

redux 基本使用

redux 安裝命令:npm i redux --save

  • 新建 reducer 文件
// action type
const COUNT_ADD = "數(shù)量增加"
const COUNT_MINUS = "數(shù)量減少"

// initial state
const initState = {
  test: 'test'
  count: 10
}

// reducer
export default function(state = initState, action) {
  switch(action.type) {
    case COUNT_ADD:
      return {
        ...state,
        count: state.count + 1
      }
    case COUNT_MINUS:
      return {
        ...state,
        count: state.count - 1
      }
    default:
      return state
  }
}

// action creator
export function countAdd() {
  return { type: COUNT_ADD }
}
export function countMinus() {
  return { type: COUNT_MINUS }
}
  • 如果有多個(gè) reducer 拴事,可以使用 combineReducers 方法將多個(gè) reducer 合并成一個(gè)
import { combineReducers } from 'redux'

import app from './app'
import user from './user'

export default combineReducers({ app, user })
  • 使用 createStore 生成 store
import { createStore } from 'redux'
import rootReducer from './reducers'
export default createStore(rootReducer)

// 使用中間件
import { createStore, applyMiddleware } from 'redux'
import thunk from 'redux-thunk'
import rootReducer from './reducers'
export default createStore(rootReducer, applyMiddleware(thunk))

單獨(dú)使用 redux

const init = store.getState()
console.log(init)

function listener() {
  const { count } = store.getState()
  console.log(`目前計(jì)數(shù)為:${count}`)
}
store.subscribe(listener)

// 派發(fā)事件
store.dispatch(countAdd())
store.dispatch(countAdd())
store.dispatch(countMinus())

配合 react-redux 使用

在 react 項(xiàng)目中一般配合 react-redux 使用

react-redux 安裝命令:npm i react-redux --save

  • react-redux 提供了 Provider ,該組件將 store 放到 context 中圣蝎,方便子孫組件直接使用 store
  • react-redux 提供了 connect(mapStateToProps, mapDispatchToProps) 用來將對(duì)應(yīng)的 state 和 dispatch 放到組件的 props 下
// ...
import { Provider } from 'react-redux'
import store from './store'

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);
import React from 'react'
import { connect } from 'react-redux'
import { countAdd, countMinus } from '../../store/reducers/app'
import { WingBlank, WhiteSpace,Button } from 'antd-mobile'

class Demo extends React.Component {
  render() {
    return (
      <WingBlank style={{marginTop: 50}}>
        <p>目前計(jì)數(shù):{this.props.count}</p>
        <WhiteSpace />
        <Button type="warning" onClick={this.props.countAdd}>+1</Button>
        <WhiteSpace />
        <Button type="primary" onClick={this.props.countMinus}>-1</Button>
      </WingBlank>
    )
  }
}
export default connect(
  ({ app }) => app,
  { countAdd, countMinus }
)(Demo)

備注

  • connect 高級(jí)組件處理之后刃宵,在 props 中就有對(duì)應(yīng)的 state 和 action 了
  • connect 的第一個(gè)參數(shù)是將 state 轉(zhuǎn)為 props 的方法 mapStateToProps ,當(dāng)然也可以直接傳對(duì)象
  • connect 的第二個(gè)參數(shù)是將 dispatch 轉(zhuǎn)為 props 的方法 mapDispatchToProps 捅彻,當(dāng)然也可以直接傳對(duì)象

redux-devtools

redux-devtools 是谷歌瀏覽器的插件组去,方便調(diào)試

需要在代碼中打開

// 沒有中間件時(shí)開啟devToolsExtension
import { createStore } from 'redux'
import rootReducer from './reducers'
export default createStore(rootReducer, window.devToolsExtension ? window.devToolsExtension() : f=>f)

// 使用中間件并開啟devToolsExtension
import { createStore, applyMiddleware, compose } from 'redux'
import thunk from 'redux-thunk'
import rootReducer from './reducers'
export default createStore(rootReducer, compose(
  applyMiddleware(thunk),
  window.devToolsExtension ? window.devToolsExtension() : f=>f
))

使用修飾器

修飾器相關(guān)知識(shí)參考:裝飾器模式(Decorator模式)理解、使用

create-react-app 項(xiàng)目為例:

如果 babel 版本低于 7.x 步淹,需要下載babel-plugin-transform-decorators-legacy

npm i babel-plugin-transform-decorators-legacy --save
  • 修改 package.json 文件
{
  // ...
  "babel": {
    // ...
    "plugins": [
      "transform-decorators-legacy"
      // ...
    ]
  },
  // ...
}

如果是 babel 7.x 及以上版本,需要下載 @babel/plugin-proposal-decorators

npm i @babel/plugin-proposal-decorators --save
  • 修改 package.json 文件
{
  // ...
  "babel": {
    // ...
    "plugins": [
      // ...
      ["@babel/plugin-proposal-decorators", { "legacy": true }],
    ]
  },
  // ...
}
  • 在組件中 connect 就可以使用修飾器格式了诚撵。其他的缭裆,比如 withRouter 都可以用修飾器格式
// ...
@connect(
  ({ test }) => ({ count: test.count}),
  { testCountAdd }
)
class Demo extends React.Component {
  // ...
}
export default Demo
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寿烟,隨后出現(xiàn)的幾起案子澈驼,更是在濱河造成了極大的恐慌,老刑警劉巖筛武,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缝其,死亡現(xiàn)場(chǎng)離奇詭異挎塌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)内边,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門榴都,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漠其,你說我怎么就攤上這事。” “怎么了菲语?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵唤反,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我柴信,道長(zhǎng)套啤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任随常,我火速辦了婚禮纲岭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘线罕。我一直安慰自己止潮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布钞楼。 她就那樣靜靜地躺著喇闸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪询件。 梳的紋絲不亂的頭發(fā)上燃乍,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音宛琅,去河邊找鬼刻蟹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嘿辟,可吹牛的內(nèi)容都是我干的舆瘪。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼红伦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼英古!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起昙读,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤召调,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唠叛,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡只嚣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艺沼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片册舞。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖澳厢,靈堂內(nèi)的尸體忽然破棺而出环础,到底是詐尸還是另有隱情,我是刑警寧澤剩拢,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布线得,位于F島的核電站,受9級(jí)特大地震影響徐伐,放射性物質(zhì)發(fā)生泄漏贯钩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一办素、第九天 我趴在偏房一處隱蔽的房頂上張望角雷。 院中可真熱鬧,春花似錦性穿、人聲如沸勺三。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吗坚。三九已至,卻和暖如春呆万,著一層夾襖步出監(jiān)牢的瞬間商源,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工谋减, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牡彻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓出爹,卻偏偏與公主長(zhǎng)得像庄吼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子以政,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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