2017-01-02 9 views
0

私は次のようにクラス内のReduxのアクションクリエイターを定義している:クラスで定義されているreduxアクションクリエイターでbindActionCreators()を使用できますか?

export class ActionCreator { 

    login() { 
     return { type: 'LOGIN_STATUS' }; 
    } 

    fbLoginStatusOK(user) { 
     return { type: 'LOGIN_OK', user }; 
    } 
} 

そこで私は、このようにそれらを使用していますリアクトコンポーネント内:私は「上bindActionCreatorsを使用するにはどうすればよい

class Login extends React.Component { 

    login(e) { 
     e.preventDefault(); 
     a = new ActionCreator(); // Simplified 
     dispatch(a.login()); 
    }; 

    render() { 
     return (
      <div> 
       <h1>Login</h1> 
       <p> 
        <a href="#" onClick={this.login}>Login</a> 
       </p> 
      </div> 
     ); 
    } 
} 

ActionCreator 'のクラスまたはそのオブジェクトですか?

答えて

2

bindActionCreators

(彼らは直接起動することができるように、すべてのアクションの作成者は、ディスパッチコールにラップされるように)は、オブジェクトのすべての機能プロパティを反復処理し、dispatch()コールでそれらをラップするObject.keysを使用しています。 Babelメソッドを列挙できないプロパティに変換するので、bindActionCreators(new ActionCreator())のようなものを使用しても、機能しません。

class ActionCreator { 
    constructor() { 
     this.login =() => ({ type: 'LOGIN_STATUS' }); 
    } 
} 

をそれはポイントを逃す:

可能な解決策は、コンストラクタ内のすべてのメソッドを宣言する可能性があります。

bindActionCreatorsに似ていますが、Object.keysではなくObject.getOwnPropertyNamesを使用する独自のユーティリティを作成することもできます。ただし、ここでは注意して、必要なメソッドだけをラップするようにしてください(たとえば、constructorは無視してください)。

また、あなたの動機は何ですか?普通のオブジェクトの代わりにクラスを使用するオーバーヘッドのビットではありませんか?

+0

Reactはクラスベースなので、私は可能な限りReduxの部分にクラスラッパーを配置しようとしていました。 – Chebyr

+1

私はReactを「クラスベース」と呼ぶのではなく、単純に「モジュラー」と呼んでいます。また、Reduxが必ずしもReactと結合しているわけではないことを忘れないでください。あなたの例から、私は実際にクラスを宣言してインスタンス化する必要はありません。技術的には、コードベースも大きくなります。 –

+0

次に、ActionCreatorクラスで静的メソッドの解読を行い、bindActionCreators(ActionCreator、dispatch)を使用できますか? – Chebyr

関連する問題