2024. 4. 12. 17:00ㆍReact
<1-2교시>
youtube 틀 완성
youtube 디테일 구현 시작
https://firebase.google.com/?hl=ko
auth 소셜로그인 도와주어 api 쓰면 로그인 기능 구현 가능
리액트만 사용한다면 데이터베이스 엑세스 하는 코드만 사용하면 됨
api 제공 사이트를 많이 알면 고급진 서비스를 단시간 내에 할 수 있음
(파이어베이스 이용하라 == know fair) > 실전적이기 때문
파이어베이스 : 로그인 기능, DB 제공
(SQL이 아니라 noSQL임 : 몽고DB Not only SQL 더 큰 것을 할 수 있다.
비정형 데이터의 강점을 가짐, 이미지 텍스트 문서 등 RDB로 하기 어려운 부분을 해소함-json형태)
자바스크립트와 궁합이 맞음 오브젝트의 어레이가 DB에 들어가 있을 때 자바스크립트에서는 json으로
json.string 하면 변환이 되고 json객체를 .parse를 하면 열어지는 편리성이 있음 - 4.15 월요일 진행
사진 업로드 시 /file/download/filename => 지금까지 사용한 방법
새로운 방법 사이트 이용 : cloudinary > 사진을 올리면 센터링 작업 사진과 관련된 여러 기능들
블러링, 하이라이팅, 인공지능과 연계 - 이미지 자체와 관련된 여러 기능을 가능하게 함
youtube ver.1 / ver.2 수정 완료 > git 에 사진 업로드 완료
나의 에러
import React from "react";
import { useParams } from 'react-router-dom';
import axios from 'axios';
import { useQuery } from '@tanstack/react-query';
import HourglassTopIcon from '@mui/icons-material/HourglassTop';
import WarningAmberIcon from '@mui/icons-material/WarningAmber';
import VideoCard from '../components/VideoCard';
import Grid from "@mui/material/Grid";
export default function Videos() {
const { keyword } = useParams();
const keywordUri = `https://youtube.googleapis.com/youtube/v3/search?key=${process.env.REACT_APP_YOUTUBE_API_KEY}&maxResults=25&part=snippet&q=${keyword}`;
const popularUri = `https://youtube.googleapis.com/youtube/v3/videos?chart=mostPopular&key=${process.env.REACT_APP_YOUTUBE_API_KEY}&maxResults=25&part=snippet`;
const { isLoading, error, data: videos } = useQuery({
queryKey: ['videos', keyword],
queryFn: async () => {
const uri = keyword ? keywordUri + keyword : popularUri;
return axios
// .get(`/data/${keyword ? 'search' : 'popular'}.json`)
.get(uri)
.then(res => res.data.items);
}, staleTime: 1000 * 60 * 1,
});
// useEffect(() => {
// axios.get(`/data/${keyword ? 'search' : 'popular'}.json`)
// .then(res => setVideos(res.data.items))
// }, [keyword])
return (
<div>
<div style={{ marginBottom: '10px', color: "lightcoral", padding: '0px 0px 15px 25px' }}>Videos {keyword ? `${keyword} 검색` : 'Hot Trend'}</div>
{isLoading && <p><HourglassTopIcon />Loading</p>}
{error && <p><WarningAmberIcon />Something is wrong!!!</p>}
{videos && (
<Grid container spacing={1}>
{videos.map(video => (
<Grid item xs={12} sm={6} md={4} lg={3}>
<VideoCard vido={video} />
</Grid>
))}
</Grid>
// <div style={{ textAlign: 'left', display: 'flex', flexDirection: 'row', alignItems: 'flex-start', flexWrap: 'wrap', gap: '1px', margin: '5px' }}>
// {videos.map((video, index) => (
// <div key={index} style={{ flex: 1, marginBottom: '1px', textAlign: 'left' }}>
// <VideoCard video={video} />
// <div>{video.title}</div>
// </div>
// ))}
// </div>
)}
</div>
)
}
수정된 코드
import React from "react";
import { useParams } from 'react-router-dom';
import { useQuery } from '@tanstack/react-query';
import axios from 'axios';
import Grid from '@mui/material/Grid';
import HourglassTopIcon from '@mui/icons-material/HourglassTop';
import WarningAmberIcon from '@mui/icons-material/WarningAmber';
import VideoCard from "../components/VideoCard";
const keywordUri = `https://youtube.googleapis.com/youtube/v3/search?key=${process.env.REACT_APP_YOUTUBE_API_KEY}&maxResults=25&part=snippet&q=`;
const popularUri = `https://youtube.googleapis.com/youtube/v3/videos?chart=mostPopular&key=${process.env.REACT_APP_YOUTUBE_API_KEY}&maxResults=25&part=snippet`;
export default function Videos() {
const { keyword } = useParams();
const {isLoading, error, data: videos} = useQuery({
queryKey: ['videos', keyword],
queryFn: async () => {
const uri = keyword ? keywordUri + keyword : popularUri;
return axios
// .get(`/data/${keyword ? 'search' : 'popular'}.json`)
.get(uri)
.then(res => res.data.items);
// .then(res => keyword ? res.data.items.shift() : res.data.items);
},
staleTime: 1000 * 60 * 1, // 1분, ms 단위로 지정할 수 있음
});
return (
<>
{isLoading && <p><HourglassTopIcon /> Loading...</p>}
{error && <p><WarningAmberIcon /> Something is wrong!!!</p>}
{videos && (
<Grid container spacing={1}>
{videos.map(video => (
<Grid item xs={12} sm={6} md={4} lg={3}>
<VideoCard video={video} />
</Grid>
))}
</Grid>
)}
</>
)
}
주석처리 부분은 마지막에 삭제함
주서처리 부분이 youtube.js로 이동 > 한 파일에서 목데이터와 실제 데이터 on/off 기능을 하기 위함
youtube.js로 이동한 부분을 import 받아서 사용 > 코드가 간결해짐
therefore,
3가지 파일에서 각각 on/off 데이터 (목데이터, 실제데이터) 처리 하던 것을 한 곳에서 처리 > 가장 편리함
'React' 카테고리의 다른 글
20240416 맘대로 해봐라! 3차 프로젝트 FlowNary SNS 시작 (0) | 2024.04.16 |
---|---|
20240414 (0) | 2024.04.14 |
20240413 firebase 설치 및 react 웹 구현 (0) | 2024.04.14 |
20240412 React Couple Diary - Personal Project ver.1 (0) | 2024.04.12 |
20240411 React-youtube 학습내용 (0) | 2024.04.11 |