Je voulais stocker l'email dans le magasin Redux Store et je ne parviens pas à le faire ici est mon composant de connexion et Redux Stocker toute aide serait apprécié que j'utilise réactive-navigation
Ma méthode d'expédition est invoquée sur le Charge initiale ainsi que sur chaque course clé pour la saisie d'e-mail Je souhaite que vous n'inquisteriez que sur le bouton de continuer sur le bouton Continuer P>
IÂ Besoin d'un moyen de stocker l'e-mail dans le magasin et de la récupérer dans un autre écran plus tard H1>SIGNUP.JS4/H1>
import * as actionTypes from './actions'; const initialState = { email: '', accountType: '', name: '', dob: '', address: '', ssn: '', phoneNumber: '', }; const reducer = (state = initialState, action) => { switch (action.type) { case actionTypes.SIGNUP: return { ...state, email: action.email, }; default: return state; } }; export default reducer;
import React, { Component } from 'react'; import { StyleSheet, View, KeyboardAvoidingView, Keyboard, TouchableWithoutFeedback, Alert } from 'react-native'; import { SocialIcon } from 'react-native-elements'; import PropTypes from 'prop-types'; import { Header } from 'react-navigation'; import { connect } from 'react-redux'; import { Container, Footer, FooterContainer, DefaultInput, Typography } from '../components/common'; import { validate } from '../config'; import * as actionTypes from '../store/actions'; const styles = StyleSheet.create({ container: { flex: 1 }, input: { width: '80%', height: 40 } }); class SignUp extends Component { state = { controls: { email: { value: '', valid: false, validationRules: { isEmail: true }, touched: false }, password: { value: '', valid: false, validationRules: { minLength: 6 }, touched: false }, confirmPassword: { value: '', valid: false, validationRules: { equalTo: 'password' }, touched: false } } }; updateInputState = (key, value) => { let connectedValue = {}; const stateObject = this.state; if (stateObject.controls[key].validationRules.equalTo) { const equalControl = stateObject.controls[key].validationRules.equalTo; const equalValue = stateObject.controls[equalControl].value; connectedValue = { ...connectedValue, equalTo: equalValue }; } if (key === 'password') { connectedValue = { ...connectedValue, equalTo: value }; } this.setState(prevState => ({ controls: { ...prevState.controls, confirmPassword: { ...prevState.controls.confirmPassword, valid: key === 'password' ? validate( prevState.controls.confirmPassword.value, prevState.controls.confirmPassword.validationRules, connectedValue ) : prevState.controls.confirmPassword.valid }, [key]: { ...prevState.controls[key], value, valid: validate(value, prevState.controls[key].validationRules, connectedValue), touched: true } } })); }; render () { const stateData = this.state; const { navigation } = this.props; return ( <KeyboardAvoidingView style={styles.container} behavior="padding" keyboardVerticalOffset={Header.HEIGHT + 20} > <TouchableWithoutFeedback onPress={Keyboard.dismiss}> <Container> <Typography textType="loginLabelStyle" textLabel="Use any of your existing profiles" /> <View style={â{ flexDirection: 'row', justifyContent: 'space-between', }} > <SocialIcon type="twitter" /> <SocialIcon type="facebook" /> <SocialIcon type="google" light onPress={this.signIn} /> </View> <Typography textType="loginLabelStyle" textLabel="or create one on SimpliFid" /> <DefaultInput placeholder="Your E-Mail Address" style={styles.input} value={stateData.controls.email.value} onChangeText={val => this.updateInputState('email', val)} valid={stateData.controls.email.valid} touched={stateData.controls.email.touched} autoCapitalize="none" autoCorrect={false} keyboardType="email-address" /> <DefaultInput placeholder="Password" style={styles.input} value={stateData.controls.password.value} onChangeText={val => this.updateInputState('password', val)} valid={stateData.controls.password.valid} touched={stateData.controls.password.touched} secureTextEntry /> <DefaultInput placeholder="Confirm Password" style={styles.input} value={stateData.controls.confirmPassword.value} onChangeText={val => this.updateInputState('confirmPassword', val)} valid={stateData.controls.confirmPassword.valid} touched={stateData.controls.confirmPassword.touched} secureTextEntry /> <FooterContainer> <Footer leftButtonHandler={() => navigation.goBack()} rightButtonHandler={this.props.onSignUp(stateData.controls.email.value, navigation)} /* rightButtonHandler={() => navigation.navigate('ChatBot')} */ /> </FooterContainer> </Container> </TouchableWithoutFeedback> </KeyboardAvoidingView> ); } } SignUp.propTypes = { navigation: PropTypes.shape({ navigate: PropTypes.func.isRequired }).isRequired }; const mapDispatchToProps = dispatch => ({ onSignUp: (email, navigation) => { Alert.alert(email); dispatch({ type: actionTypes.SIGNUP, email }); navigation.navigate('ChatBot'); } }); export default connect( null, mapDispatchToProps )(SignUp);P>
3 Réponses :
Vous appelez le ceci.props.oningUp code> méthodes sur chaque rendu de
Essayez d'envelopper l'appel dans un manutention code> Méthode: handleRightButton = () => {
this.props.onSignUp(this.state..controls.email.value, this.props.navigation);
}
// And on render
render() {
...
rightButtonHandler={this.handleRightButton}
...
}
Cela a résolu mon problème partiellement, je suis capable d'appeler la méthode d'expédition uniquement sur le bouton Continuer, cliquez, mais il ne met toujours pas à jour le magasin.
Je ne peux pas vous aider avec cela, j'ai supposé que votre composant de pied de page fonctionnait, mais sinon c'est un autre problème
vous devez partager votre Footer CODE> Cause des composants avec les informations que j'ai, je ne sais pas ce qui se passe dedans
<Footer leftButtonHandler={() => navigation.goBack()} rightButtonHandler={(event) => { event.preventDefault(); this.props.onSignUp(stateData.controls.email.value,navigation) /> Try adding the event.preventDefault() in the rightButtonHandler.
Il ne s'agit pas d'empêcher la valeur par défaut car ce n'est pas le même événement, mais avec votre réponse, le fait que l'appel est enveloppé dans une fonction de gestionnaire d'événements pourrait le réparer, mais la façon dont vous devriez éviter de créer des fonctions dans la phase de rendu.
Le problème était que j'essayais d'accéder au magasin d'une mauvaise manière que j'essayais d'utiliser ce Cependant, la bonne voie et probablement le seul moyen d'accéder au magasin utilise MapStationtoprops. p>