π€ μμ§log π€
[REACT] Naver μν κ²μ λ³Έλ¬Έ
π£ 1. Router.js μμ±
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import Main from './components/pages/Main'
import Movie from './components/pages/Movie'
import Book from './components/pages/Book'
const Router = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Main />} />
<Route path="/movie" element={<Movie />} />
<Route path="/book" element={<Book />} />
</Routes>
</BrowserRouter>
)
}
export default Router
π£ 2. Main.jsx
import { Link } from 'react-router-dom'
import styled from 'styled-components'
const Main = () => {
return (
<Wrapper>
<PageTitle>μν π¬ & μ±
π κ²μ</PageTitle>
<Link to="/Movie">
<Button>μν π¬</Button>
</Link>
<Link to="/Book">
<Button>μ±
π</Button>
</Link>
</Wrapper>
)
}
const Wrapper = styled.div`
padding: 15px;
`
const PageTitle = styled.h2`
text-align: center;
`
const Button = styled.button`
width: 100%;
margin: 10px 0;
height: 100px;
font-size: 24px;
border: none;
border-radius: 4px;
`
export default Main
π£ 3. Movie.jsx
import { useState } from 'react'
import styled from 'styled-components'
import { getMovieList } from '../../apis'
import MovieList from '../organisms/MovieList'
const Movie = () => {
const [text, setText] = useState('')
const [movieList, setMovieList] = useState([])
const handleSubmit = async (e) => {
e.preventDefault()
const { items } = await getMovieList({ query: text })
setMovieList(items)
}
return (
<Wrapper>
<PageTitle>π¬ Movie π¬</PageTitle>
<Form onSubmit={handleSubmit}>
<InputText
placeholder="search"
value={text}
onChange={(e) => setText(e.target.value)}
/>
<BtnSubmit>κ²μ</BtnSubmit>
</Form>
<MovieList data={movieList} />
</Wrapper>
)
}
const Wrapper = styled.div``
const PageTitle = styled.h2``
const Form = styled.form`
display: flex;
padding: 15px;
`
const InputText = styled.input`
flex: 1;
margin-right: 15px;
`
const BtnSubmit = styled.button``
export default Movie
π£ 3-1. MovieList.jsx
import styled from 'styled-components'
const MovieList = ({ data }) => {
return (
<List>
{data.map(({ image, title }) => (
<Item key={image}>
<Thumbnail src={image} />
<Title dangerouslySetInnerHTML={{ __html: title }} />
</Item>
))}
</List>
)
}
const List = styled.div`
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: 10px;
padding: 15px;
`
const Item = styled.div``
const Thumbnail = styled.img`
width: 100%;
`
const Title = styled.span``
export default MovieList
π£ 3-2. src>apis>index.js νμΌμμ±
import axios from 'axios'
export const getMovieList = async (params) => {
const { data } = await axios.get('/v1/search/movie.json', {
headers: {
'X-Naver-Client-Id': 'ID',
'X-Naver-Client-Secret': 'PW',
},
params,
})
return data
}
π μλ²λ₯Ό λ§λ€μ μμΌλ package.json μμ
"proxy": "https://openapi.naver.com" μΆκ°ν΄μ£ΌκΈ°
proxy λ κ°λ°κ³Όμ μμλ§ μ¬μ©κ°λ₯. λ°°ν¬ ν λλ μλ² νμν¨.
(μ¦, μ°μ΅λλ§ μ¬μ©ν μ μμ) π
π‘ κ²μμ κ΅κ° μ μ₯λ₯΄ λ£κΈ°
π£ 1. src>datas>index.js νμΌ μμ±
export const countryList = [
{
code: 'KR',
name: 'νκ΅',
},
{
code: 'JP',
name: 'μΌλ³Έ',
},
{
code: 'US',
name: 'λ―Έκ΅',
},
{
code: 'HK',
name: 'ν콩',
},
{
code: 'GB',
name: 'μκ΅',
},
{
code: 'FR',
name: 'νλμ€',
},
{
code: 'ETC',
name: 'κΈ°ν',
},
]
export const genreList = [
{
code: '1',
name: 'λλΌλ§',
},
{
code: '2',
name: 'ννμ§',
},
{
code: '3',
name: '곡ν¬',
},
{
code: '4',
name: 'λ‘맨μ€',
},
{
code: '5',
name: 'λ―Έμ€ν°λ¦¬',
},
{
code: '6',
name: 'λμλ₯΄',
},
{
code: '7',
name: 'μ λλ©μ΄μ
',
},
]
π£ 2. Movie.jsx
import { useEffect, useState } from 'react'
import styled from 'styled-components'
import { getMovieList } from '../../apis'
import MovieList from '../organisms/MovieList'
πimport { countryList, genreList } from '../../datas'
const Movie = () => {
const [text, setText] = useState('')
πconst [country, setCountry] = useState('ALL')
πconst [genre, setGenre] = useState('ALL')
const [movieList, setMovieList] = useState([])
πuseEffect(() => {
searchMovieList()
}, [country, genre])
const handleSubmit = async (e) => {
e.preventDefault()
searchMovieList()
}
πconst searchMovieList = async () => {
if (text === '') return
// const params = { query: text, country }
// if(country === "ALL") delete params.country;
const params = { query: text }
if (country !== 'ALL') params.country = country
if (genre !== 'ALL') params.genre = genre
const { items } = await getMovieList(params)
setMovieList(items)
}
return (
<Wrapper>
<PageTitle>π¬ Movie π¬</PageTitle>
<Form onSubmit={handleSubmit}>
π <select onChange={(e) => setCountry(e.target.value)} value={country}>
<option value="ALL">μ 체</option>
{countryList.map(({ code, name }) => (
<option value={code} key={code}>
{name}
</option>
))}
</select>
π <select onChange={(e) => setGenre(e.target.value)} value={genre}>
<option value="ALL">μ 체</option>
{genreList.map(({ code, name }) => (
<option value={code} key={code}>
{name}
</option>
))}
</select>
<InputText
placeholder="search"
onChange={(e) => setText(e.target.value)}
/>
<BtnSubmit>κ²μ</BtnSubmit>
</Form>
<MovieList data={movieList} />
</Wrapper>
)
}
export default Movie
728x90
'π React' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[REACT] Instagram _ Log-In (0) | 2022.10.06 |
---|---|
[REACT] Naver μ± κ²μ (0) | 2022.10.06 |
[REACT] Modal (0) | 2022.10.06 |
[REACT] DropDown (0) | 2022.10.06 |
[REACT] Accordion (0) | 2022.10.06 |