Sinto que nenhuma das respostas se cristalizou por que mapDispatchToProps
é útil.
Na verdade, isso só pode ser respondido no contexto do container-component
padrão, que achei melhor entendido pela primeira leitura: Componentes do contêiner e depois uso com o React .
Em poucas palavras, você components
deve 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 containers
servem.
Portanto, um "bem projetado" component
no 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 mapDispatchToProps
entra: 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 component
no padrão, FancyAlerter
que faz a renderização não precisa saber nada disso: ele obtém seu método para chamar no onClick
botão, por meio de seus props.
E ... mapDispatchToProps
foram 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 mapStateToProps
com a mesma finalidade e mapDispatchToProps
pelo motivo básico ao qual não tem acesso dispatch
interno mapStateToProp
. Portanto, não pode usar mapStateToProps
para 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