2016-10-18 11 views
0

Я пытался научиться этому. Это простое приложение для входа в систему, с помощью Redux. При нажатии кнопки входа из Display.js необходимо вызвать функцию login_action. Но появляется ошибка с заголовком Невозможно прочитать свойство login_action undefined. Я пробовал записывать реквизиты в Display.js, и я могу видеть функции в журналах, но так или иначе функции не вызываются. Что мне не хватает или не удается узнать?Redux with React Native - не удалось получить доступ к функции свойства

Basic App:

/* App.js */ 
import React, {Component} from 'react'; 
import { createStore, applyMiddleware, combineReducers } from 'redux'; 
import { Provider } from 'react-redux'; 
import thunk from 'redux-thunk'; 

import * as reducers from './reducers'; 
import SceneContainer from './containers/SceneContainer'; 

const createStoreWithMiddleware = applyMiddleware(thunk)(createStore); 
const reducer = combineReducers(reducers); 
const store = createStoreWithMiddleware(reducer); 

export default class App extends Component { 
    render() { 
    return (
     <Provider store={store}> 
     <SceneContainer /> 
     </Provider> 
    ); 
    } 
} 

Контейнер:

/* containers/SceneContainer.js */ 
'use strict'; 

import React, {Component, PropTypes} from 'react'; 
import Display from '../components/display'; 
import * as loginActions from '../actions/'; 
import {connect} from 'react-redux'; 
import {bindActionCreators} from 'redux'; 

class SceneContainer extends Component { 
    constructor(props) { 
    super(props); 
    } 
    render() { 
    const {actions} = this.props; 
    console.log(actions); 
    return (
     <Display {...actions}/> 
    ); 
    } 
} 
SceneContainer.propTypes = { 
    user: PropTypes.object.isRequired, 
    actions: PropTypes.object.isRequired 
}; 

function mapStateToProps(state) { 
    return {user: state.auth.user}; 
} 
function mapDispatchToProps(dispatch) { 
    console.log(loginActions); 
    return { 
    actions: bindActionCreators(loginActions, dispatch) 
    }; 
} 
export default connect(mapStateToProps, mapDispatchToProps)(SceneContainer); 

компонентов:

/* components/display.js */ 
import React, {Component, PropTypes} from 'react'; 
import { 
    View, 
    Text, 
    StyleSheet, 
    TouchableHighlight, 
} from 'react-native'; 

class Display extends Component { 
    constructor(props) { 
    super(props); 
    console.log(props.login_action); 
    } 
    onLoginPress() { 
    this.props.login_action({ 
     username: 'ranat', 
     password: 'password' 
    }); 
    } 
    onLogoutPress() { 
    this.props.logout_action(); 
    } 
    render() { 
    return (
     <View> 
     <TouchableHighlight onPress={this.onLoginPress}> 
      <Text>Login</Text> 
     </TouchableHighlight> 
     <TouchableHighlight onPress={this.onLogoutPress}> 
      <Text>Logout</Text> 
     </TouchableHighlight> 
     </View> 
    ); 
    } 
} 
Display.propTypes = { 
    logout_action: PropTypes.func.isRequired, 
    login_action: PropTypes.func.isRequired 
}; 

export default Display; 

Действия файл:

/* actions/index.js */ 
import {LOGIN_ACTION, LOGOUT_ACTION, LOGIN_SUCCESS, LOGIN_FAILURE} from './actionTypes'; 

export var login_action = (userCredentials) => { 
    if(userCredentials.username === 'ranat' && userCredentials.password === 'password') { 
    return { 
     type: LOGIN_ACTION, 
     value: LOGIN_SUCCESS, 
    }; 
    } 
    else { 
    return { 
     type: LOGIN_ACTION, 
     value: LOGIN_FAILURE, 
    }; 
    } 
}; 

export var logout_action =() => { 
    return { 
    type: LOGOUT_ACTION, 
    } 
}; 

Редукторы:

/* reducers/login.js */ 
import {LOGIN_ACTION, LOGOUT_ACTION, LOGIN_SUCCESS, LOGIN_FAILURE} from '../actions/actionTypes' 

let cloneObject = (obj) => { 
    if(obj) 
    return JSON.parse(JSON.stringify(obj)); 
    else 
    return {}; 
} 

const initialState = { 
    user: { 
    loggedIn: false, 
    }, 
}; 
const auth = (state = initialState, action = {}) => { 
    switch(action.type) { 
    case LOGIN_ACTION: { 
     if(action.value === LOGIN_SUCCESS) { 
     return { 
      ...state, 
      user: { 
      loggedIn: true 
      } 
     }; 
     }else { 
     return { 
      ...state, 
      user: { 
      loggedIn: false 
      } 
     }; 
     } 
    } 
    case LOGOUT_ACTION: { 
     if(action.value === LOGIN_SUCCESS) { 
     return { 
      ...state, 
      user: { 
      loggedIn: false 
      } 
     }; 
     }else { 
     return state; 
     } 
    } 
    default: { 
     return state || initialState; 
    } 
    } 
} 

export default auth; 

/* reducers/index.js */ 
import { combineReducers } from 'redux'; 
import auth from './login'; 

export { 
    auth, 
}; 

ответ

0

Изменить onPress={this.onLoginPress} в onPress={this.onLoginPress.bind(this}.

Сделайте то же самое для onPress={this.onLogoutPress}.