74 votes

Puis-je mapDispatchToProps sans mapStateToProps dans Redux?

Je suis briser Redux " todo exemple pour essayer de comprendre. J'ai lu qu' mapDispatchToProps permet à la carte de répartition des actions comme les accessoires, donc j'ai pensé à la réécriture addTodo.js d'utilisation mapDispatchToProps au lieu d'appeler l'expédition(addTodo()). Je l'ai appelé" addingTodo(). Quelque chose comme ceci:

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

let AddTodo = ({addingTodo}) => {
  let input;
  return (
      <div>
        <form onSubmit={e => {
          e.preventDefault()
          if (!input.value.trim()) {
            return
          }
          addingTodo(input.value)
          input.value = ""
        }}>
          <input ref={node => {
            input = node
          }} />
          <button type="submit">Submit</button>
        </form>
      </div>
  )
}

const mapDispatchToProps = {
  addingTodo: addTodo
}

AddTodo = connect(
  mapDispatchToProps
)(AddTodo)

export default AddTodo

Cependant, lorsque je lance l'application, j'obtiens cette erreur: Error: Invalid value of type object for mapStateToProps argument when connecting component AddTodo.. Je n'ai jamais utilisé mapStateToProps pour commencer AddTodo composant, donc je n'étais pas sûr de ce qui n'allait pas. Mon instinct dit que connect() prévoit mapStateToProps précéder mapDispatchToProps.

Le travail original ressemble à ceci:

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">Submit</button>
        </form>
      </div>
  )
}

AddTodo = connect()(AddTodo)

export default AddTodo

Complet repo peut être trouvé ici.

Donc ma question est, est-il possible de faire mapDispatchToProps sans mapStateToProps? Est ce que je suis en train de faire une pratique acceptable - si non, pourquoi pas?

121voto

iofjuupasli Points 1621

Oui, vous pouvez. Passez simplement null comme premier argument:

 AddTodo = connect(
    null,
    mapDispatchToProps
)(AddTodo)
 

Oui, ce n'est pas seulement une pratique acceptable, c'est une façon recommandée de déclencher des actions. Utiliser mapDispatchToProps permet de cacher le fait d’utiliser redux dans vos composants réactifs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X