버튼에다가 htmlType submit을 붙어줘야 form이 submit이 되는데 submit이 되면 onFinish이 호출이 된다.
onFinish는 자동으로 e.preventDefault()가 적용이 되어있다. 그래서 antd에서는 e.preventDefault()를 쓰면 안된다.
// LoginForm.js
<Form onFinish={onSubmitForm}>
<Button type="primary" htmlType="submit" loading={false}>로그인</Button>
// antd에서 사용 x
const onSubmitForm = () => {
e.preventDefault();
}
return (
<Form onFinish={onSubmitForm}>
)
const onSubmitForm = useCallback(() => {
console.log(id, password);
}, [id, password]);
LoginForm.js에서 setIsLoggedIn이 있는데 이것을 AppLayout.js에서 넘겨줄 것이다.
// AppLayout.js
<Col xs={24} md={6}>
{isLoggedIn ? <UserProfile /> : <LoginForm setIsLoggedIn={setIsLoggedIn}/>}
</Col>
// LoginForm.js
const LoginForm = ({ setIsLoggedIn }) => {
const [id, setId] = useState('');
const [password, setPassword] = useState('');
const onChangeId = useCallback((e) => {
setId(e.target.value);
}, [])
const onChangePassword = useCallback((e) => {
setPassword(e.target.value);
}, [])
const style = useMemo(() => ({ marginTop: 10}), []);
const onSubmitForm = useCallback(() => {
console.log(id, password);
setIsLoggedIn(true);
}, [id, password]);
그러면 LoginForm에서 setIsLoggedIn(true)를 하는순간 즉 로그인을 하는 순간 AppLayout에서 isLoggedIn이 true로 바뀌게 된다. 가짜로 로그인을 시켜줄 수 있는 것이다.
// LoginForm.js
const onSubmitForm = useCallback(() => {
console.log(id, password);
setIsLoggedIn(true);
}, [id, password]);
// AppLayout.js
<Col xs={24} md={6}>
{isLoggedIn ? <UserProfile /> : <LoginForm setIsLoggedIn={setIsLoggedIn}/>}
</Col>
antd 에서 card를 보자. 깔끔하게 하나의 컴포넌트로 나오는 것을 볼 수 있다. 인스타그램이나 페이스북 포스트 같은 것을 카드 컴포넌트로 하면 좋다. 아래에서 key를 붙인 이유는 배열안에 들어있어서 key를 넣어주었다.
리액트에서 배열로 jsx 쓸때는 key를 넣어주어야 한다.
// UseProfile.js
import React from 'react';
import { Avatar, Card } from "antd";
import { Button } from 'antd/lib/radio';
const UserProfile = () => {
return (
<Card
actions={[
<div key="twit">짹짹<br />0</div>,
<div key="followings">팔로잉<br />0</div>,
<div key="follower">팔로워<br />0</div>,
]}
>
<Card.Meta
avatar={<Avatar>ZC</Avatar>}
title="ZeroCho"
/>
<Button>로그아웃</Button>
</Card>
);
}
export default UserProfile;
로그아웃을 하면 풀리게 해보자.
// UserProfile.js
const UserProfile = ({ setIsLoggedIn }) => {
const onLogOut = useCallback(() => {
setIsLoggedIn(false);
}, []);
Form 태그를 FormWrapper로 바꿔서 스타일을 넣어주자.
// LoginForm.js
const FormWrapper = styled(Form)`
padding: 10px
`;
<FormWrapper onFinish={onSubmitForm}>
<출처 조현영: [리뉴얼] React로 NodeBird SNS 만들기>
[리뉴얼] React로 NodeBird SNS 만들기 - 인프런 | 강의
리액트 & 넥스트 & 리덕스 & 리덕스사가 & 익스프레스 스택으로 트위터와 유사한 SNS 서비스를 만들어봅니다. 끝으로 검색엔진 최적화 후 AWS에 배포합니다., 새로 만나는 제로초의 리액트 노드버
www.inflearn.com
'React > NodeBird(ZeroCho)' 카테고리의 다른 글
프로필 페이지 만들기 (0) | 2021.09.17 |
---|---|
noreferrer&noopener (0) | 2021.09.17 |
리렌더링 이해하기 (0) | 2021.09.17 |
로그인 폼 만들기 (0) | 2021.09.17 |
반응형 그리드 사용 (0) | 2021.09.16 |