2017-01-16 129 views
3

我正在閱讀redux的示例文檔,並且我找到了容器組件的示例。有人可以解釋爲什麼在這種情況下mapDispatchToProps不需要在這裏。另外,函數如何獲得調度功能?如何在沒有map的情況下連接工作DispatchToProps

import React from 'react' 
import { connect } from 'react-redux' 
import { addTodo } from '../actions' 

let AddTodo = ({ dispatch }) => { 
let input 

return (
    <div> 
     <form onSubmit={e => { 
     e.preventDefault() 
     if (!input.value.trim()) { 
      return 
     } 
     dispatch(addTodo(input.value)) 
     input.value = '' 
     }}> 
     <input ref={node => { 
      input = node 
     }} /> 
     <button type="submit"> 
      Add Todo 
     </button> 
     </form> 
    </div> 
) 
} 
AddTodo = connect()(AddTodo) 

export default AddTodo 

回答

7

connect()(AddTodo)將通過dispatch作爲prop to AddTodo組件,即使沒有狀態或預定義的操作,該組件仍然有用。這就是您的代碼中不需要mapDispatchToProps的原因

現在在您的組件let AddTodo = ({ dispatch }) => {中,您正在解構您的道具以僅訪問dispatch

如果您使用mapDispatchToProps,您將使您的addTodo動作可作爲組件的道具使用,然後將其稱爲this.props.addTodo。所以上述方法是一種選擇。這取決於你選擇什麼你感覺舒服與

connect只是通過store/dispatch通過React上下文,所以你不必通過許多組件通過商店。你不必使用連接。任何模塊/ HOC模式都可以工作,連接恰好是一個方便的使用方法。

在組件中使用dispatch或使用mapDispatchToProps是同一件事。

但是使用mapDispatchToProps可以讓您更靈活地構建代碼並將所有動作創建者放在同一個位置。

作爲每docs

[mapDispatchToProps(調度,[ownProps]):dispatchProps](對象或函數):

如果對象被傳遞,每個它內部的函數被假定爲Redux動作創建者。一個具有相同函數名稱的對象,但每個動作創建者都被包裝成一個調度調用,因此它們可以直接調用 ,將被合併到組件的道具中。

如果一個函數通過,它將被作爲第一個參數發送。這取決於你返回一個對象,以某種方式使用 調度以自己的方式綁定動作創建者。(提示:你可以使用 的bindActionCreators()助手從終極版)

如果您mapDispatchToProps函數聲明爲採用兩個 參數,它將派遣傳遞給所連接的組件作爲第一個參數和 道具被稱爲第二個參數 ,並且只要連接的組件收到新的道具,就會被重新調用。 (第二個參數通常由 慣例被稱爲ownProps。)

如果你不提供自己的mapDispatchToProps功能或對象 全面的行動創造者,默認mapDispatchToProps 實現只是注入派遣到組件的道具。

0

人們傾向於用兩種方式寫react。一種是你通常會遇到的基於class的方法。它基本上使用類。

class App extends Component{ 
    constructor(){ 
     super(); 
     this.state={} 
    } 
    render(){ 
     return(

      // 
     ); 
    } 
} 

和其他是functional approach

const App = (props) => { 
​ 
    return(
     <div><h2>{{props.name}}</h2></div> 
    ) 
} 

所以,在功能性方法,您可以通過數據arguments到您的組件。 因此,如果您已將dispatch從父組件傳遞到props中的此組件。您可以使用props.dispatch訪問它。

+0

我明白這個概念,但我不知道在這種情況下,組件是如何接收調度的。我的印象是接收調度函數,我需要傳遞一個mapDispatchToProps,在這種情況下並不是這樣。是不是因爲我將組件傳遞給連接函數,現在它以某種方式接收調度? – Nate

+0

調度將作爲道具從父組件傳遞到此組件。 – nrgwsth

+0

但這種做法並不好。你應該使用connect來傳遞調度和道具。閱讀gaearon的評論[這裏](https://github.com/reactjs/redux/issues/1176) – nrgwsth

相關問題