본문 바로가기

react

[React] 흔하디 흔한 투두리스트 아니고 로그인 - 2

loginContainer 컴포넌트 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import React from 'react';
import { useDispatch } from 'react-redux'// ( 1 )
import SignInForm from '../components/Auth/SignInForm';
import { signInRequestAction } from '../redux/action/auth'// ( 2 )
import { Router } from "react-router-dom";
 
function AccountContainer () {
 
    const dispatch = useDispatch();
 
    const onSignIn = (user) => dispatch(signInRequestAction(user)); // ( 3 )
 
    const signInForm = () => (<SignInForm onSignIn={onSignIn}/>); // ( 4 )
 
    return(
        <div className="body_wrapper">
            <Switch>
            <Router exact path="/accounts/signin" component={signInForm} /> // ( 4 )
            </Switch>
        </div>
    )
}
 
export default AccountContainer;
cs

src/containers/AccountContainer.js 파일을 생성한다.
해당 컨테이너 컴포넌트에서 계정 관련한 라우팅을 잡는다.
( 1 ) -> react-redux모듈이 제공하는 useDispatch 함수를 통해 action을 디스패치 (실행, 발생) 시킬 수 있다.
( 2 ) -> createAction함수를 통해 만든 action 생성 함수를 import해서 사용한다.
( 3 ) -> 어떠한 action을 dispatch할 때는 dispatch 함수의 인자로 action을 넣어준다.
( 4 ) -> 필자는 SignInForm 컴포넌트에 onSignIn dispatch 함수를 넣어 리턴하는 함수를 생성해 라우트 컴포넌트로 넣어줬다.

SignInForm 컴포넌트 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import React, { useState } from 'react'// ( 1 )
 
const SignInForm = ({ onSignIn }) => {
 
    const [email, setEmail] = useState(''); // ( 2 )
    const [password, setPassword] = useState(''); // ( 3 )
 
    const _handleChange = (event=> {
        const { target: { name, value } } = event // 비구조화 할당
        if(name === 'email') {
            setEmail(value); // ( 4 )
        } else if(name === 'password'){
            setPassword(value); // ( 5 )
        }
    }
 
    const onSubmit = () => {
        const user = {
            email,
            password
        }
        onSignIn(user); // ( 6 )
        setEmail(''); // 인풋 초기화
        setPassword('');
    };
 
    return(
        <div>
            <div>
              <label>이메일</label>
              <input name = "email" type="text" placeholder="saasland@gmail.com" value={email} onChange={_handleChange}/>
            </div>
            <div>
              <label>비밀번호</label>
              <input name= "password" type="password" placeholder="******" value={password} onChange={_handleChange}/>
            </div>
            <button className="login-button" onClick={onSubmit}>로그인</button>
        </div>
    )
}
export default SignInForm;
cs

src/components/SignInForm간단한 형태의 로그인 컴포넌트를 만들었다.
( 1 ) -> 상태 관리를 위하여 useState hook을 사용한다.
( 2 ) -> email state를 초기화한다.
( 3 ) -> password state를 초기화한다.
( 4 ) -> email input태그에 입력된 값을 email state에 변경한다.
( 5 ) -> password input태그에 입력된 값을 password state에 변경한다.
( 6 ) -> 로그인 버튼이 눌렸을 때 props로 받은 onSignIn 액션 디스패치 함수에 email과 password를 담은 객체를 인자로 넣어 실행한다.

onSignIn 함수가 실행되면 signInRequestAction 액션이 디스패치되어 reducer에서 state값을 변동할 수 있다.

요약

  • 이전 포스팅에서 생성한 redux action과 reducer, dispatch를 이어주었다.
  • 실행 흐름
  1. email과 password를 입력한 후 로그인 버튼을 누른다.
  2. SignInForm 컴포넌트에서 props로 받은 onSignIn 액션 dispatch 함수에 객체를 넣어주며 호출한다.
  3. 로그인 액션이 생성되며 dispatch된다.
  4. redux-saga 미들웨어의 제너레이터 함수가 실행된다. -> 비동기 통신, 또 다른 액션 dispatch를 여기서 처리한다.
  5. saga 제너레이터 함수에서 비동기 통신을 한 후 해당 결과값으 성공 액션 or 실패 액션에 서버 응답값을 넣어 dispatch 한다.
  6. 성공 액션 or 실패 액션의 reducer에서 redux store의 state값을 변경시켜준다.(불변성을 지켜줘야함)

'react' 카테고리의 다른 글

[React] Redux 기본 개념  (1) 2020.05.19
[React] 흔하디 흔한 투두리스트 아니고 로그인 - 1  (0) 2020.05.19