2017-10-06 6 views
1

私はこの回答を検索しましたが、私の問題と一致するものは見つかりませんでした。 React & Reduxを使用して電卓アプリを構築しようとしていて、数字ボタンの1つをクリックすると、「this.props.AppendCharacterは関数ではありません」というエラーが表示されますReact-Redux:this.props.AppendCharacterは関数ではありません

ここに私の関連コードはあります:あなたのを変更することで、あなたが必要なものを達成することができ

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); 

アクション/ index.js

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

答えて

0

他の誰かが、あなたがその機能を必要とする場合で比較検討する必要があるかもしれないので、私は、bindActionCreatorsに精通していないよ

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

:へ。


サイドノート:あなたの現在のセットアップにbuttonためのコンポーネントの状態を必要とするように、それは見ていません。あなたはその計画を立てているかもしれませんが、あなたの例では未使用です。

+0

ありがとうございます。私はそれを試しましたが、 "Uncaught TypeError:(0、_index2.default)は関数ではありません"という別のエラーが発生しました (ああ、私はおそらく、私はその部分を追加してからデザインを変更しました。そのコメントをありがとうございます。) – PirateJohn

+0

あなたは近くです。このような音はあなたの問題を解決しました。今、あなたは '輸入'と '輸出'の仕方を再検討する必要があります。あなたが意図したときに(あるいはそれを意味しなかったときに)、あなたは 'デフォルトの'エクスポートを持っているかもしれない(そうでないかもしれない)と思う。 [これは助けてください](https://stackoverflow.com/a/36796281/2479481) –

+1

元の 'mapDispatchToProps'はOKでした。 'bindActionCreators'は、呼び出しのアクションクリエータを' dispatch() 'にラップします。しかし、もしあなたが 'dispatch()'の仕組みを深く理解していなければ、 'bindActionCreators'を使うべきではないと思います。 。 – stone

0
const mapDispatchToProps = { 
    AnswerScreen, 
    AppendCharacter 
}; 

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

ありがとうございました。私はあなたのコードを試しましたが、残念ながらまだ動作しませんでした。 – PirateJohn

+0

これは正しい方向の一歩ですが、実際にはディスパッチを小道具にマッピングしないので機能しません。 'mapDispatchToProps'はパラメータ' dispatch'を取る必要があり、各アクション作成者に対して 'dispatch'を呼び出す関数を返す必要があります。これを設定する方法の一例については私の答えを見てください。 –

0

まあ、私はエラーが見つかりました。別のWebサイトの誰かが私を助けました。 bindActionCreatorsはうまくいきましたが、問題は、../actions/indexからAppendCharacterをインポートするときに、AppendCharacterを中括弧で囲む必要があることでした。私はそれを変更し、今、アプリが動作します。

Whew!

返信いただきありがとうございます。私はこの数日で多くを学んだ!