Redux框架之bindActionCreators()用法講解

bindActionCreators

  • bindActionCreators(actionCreators, dispatch)

  • 把 action creators 轉(zhuǎn)成擁有同名 keys 的對象,但使用 dispatch 把每個 action creator 包圍起來,這樣可以直接調(diào)用它們。

  • 一般情況下你可以直接在 Store 實例上調(diào)用 dispatch。如果你在 React 中使用 Redux,react-redux 會提供 dispatch 。

  • 惟一使用 bindActionCreators 的場景是當(dāng)你需要把 action creator 往下傳到一個組件上,卻不想讓這個組件覺察到 Redux 的存在,而且不希望把 Redux store 或 dispatch 傳給它。

  • 為方便起見,你可以傳入一個函數(shù)作為第一個參數(shù),它會返回一個函數(shù)。

參數(shù)

  • actionCreators (Function or Object): 一個 action creator,或者鍵值是 action creators 的對象。

  • dispatch (Function): 一個 dispatch 函數(shù),由 Store 實例提供。

返回值

  • (Function or Object): 一個與原對象類似的對象,只不過這個對象中的的每個函數(shù)值都可以直接 dispatch action。如果傳入的是一個函數(shù),返回的也是一個函數(shù)。

示例

TodoActionCreators.js

export function addTodo(text) {
  return {
    type: 'ADD_TODO',
    text
  };
}

export function removeTodo(id) {
  return {
    type: 'REMOVE_TODO',
    id
  };
}
  • SomeComponent.js*
import { Component } from 'react';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';

import * as TodoActionCreators from './TodoActionCreators';
console.log(TodoActionCreators);
// {
//   addTodo: Function,
//   removeTodo: Function
// }

class TodoListContainer extends Component {
  componentDidMount() {
    // 由 react-redux 注入:
    let { dispatch } = this.props;

    // 注意:這樣做行不通:
    // TodoActionCreators.addTodo('Use Redux');

    // 你只是調(diào)用了創(chuàng)建 action 的方法。
    // 你必須要 dispatch action 而已。

    // 這樣做行得通:
    let action = TodoActionCreators.addTodo('Use Redux');
    dispatch(action);
  }

  render() {
    // 由 react-redux 注入:
    let { todos, dispatch } = this.props;

    // 這是應(yīng)用 bindActionCreators 比較好的場景:
    // 在子組件里,可以完全不知道 Redux 的存在。

    let boundActionCreators = bindActionCreators(TodoActionCreators, dispatch);
    console.log(boundActionCreators);
    // {
    //   addTodo: Function,
    //   removeTodo: Function
    // }

    return (
      <TodoList todos={todos}
                {...boundActionCreators} />
    );

    // 一種可以替換 bindActionCreators 的做法是直接把 dispatch 函數(shù)
    // 和 action creators 當(dāng)作 props 
    // 傳遞給子組件
    // return <TodoList todos={todos} dispatch={dispatch} />;
  }
}

export default connect(
  state => ({ todos: state.todos })
)(TodoListContainer)

你或許要問:為什么不直接把 action creators 綁定到 store 實例上,就像傳統(tǒng) Flux 那樣?問題是這樣做的話如果開發(fā)同構(gòu)應(yīng)用,在服務(wù)端渲染時就不行了。多數(shù)情況下,你 每個請求都需要一個獨(dú)立的 store 實例,這樣你可以為它們提供不同的數(shù)據(jù),但是在定義的時候綁定 action creators,你就可以使用一個唯一的 store 實例來對應(yīng)所有請求了。

如果你使用 ES5,不能使用 import * as 語法,你可以把 require('./TodoActionCreators') 作為第一個參數(shù)傳給 bindActionCreators。惟一要考慮的是 actionCreators 的參數(shù)全是函數(shù)。模塊加載系統(tǒng)并不重要。

最后編輯于
?著作權(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)容

  • Redux的三大原則 Redux 可以用這三個基本原則來描述: 單一數(shù)據(jù)源 整個應(yīng)用的 state被儲存在一棵 o...
    Dabao123閱讀 742評論 0 2
  • 前言 本文 有配套視頻,可以酌情觀看。 文中內(nèi)容因各人理解不同,可能會有所偏差,歡迎朋友們聯(lián)系我討論。 文中所有內(nèi)...
    珍此良辰閱讀 12,168評論 23 111
  • react-redux 在react-redux 框架中,給我提供了兩個常用的API來配合Redux框架的使用,其...
    光強(qiáng)_上海閱讀 35,558評論 5 54
  • 寫在開頭 本片內(nèi)容主要為本人在閱讀redux官方文檔中基礎(chǔ)和進(jìn)階部分的學(xué)習(xí)筆記。由于本人能力有限,所以文章中可能會...
    前端開發(fā)愛好者閱讀 1,354評論 0 4
  • Redux簡介 Redux從設(shè)計之初就不是為了編寫最短、最快的代碼,他是為了解決 “當(dāng)有確定的狀態(tài)發(fā)生改變時,數(shù)據(jù)...
    _花閱讀 465評論 0 1

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