Ich bin neu in Redux und Probleme mit meinem Kopf um Präsentation und Container-Komponenten.Fehler bei der Verwendung von Aktionen in react-redux darstellende Komponente
Relevante Stapel:
- reagieren v0.14.8
- reagieren-native v0.24.1
- redux v3.5.2
- reagieren-redux v4.4.5
Das Problem:
Ich habe eine Login-Button-Komponente, die bei der Überprüfung überprüft den Anmeldestatus und ruft die onSuccessfulLogin
Aktion, die den Status mit den Facebook-Anmeldeinformationen des Benutzers aktualisiert.
Wenn ich jedoch versuche, diese in separate Präsentations-/Container-Komponenten zu trennen, kann ich die Aktion onSuccessfulLogin nicht aufrufen: Error: onSuccessfulLogin is not defined
.
Was mache ich hier falsch? Ich könnte mir vorstellen, dass es etwas Einfaches gibt, das ich nicht verstehe mit der Beziehung zwischen den beiden Komponenten und der connect()
Funktion.
Präsentations Komponente (Login.js)
import React, { PropTypes } from "react-native";
import FBLogin from "react-native-facebook-login";
import UserActions from "../users/UserActions";
class LoginPage extends React.Component {
render() {
const { userData, onSuccessfulLogin } = this.props;
return (
<FBLogin
permissions={["email","user_friends"]}
onLoginFound= { data => {
onSuccessfulLogin(data.credentials);
}}
/>
)
}
};
export default LoginPage;
Container Komponente (LoginContainer.js)
import { connect } from 'react-redux';
import LoginPage from "../login/LoginPage";
import UserActions from "../users/UserActions";
const mapDispatchToProps = (dispatch) => {
return {
onSuccessfulLogin: (userData) => {
dispatch(UserActions.userLoggedIn(userData))
}
}
}
const mapStateToProps = (state) => {
return {
userData: state.userData
}
}
const LoginContainer = connect(
mapStateToProps,
mapDispatchToProps
)(LoginPage);
export default LoginContainer;
Auch wenn ich wollte die aktualisierte state.userData
zugänglich für die LoginPage
machen Komponente, wie würde ich das tun? Jede Hilfe wird geschätzt!
Gelöst! Wenn ES6-Klassen, sind Sie erforderlich super(props)
in einer Konstruktor-Methode aufrufen, um den Behältereigenschaften im angeschlossenen Präsentations-Komponente zuzugreifen:
class LoginPage extends React.Component {
constructor(props){
super(props);
}
render(){
// ...
}
}
Ich bin ein wenig verwirrt, obwohl, weil auf die redux docs (http://redux.js.org/docs/basics/ExampleTodoList.html) haben sie einen Behälter ('Container/VisibleTodoList.js') das macht nichts. Was ist der Unterschied? – Andrew
hm ... das ist ein grundlegendes Beispiel, wo sie die Container nur verwenden, um den Zustand und die Aktionen zu injizieren, was nicht üblich ist, für eine realere Beispielprüfung https://github.com/reactjs/redux/tree/master/ examples/real-world – QoP
Hi QoP, danke für deine Antworten :) Warum würde der Code in meinem Beispiel nicht nur für den Status und die Aktionen verwendet werden? – Andrew