Sinto que nenhuma das respostas se cristalizou por que mapDispatchToPropsé útil.
Na verdade, isso só pode ser respondido no contexto do container-componentpadrão, que achei melhor entendido pela primeira leitura: Componentes do contêiner e depois uso com o React .
Em poucas palavras, você componentsdeve se preocupar apenas em exibir coisas. O único lugar em que eles devem obter informações são seus objetos .
Separado de "exibir coisas" (componentes) está:
- como você exibe as coisas,
- e como você lida com eventos.
É para isso que containersservem.
Portanto, um "bem projetado" componentno padrão se parece com isso:
class FancyAlerter extends Component {
sendAlert = () => {
this.props.sendTheAlert()
}
render() {
<div>
<h1>Today's Fancy Alert is {this.props.fancyInfo}</h1>
<Button onClick={sendAlert}/>
</div>
}
}
Veja como este componente recebe a informação ele exibe a partir de adereços (que veio a partir da loja redux via mapStateToProps) e também obtém sua função de ação de seus adereços: sendTheAlert().
É aí que mapDispatchToPropsentra: no correspondentecontainer
// FancyButtonContainer.js
function mapDispatchToProps(dispatch) {
return({
sendTheAlert: () => {dispatch(ALERT_ACTION)}
})
}
function mapStateToProps(state) {
return({fancyInfo: "Fancy this:" + state.currentFunnyString})
}
export const FancyButtonContainer = connect(
mapStateToProps, mapDispatchToProps)(
FancyAlerter
)
Eu me pergunto se você pode ver, agora que é o container 1 que sabe sobre redux e despacho e armazenamento e estado e ... coisas.
O componentno padrão, FancyAlerterque faz a renderização não precisa saber nada disso: ele obtém seu método para chamar no onClickbotão, por meio de seus props.
E ... mapDispatchToPropsforam os meios úteis que o redux fornece para permitir que o contêiner passe facilmente essa função para o componente embrulhado em seus adereços.
Tudo isso se parece muito com o exemplo do todo em documentos e outra resposta aqui, mas tentei lançá-lo à luz do padrão para enfatizar o porquê .
(Nota: você não pode usar mapStateToPropscom a mesma finalidade e mapDispatchToPropspelo motivo básico ao qual não tem acesso dispatchinterno mapStateToProp. Portanto, não pode usar mapStateToPropspara dar ao componente agrupado um método que usa dispatch.
Não sei por que eles escolheram dividi-lo em duas funções de mapeamento - poderia ter sido mais organizado ter mapToProps(state, dispatch, props) uma função do IE para fazer as duas coisas!
1 Observe que eu deliberadamente nomeei explicitamente o contêiner FancyButtonContainer, para destacar que é uma "coisa" - a identidade (e, portanto, a existência!) Do contêiner como "uma coisa" às vezes se perde na abreviação
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
sintaxe mostrada na maioria dos exemplos