npm install @mui/material @emotion/react @emotion/styled
import { gql } from "@apollo/client";
export const POST_USER = gql`
mutation PostUser(
$email: String!
$password: String!
$name: String!
) {
postUser(
email: $email
password: $password
name: $name
) {
email
}
}
`;
GraphQL 쿼리 문법은 공식홈페이지를 참조
https://graphql.org/learn/
src/pages/SignUp.tsx 생성
import React, { useState } from "react";
import Box from '@mui/material/Box';
import TextField from '@mui/material/TextField';
import Button from '@mui/material/Button';
import { POST_USER } from "../gql/signup.gql";
import { useMutation } from "@apollo/client";
import { useNavigate } from "react-router-dom";
function SignUp() {
const navigate = useNavigate();
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [name, setName] = useState('');
const [postUserMutation] = useMutation(POST_USER);
const onSignUp = async (e: any) => {
e.preventDefault();
try {
const {
data: { postUser },
} = await postUserMutation({
variables: {
email,
password,
name,
},
});
if (postUser) {
alert("회원가입 성공!");
navigate("/");
}
} catch (error: any) {
console.error(`onSignUp Error = ${error}`);
}
}
return (
<div>
<Box
onSubmit={onSignUp}
component="form"
sx={{
'& > :not(style)': { m: 1, width: '25ch' },
}}
noValidate
autoComplete="off"
>
<TextField id="standard-email-input" label="Email" variant="standard" value={email} onInput={(e:any) => setEmail(e.target.value)} />
<TextField id="standard-password-input" type="password" label="Password" variant="standard" value={password} onInput={(e:any) => setPassword(e.target.value)} />
<TextField id="standard-name-input" label="Name" variant="standard" value={name} onInput={(e:any) => setName(e.target.value)} />
<Button variant="text" type="submit">Sign Up</Button>
</Box>
</div>
);
}
export default SignUp;
import React, { useState } from "react";
import Box from '@mui/material/Box';
import TextField from '@mui/material/TextField';
import Button from '@mui/material/Button';
import { Link } from "react-router-dom";
import { GET_USER } from "../gql/home.gql";
import { useLazyQuery } from "@apollo/client";
function Home() {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [onSignIn, {loading, error}] = useLazyQuery(GET_USER, {
fetchPolicy: "cache-and-network",
onError: error => {
console.error(error);
alert(error.message);
},
onCompleted: ({getUser}) => {
console.log(getUser);
}
});
return (
<div>
<Box
component="form"
sx={{
'& > :not(style)': { m: 1, width: '25ch' },
}}
noValidate
autoComplete="off"
>
<TextField id="standard-email-input" label="Email" variant="standard" value={email} onInput={(e:any) => setEmail(e.target.value)} />
<TextField id="standard-password-input" type="password" label="Password" variant="standard" value={password} onInput={(e:any) => setPassword(e.target.value)} />
<Button variant="text" onClick={() => onSignIn({variables: {email, password}})}>Sign In</Button>
<Button variant="text">
<Link to="/signup" style={{ textDecoration: 'none', color: '#1976d2' }}>Sign Up</Link>
</Button>
</Box>
</div>
);
}
export default Home;
Apollo client는 서버로부터 데이터를 받아오는데, 이 데이터를 캐시에 담아두었다가 같은 쿼리를 요청하면 캐시에 저장된 것을 다시 사용하거나, 새로 받아올 수 있는데 이를 정할 수 있는 것.
자세한 내용은 하단의 링크 참조
https://www.apollographql.com/docs/react/data/queries/#setting-a-fetch-policy
https://velog.io/@mkh1213/Express-GraphQL-MongoDB-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-4