2017-04-07 21 views
3

我有一個提交按鈕,它將分派一個動作。該操作的有效內容是將發送到API的發佈數據。目前我在mapDispatchToProps使用bindActionCreators在mapDispatchToProps中綁定動作參數

const mapDispatchToProps = (dispatch) => ({ 
    actions: bindActionCreators(FormActions, dispatch) 
}); 

然後在我的組件我將綁定onClick在提交行動:

<input type="submit" onClick={() => this.props.actions.submit(this.props.postData)} /> 

我不喜歡,我必須給該組件在mapStateToProps後數據。我寧願只是給組件已經綁定到提交功能,因此它的用法是這樣的後數據的操作:

<input type="submit" onClick={this.props.submit} /> 

這可能嗎?我沒有進入狀態mapDispatchToProps

+0

如果數據已經在商店中,那麼爲什麼不從減速機中讀取呢? – ZekeDroid

+0

數據是來自父項道具還是mapStatetoProps? – FakeRainBrigand

+0

@FakeRainBrigand數據來自'mapStateToProps'。 – Dave

回答

3

有一個在react-reduxconnect方法,它應該像你剛纔描述的一個情況下使用稱爲mergeProps第三個參數。你的情況,你可以這樣做:

const mapStateToProps = state => ({ postData: ... }); 

const mapDispatchToProps = (dispatch) => ({ 
    actions: bindActionCreators(FormActions, dispatch) 
}); 

const mergeProps = (stateProps, dispatchProps) => ({ 
    submit:() => dispatchProps.actions.submit(stateProps.postData), 
}); 

const ConnectedComponent = connect(mapStateToProps, mapDispatchToProps, mergeProps)(Component); 

注意,組件將不會收到actions也不postData,只是submit

+3

請注意,通常不鼓勵使用mergeProps,因爲它對性能不利。它會在每次存儲更改時重新創建函數,從而導致組件每次都重新渲染。 – markerikson

+0

@markerikson從'mergeProps'返回函數prop不同於從'mapStateToProps'返回它:爲了防止在這兩種情況下重新呈現,您必須確保您在調用之間返回相同的函數實例。至少,我可以從[那行代碼]得出結論(https://github.com/reactjs/react-redux/blob/f892ec00d7e92ff7afb21498276472f0e3b000c5/src/connect/mergeProps.js#L18)。如果我錯了,請糾正我。 – fkulikov

+1

夫婦的事情。首先,它是'mapDispatch',而不是'mapState'。其次,如果傳入'mergeProps',並且你在'mergeProps'中聲明瞭一個func,那麼它將是一個新的函數引用,每次mergeProps' runs_,而'mapDispatch'只在comp init時運行一次(或者props如果使用兩種形式的'mapDispatch',則改變)。 (我可能是錯的,但99%肯定這是實際行爲。) – markerikson