2017-10-06 3 views
1

J'ai cherché des réponses à celui-ci mais je n'ai vu aucun correspondant à mon problème. Je suis en train de construire une application calculatrice en utilisant React & Redux et chaque fois que je clique sur l'un des boutons numériques, j'obtiens une erreur qui dit "this.props.AppendCharacter n'est pas une fonction"React-Redux: this.props.AppendCharacter n'est pas une fonction

Voici mon code pertinent:

number_button.js

import React, {Component} from 'react'; 
import {bindActionCreators} from 'redux'; 
import {connect} from 'react-redux'; 

import AnswerScreen from '../containers/answer_screen'; 
import AppendCharacter from '../actions/index'; 

class NumberButton extends Component { 
    constructor(props) { 
     super(props); 

     this.state = { button: '' }; 
     this.clickButton = this.clickButton.bind(this); 
    }; 

    clickButton() { 
     this.props.AppendCharacter(this.props.number); 
     console.log('clicked on ', this.props.number); 
     this.setState({ button: this.props.number }); 
    } 

    render(props) { 
     return (
      <div className="number-button general-button" onClick={this.clickButton}> 
      {this.props.number} 
      </div> 
     ); 
    }; 
}; 

function mapDispatchToProps(dispatch) { 
    return bindActionCreators({ AppendCharacter }, dispatch); 
}; 

export default connect(null, mapDispatchToProps)(NumberButton); 

actions/index.js

export function AppendCharacter(character) { 
    return { 
     type: APPEND, 
     payload: character 
    }; 
}; 

Répondre

0

vous pouvez accomplir ce que vous avez besoin en changeant votre mapDispatchToProps à:

function mapDispatchToProps(dispatch) { 
    return { 
     AppendCharacter: (character) => dispatch(AppendCharacter(character)); 
    }; 
} 

Je ne suis pas familier avec bindActionCreators, si quelqu'un d'autre peut avoir besoin de peser si vous avez besoin de cette fonctionnalité.


Side note: il ne semble pas que vous avez besoin de l'état d'un composant pour button dans votre configuration actuelle. Vous pouvez avoir des plans pour cela, mais ce n'est pas utilisé dans votre exemple.

+0

Merci. J'ai essayé, mais j'ai eu une erreur différente qui a dit "Uncaught TypeError: (0, _index2.default) n'est pas une fonction" (Oh, et je vais probablement enlever l'état de composant une fois que j'ai obtenu ce travail - J'ai changé de design après avoir ajouté cette partie, merci pour le commentaire.) – PirateJohn

+0

Vous êtes proche. Des sons comme celui-ci ont résolu votre problème. Maintenant, vous devez revoir comment vous «importez» et «exportez». On dirait que vous avez (ou n'avez pas) une exportation 'default' quand vous vouliez (ou ne vouliez pas). [ceci devrait aider] (https://stackoverflow.com/a/36796281/2479481) –

+1

L'original 'mapDispatchToProps' était correct; 'bindActionCreators' encapsule les créateurs d'actions dans les appels à' dispatch() '. Je suggérerais, cependant, que si vous ne comprenez pas profondément comment '' dispatch() 'fonctionne, vous ne devriez pas utiliser' bindActionCreators' car il ajoute une couche potentiellement confuse sur un concept que beaucoup trouvent déjà confus quand ils commencent à utiliser le redux . – stone

0
const mapDispatchToProps = { 
    AnswerScreen, 
    AppendCharacter 
}; 

export default connect(null, mapDispatchToProps)(NumberButton); 
+0

Merci. J'ai essayé votre code mais ça n'a toujours pas fonctionné, malheureusement. – PirateJohn

+0

Il s'agit d'un pas dans la bonne direction, mais cela ne fonctionnera pas car il ne fait pas correspondre l'envoi aux accessoires. 'mapDispatchToProps' doit prendre un paramètre' dispatch' et renvoyer des fonctions qui appellent 'dispatch' pour chaque créateur d'action. Voir ma réponse pour un exemple d'une façon de mettre en place. –

0

Eh bien, j'ai trouvé l'erreur. Quelqu'un sur un site web différent m'a aidé. Le bindActionCreators fonctionnait bien, mais le problème était que lorsque j'importe AppendCharacter de ../actions/index, j'avais besoin d'envelopper AppendCharacter dans les accolades. J'ai changé cela et maintenant l'application fonctionne.

Ouf!

Merci à tous pour vos réponses. J'ai beaucoup appris ces derniers jours!