2016-09-30 48 views
2

我很難理解神奇的參數dispatch,它突然出現,無處不在,它是containers/AddTodo.js示例中演示組件的第一個參數。一個組件如何神奇地接收`dispatch`作爲它的第一個參數?

let AddTodo = ({ dispatch }) => { 
    /* Omitted */ 
} 

AddTodo = connect()(AddTodo) 

到目前爲止,我的理解是,第一AddTodo被認爲是呈現部件,後者是容器組件

在這種情況下,呈現部件似乎與dispatch注入作爲第一個論點。不幸的是,我回頭看後感到困惑,並意識到the rest of the presentation component並非如此。

const Todo = ({ onClick, completed, text }) => (
    /* Omitted */ 
) 

Todo.propTypes = { 
    onClick: PropTypes.func.isRequired, 
    completed: PropTypes.bool.isRequired, 
    text: PropTypes.string.isRequired 
} 

dispatch參數如何在演示文稿組件中出現?

+0

有超鏈接錯誤的例子... – Yeo

回答

5

當您在connect()中使用:AddTodo = connect()(AddTodo)您正在注入AddTodo組件,其中dispatch未經商店收聽。通過道具現在可以在您的組件中使用dispatch。它可以被稱爲this.props.dispatch()或直接作爲dispatch()如果使用參數解構,即let AddTodo = ({ dispatch }) ...

下面是官方終極版文檔詳細說明:https://github.com/reactjs/react-redux/blob/master/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options

連接([mapStateToProps],[mapDispatchToProps],[ mergeDrops],[options])

[mapDispatchToProps(dispatch,[ownProps]):dispatchProps](Object or Function):如果傳遞一個對象,它內部的每個函數將被認爲是一個Redux動作創建者。一個具有相同函數名稱的對象,但是每個動作創建者都被包裝到一個調度調用中,以便它們可以被直接調用,將​​被合併到組件的道具中。如果一個函數被傳遞,它將被分派。這取決於你返回一個以某種方式使用dispatch以自己的方式綁定動作創建者的對象。 (提示:您可以使用Redux的bindActionCreators()幫助程序。)如果省略它,默認實現會將分派注入組件的道具。如果ownProps被指定爲第二個參數,則它的值將是傳遞給組件的道具,並且只要組件接收到新的道具,就會重新調用mapDispatchToProps。

+2

只是強調有關參數解構。這不是說第一個參數'神奇'就是'dispatch'函數。該參數實際上是傳遞給具有「dispatch」屬性的組件的「props」。 –

+1

謝謝你對默認行爲的重視......我錯過了這一行,直到你的** Bold **格式.... :) – Yeo

+0

謝謝@DiegoCardosa,我根據你的評論更新了我的答案。 –

1

反應,終極版connect可以接收mapDispatchToProps參數以dispatch調用來包裝你的行動創造者。如果mapDispatchToProps不通過,connect將使用default mapDispatchToProps

const defaultMapDispatchToProps = dispatch => ({ dispatch }) 

正如你所看到的物體返回dispatch財產。該對象將與mapStateToProps中的道具以及屬性傳遞給組件(ownProps)的道具合併。最終對象將是由connect傳遞給原始組件的道具。

+0

哦,我明白了......感謝您對源代碼的重視。對我來說,瞭解文檔中提到的默認是如何實現的更加明確。 – Yeo

0

正如Piotr Berebecki所述,connect()註明發送。它將它注入到道具中,並且({dispatch})正在從道具上解構調度,並將其分配給變量dispatch

你可以重寫AddTodo

let AddTodo = (props) => { 
const { dispatch } = props; 
... 
}; 
相關問題