react-redux的使用

redux與vuex一樣是一個組件的狀態(tài)(數(shù)據(jù))管理器锈候,當(dāng)我們需要在項目各組件中共享數(shù)據(jù)時可以使用薄料。

image
image.gif

?

redux是一個第三方的庫,本身和react沒有任何關(guān)系泵琳,react-redux也是一個第三方庫摄职,可以幫助我們在react項目中更好的使用redux。

簡介

image
image.gif

?

redux流程圖

store(狀態(tài)庫):用于存放組件中的state获列。

action(動作):redux將每一次更改動作定義為一個action谷市,如

const action = { type:'input_change', val:123 }
image.gif

reducers(執(zhí)行):是一個純函數(shù),將根據(jù)action的不同來修改state击孩。

dispatch(分發(fā)):組件中通過dispatch(action)迫悠,來實現(xiàn)動作的提交。

1

安裝

npm install react react-redux --save
image.gif

2

用react-redux管理todoList數(shù)據(jù)

image
image.gif

?

action(動作)分析:

輸入框輸入

按鈕提交

列表點擊刪除

3

創(chuàng)建action

image
image.gif

?

import actionTypes from './actionTypes'

const actionCreator = {
  getInputChangeAction: (val) => ({
    type: actionTypes.CHANGE_INPUT_VLAUE,
    value: val
  }),
  btnClickAction: (val) => ({
    type: actionTypes.BTN_CLICK,
    value: val
  }),
  listDelAction: (val) => ({
    type: actionTypes.LIST_DEL,
    index: val
  })
}

export default actionCreator;
image.gif

action的type定義為常量放在actionType.js中統(tǒng)一管理巩梢,以避免type手寫出錯的可能创泄。

actionTypes.js

const types = {
  CHANGE_INPUT_VLAUE: 'change_input_value',
  BTN_CLICK: 'btn_click',
  LIST_DEL: 'list_del'
}

export default types;
image.gif

4

定義reducer

reducer.js

import actionTypes from './actionTypes';

const defaultState = {
  inputValue: '',
  list: [],
};
export default (state = defaultState, action) => {
  // reducer 可以接受state,但是絕不能修改state
  const newState = JSON.parse(JSON.stringify(state));
  switch (action.type) {
    case actionTypes.CHANGE_INPUT_VLAUE:
      newState.inputValue = action.value;
      break;
    case actionTypes.BTN_CLICK:
      newState.list.push(action.value);
      newState.inputValue = '';
      break;
    case actionTypes.LIST_DEL:
      newState.list.splice(action.index, 1);
      break;
    default:
      break;
  }
  return newState;
};
image.gif

5

創(chuàng)建store

index.js

import { createStore } from 'redux';
import reducer from './reducer';

const store = createStore(reducer);

export default store;
image.gif

6

利用react-redux

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux'
import store from './store'
import TodoList from './components/TodoList';

// if (process.env.NODE_ENV === "development") {
// require('./mock/index.js');
// }

ReactDOM.render(
  <Provider store={store}>
    <TodoList />
  </Provider>,
  document.getElementById('root')
);
image.gif

React-Redux 提供Provider組件括蝠,可以讓容器組件拿到state鞠抑。上面代碼中,Provider在根組件外面包了一層忌警,這樣一來碍拆,TodoList的所有子組件就默認(rèn)都可以拿到state了。

7

組件中創(chuàng)建state慨蓝、dispatch的映射關(guān)系

const mapStateToProps = state => {
  return {
    value: state.inputValue,
    list: state.list,
  };
};
image.gif
const mapDispatchToProps = dispatch => {
  return {
    inputChange: e => dispatch(actions.getInputChangeAction(e.target.value)),
    btnClick: value => dispatch(actions.btnClickAction(value)),
    listClick: index => dispatch(actions.listDelAction(index)),
  };
};
image.gif

意思就是將state與dispatch都映射到props感混,那么組件內(nèi)就可以直接通過props來訪問。

// ui組件
const TodoList = props => {
  const { value, list, inputChange, btnClick, listClick } = props;
  return (
    <div>
      <div>
        <input onChange={inputChange} value={value}></input>
        <button onClick={() => btnClick(value)}>提交</button>
      </div>
      <ul>
        {list.map((item, index) => {
          return (
            <li key={index} onClick={() => listClick(index)}>
              {item}
            </li>
          );
        })}
      </ul>
    </div>
  );
};
image.gif

connect連接組件

export default connect(mapStateToProps, mapDispatchToProps)(TodoList);
image.gif

完整代碼:TodoList.js

import React from 'react';
import { connect } from 'react-redux';
import actions from '../store/actionCreator';

const mapStateToProps = state => {
  return {
    value: state.inputValue,
    list: state.list,
  };
};

const mapDispatchToProps = dispatch => {
  return {
    inputChange: e => dispatch(actions.getInputChangeAction(e.target.value)),
    btnClick: value => dispatch(actions.btnClickAction(value)),
    listClick: index => dispatch(actions.listDelAction(index)),
  };
};

// todolist組件目前只有dom可以寫成函數(shù)組件以提升效率礼烈;
// ui組件
const TodoList = props => {
  const { value, list, inputChange, btnClick, listClick } = props;
  return (
    <div>
      <div>
        <input onChange={inputChange} value={value}></input>
        <button onClick={() => btnClick(value)}>提交</button>
      </div>
      <ul>
        {list.map((item, index) => {
          return (
            <li key={index} onClick={() => listClick(index)}>
              {item}
            </li>
          );
        })}
      </ul>
    </div>
  );
};

// 容器組件
export default connect(mapStateToProps, mapDispatchToProps)(TodoList);
image.gif

這樣就實現(xiàn)了通過react-redux管理組件狀態(tài)(數(shù)據(jù))弧满。

image
image.gif

?

image
image.gif

?

全棧攻城獅進(jìn)階

關(guān)注微信公眾號,第一時間獲取好文章此熬!

沒有傘的孩子庭呜,只有努力奔跑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犀忱,一起剝皮案震驚了整個濱河市募谎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阴汇,老刑警劉巖数冬,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搀庶,居然都是意外死亡拐纱,警方通過查閱死者的電腦和手機铜异,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秸架,“玉大人揍庄,你說我怎么就攤上這事《ǎ” “怎么了蚂子?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缭黔。 經(jīng)常有香客問我缆镣,道長,這世上最難降的妖魔是什么试浙? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任董瞻,我火速辦了婚禮,結(jié)果婚禮上田巴,老公的妹妹穿的比我還像新娘滞欠。我一直安慰自己补胚,他們只是感情好瞻讽,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布窜锯。 她就那樣靜靜地躺著,像睡著了一般管宵。 火紅的嫁衣襯著肌膚如雪截珍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天箩朴,我揣著相機與錄音岗喉,去河邊找鬼。 笑死炸庞,一個胖子當(dāng)著我的面吹牛钱床,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播埠居,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼查牌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了滥壕?” 一聲冷哼從身側(cè)響起纸颜,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绎橘,沒想到半個月后胁孙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年浊洞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胡岔。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡法希,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出靶瘸,到底是詐尸還是另有隱情苫亦,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布怨咪,位于F島的核電站屋剑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诗眨。R本人自食惡果不足惜唉匾,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匠楚。 院中可真熱鬧巍膘,春花似錦、人聲如沸芋簿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽与斤。三九已至肪康,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撩穿,已是汗流浹背磷支。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留食寡,地道東北人齐唆。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像冻河,于是被迫代替她去往敵國和親箍邮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351