2016-11-10 9 views
2

私はちょうどreduxに慣れ親しんでおり、私はアクションクリエイターをアプリケーションの親を通して渡し、mapStateToProps、mapDispatchToProps、および私はアクションを渡すことができる必要があります。しかし、私は子コンポーネントを呼び出すときthis.props。関数が存在しないので、正しく渡されていないようです。ネイティブ・コネクト機能が小道具を介して子コンポーネントにアクションを渡さない

私は大いに助けていただきたいと思います。

注:私は輸入品や減量剤のようなものをいくつか省略して、より簡潔にしました。

login.js:

export function login(token, id) { 
    console.log('login action'); 
    return { 
    type: 'LOG_IN', 
    token, 
    id, 
    }; 
} 

index.ios.js:

import * as actionCreators from './actions/login' 

const store = createStore(RootReducer, undefined, autoRehydrate()); 
persistStore(store); 

class App extends Component { 
    constructor(props) { 
    super(props); 
    state = { 
     token: '', 
     id: '', 
     store: store, 
    }; 
    } 

    render() {  
    return (

    <Provider store={ state.store }> 
     <View style = {styles.container}> 
     <LoginView/> 
     </View> 
    </Provider> 
    ); 
    } 
} 

AppRegistry.registerComponent('App',() => App); 

function mapStateToProps(state) { 
    return { 
    token: state.token, 
    id: state.id 
    } 
} 

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

export default connect(mapStateToProps, mapDispatchToProps)(App); 

loginView.js:

export class LoginView extends View { 

    static propTypes = {} 

    static defaultProps = {} 

    constructor(props) { 
    console.log(props); 
    super(props) 
    this.state = { 
     user: '', 
     token: '', 
     id: '', 
    } 
    this.onLogin = this.onLogin.bind(this); 
    } 

    onLogin() { 
    console.log("on login1"); 
    this.props.login({token: this.state.token, id: this.state.id}); 
    console.log("on login"); 
    } 

そして、基本的に何が起こることになるときonLogin()関数が直接上に呼び出された場合、this.props.loginは関数ではないことを示します。これの理由は何ですか?どうすれば修正できますか?

答えて

2

あなたはAppコンポーネントを接続していますので、this.props.onLogin()になります。しかし、onLoginを小道具として<LoginView />に渡すことはありません。 <LoginView onLogin={this.props.onLogin} />をレンダリングするか、LoginViewにも接続し、そのコンポーネントの接続の一部としてonLoginを含める必要があります。

+0

ありがとうございます。 私の実装にこのガイドを使用していました:https://medium.com/@MKulinski/react-redux-basics-a36914c0035d#.76dv77xlp コンポーネントの小道具として渡す必要はないように聞こえましたあなたが言ったように。これは当てはまりませんか? – jkurs

+0

ええ、その記事の文言は悪いです。 Reactコンポーネントは、魔法のように小道具を手に入れることはありません。彼らはどこかから手渡さなければなりません。 'connect'はデータ小道具と関数小道具をあなたの「本当の」コンポーネントに渡すラッパーコンポーネントを生成します。ですから、明示的に 'App'の' onLogin'メソッドを 'LoginView'に明示的に渡すか、' LoginView'を直接 'mapDispatch'の' onLogin'に渡してください。 – markerikson

+0

また、React、Redux、および関連トピックに関する高品質のチュートリアルや記事へのリンクは、https://github.com/markerikson/react-redux-linksにあります。たくさんの良い情報や例がそこからリンクされています。 – markerikson

1

このライン:

return bindActionCreators({actionCreators}, dispatch); 

は次のようになります。

return bindActionCreators(actionCreators, dispatch); 

"actionCreatorsは" すでにオブジェクトです。別の中括弧のセットの中に渡すことで、ES6の短縮形プロパティ名の構文として解釈されています。あなたが実際に通過しているのは、次のような新しいオブジェクトです:

{ 
    actionCreators: { 
    login: ... // your action is buried here 
    } 
} 

// ^^ which would get mapped to this.props.actionsCreators.login (wrong) 
+0

お返事ありがとうございます。残念ながら、それはエラーを修正しませんでした。他に提案はありますか? – jkurs

関連する問題