ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <TIL> 로그인, 회원가입 화면 구현 - Trello(4)
    TIL 2020. 3. 19. 23:37

    오늘은 로그인 , 회원가입 페이지를 구현하다가 새로 알게 된 것들에 대해 작성을 하겠습니다.

     

    1.  에뮬레이터에서는 컴퓨터 로컬에서 돌리는 서버와 연결하려면 (127.0.0.1) IP주소말고 (10.0.2.2)로 변경해야 합니다.

     

    처음에는 http://localhost:port로 연결을 시도 했지만 NetWork Error만 발생하고 서버에는 들어가지도 않는 상황이 발생하였습니다.

    이러한 경우에는 IP 주소를 10.0.2.2 로 변경하여 http://10.0.2.2:port로 연결하면 작동이 됩니다.

     

    관려 stackover flow : https://stackoverflow.com/questions/5528850/how-do-you-connect-localhost-in-the-android-emulator

     

    How do you connect localhost in the Android emulator?

    I have made a php script inside localhost and I am connecting that with httpClient but I am getting a problem. Please tell me how can I connect to a php file at localhost from the emulator?

    stackoverflow.com

    2. Stack router을 쓸 때 조심

    로그인 페이지에서도 회원가입 페이지로 이동하는 버튼이 있고

    회원가입 페이지에서는 회원가입이 성공하면 로그인 페이지로 바로 이동 할 수 있게 플로우를 구성하였습니다.

     

    만약에 회원가입을 한 뒤에 성공하여 로그인 페이지로 이동하였다가 다시 회원가입 페이지로 이동을 하게 되면 State의 데이터가 로그인 페이지로 넘어가는 바로 전 state상태로 계속 머무르고 있다는 것을 알았습니다. 

    그래서 state 의 successAlert이 계속 true로 있었고 그 값에 맞춰 계속 회원가입이 성공하였다는 경고창이 뜨여있는 err가 발생되었습니다.

     

    import React, { Component } from 'react';
    import {
      View, Text, StyleSheet, TouchableOpacity,
    } from 'react-native';
    import { Button } from 'react-native-elements';
    import { Isao } from 'react-native-textinput-effects';
    import Axios from 'axios';
    import Alert from 'react-native-awesome-alerts';
    import { server } from '../utils/server';
    
    class Signup extends Component {
      constructor(props) {
        super(props);
        this.state = {
          name: null,
          email: null,
          password: null,
          SuccessAlert: false,
          FailAlert: false,
        };
        this.signupPressButton = this.signupPressButton.bind(this);
      }
    
    
      signupPressButton() { 
      ...
      }
    
      render() {
        return (
          <View style={styles.total}>
            <View style={styles.AppName}>
              <Text style={{ fontSize: 50 }}>
                Hello!
              </Text>
            </View>
            <View style={styles.Inputs}>
              <Isao
                    label="Name"
                    style={{ width: 330, marginTop: 15 }}
                    activeColor="#da7071"
                    borderHeight={8}
                    inputPadding={16}
                    labelHeight={24}
                    passiveColor="black"
                    onChangeText={(text) => this.setState({ name: text })}
              />
              <Isao
                    label="Email"
                    activeColor="#da7071"
                    borderHeight={8}
                    style={{ width: 330 }}
                    inputPadding={16}
                    labelHeight={24}
                    passiveColor="black"
                    onChangeText={(text) => this.setState({ email: text })}
                />
                <Isao
                    label="Password"
                    style={{ width: 330, marginBottom: 20 }}
                    activeColor="#da7071"
                    borderHeight={8}
                    inputPadding={16}
                    labelHeight={24}
                    passiveColor="black"
                    onChangeText={(text) => this.setState({ password: text })}
                />
                <View style={{ flexDirection: 'row' }}>
                <Button
                title="회원가입"
                type="outline"
                buttonStyle={{ width: 90, height: 40 }}
                onPress={() => this.signupPressButton()} />
                <TouchableOpacity onPress={() => this.props.navigation.navigate('Login Screen')}>
                  <Text>
                    로그인 페이지
                  </Text>
                </TouchableOpacity>
                </View>
            </View>
            <Alert
            show={this.state.SuccessAlert}
            title="회원가입 성공"
            message="성공적으로 회원가입 되었습니다."
            showConfirmButton
            confirmText="로그인 하러 가기"
            confirmButtonColor="blue"
            onConfirmPressed={() => this.props.navigation.navigate('Login Screen')} />
            <Alert
            show={this.state.FailAlert}
            title="회원가입 실패"
            message="회원가입을 실패하였습니다."
            confirmText="회원가입 다시 하기"
            onConfirmPressed={() => this.setState({
              FailAlert: false, email: null, password: null, name: null,
            })}
            />
          </View>
        );
      }
    }
    const styles = StyleSheet.create({
     ...
    });
    export default Signup;

     

    그래서 로그인하러 가는 버튼을 누르면 state도 변경해주고 로그인 페이지로 이동해주는 함수를 만들어 넣어주었습니다.

     

    import React, { Component } from 'react';
    import {
      View, Text, StyleSheet, TouchableOpacity,
    } from 'react-native';
    import { Button } from 'react-native-elements';
    import { Isao } from 'react-native-textinput-effects';
    import Axios from 'axios';
    import Alert from 'react-native-awesome-alerts';
    import { server } from '../utils/server';
    
    class Signup extends Component {
      constructor(props) {
        super(props);
        this.state = {
          name: null,
          email: null,
          password: null,
          SuccessAlert: false,
          FailAlert: false,
        };
        this.signupAfter = this.signupAfter.bind(this);
        this.signupPressButton = this.signupPressButton.bind(this);
      }
    
      signupAfter() {
        this.setState({
          SuccessAlert: false,
        });
        return this.props.navigation.navigate('Login Screen');
      }
    
      signupPressButton() {
        ...
      }
    
      render() {
        return (
          <View style={styles.total}>
            <View style={styles.AppName}>
              <Text style={{ fontSize: 50 }}>
                Hello!
              </Text>
            </View>
            <View style={styles.Inputs}>
              <Isao
                    label="Name"
                    style={{ width: 330, marginTop: 15 }}
                    activeColor="#da7071"
                    borderHeight={8}
                    inputPadding={16}
                    labelHeight={24}
                    passiveColor="black"
                    onChangeText={(text) => this.setState({ name: text })}
              />
              <Isao
                    label="Email"
                    activeColor="#da7071"
                    borderHeight={8}
                    style={{ width: 330 }}
                    inputPadding={16}
                    labelHeight={24}
                    passiveColor="black"
                    onChangeText={(text) => this.setState({ email: text })}
                />
                <Isao
                    label="Password"
                    style={{ width: 330, marginBottom: 20 }}
                    activeColor="#da7071"
                    borderHeight={8}
                    inputPadding={16}
                    labelHeight={24}
                    passiveColor="black"
                    onChangeText={(text) => this.setState({ password: text })}
                />
                <View style={{ flexDirection: 'row' }}>
                <Button
                title="회원가입"
                type="outline"
                buttonStyle={{ width: 90, height: 40 }}
                onPress={() => this.signupPressButton()} />
                <TouchableOpacity onPress={() => this.props.navigation.navigate('Login Screen')}>
                  <Text>
                    로그인 페이지
                  </Text>
                </TouchableOpacity>
                </View>
            </View>
            <Alert
            show={this.state.SuccessAlert}
            title="회원가입 성공"
            message="성공적으로 회원가입 되었습니다."
            showConfirmButton
            confirmText="로그인 하러 가기"
            confirmButtonColor="blue"
            onConfirmPressed={() => this.signupAfter()} />
            <Alert
            show={this.state.FailAlert}
            title="회원가입 실패"
            message="회원가입을 실패하였습니다."
            confirmText="회원가입 다시 하기"
            onConfirmPressed={() => this.setState({
              FailAlert: false, email: null, password: null, name: null,
            })}
            />
          </View>
        );
      }
    }
    const styles = StyleSheet.create({
      ...
    });
    export default Signup;
    

    댓글

Designed by Tistory.