-
Notifications
You must be signed in to change notification settings - Fork 79
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[박지민] sprint10 #657
The head ref may contain hidden characters: "Next.js-\uBC15\uC9C0\uBBFC-sprint10"
[박지민] sprint10 #657
Changes from all commits
b43d0b9
b6e9d3d
1b5337d
a6bdb54
ed3dda9
436428b
af90d8e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
{ | ||
"presets": ["next/babel"], | ||
"plugins": [["styled-components", { "ssr": true }]] | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
import Logo from "@/public/logo.svg"; | ||
import Link from "next/link"; | ||
import { useRouter } from "next/router"; | ||
import styled from "styled-components"; | ||
import profileImg from "@/public/btn_visibility.svg"; | ||
import Image from "next/image"; | ||
|
||
const GlobalHeader = styled.header` | ||
display: flex; | ||
justify-content: space-between; | ||
align-items: center; | ||
`; | ||
|
||
const HeaderLeft = styled.div` | ||
display: flex; | ||
align-items: center; | ||
`; | ||
|
||
const HeaderLogo = styled(Link)` | ||
margin-right: 16px; | ||
|
||
@media (min-width: 768px) { | ||
margin-right: 35px; | ||
} | ||
|
||
@media (min-width: 1280px) { | ||
margin-right: 47px; | ||
} | ||
`; | ||
|
||
const NavList = styled.ul` | ||
display: flex; | ||
list-style: none; | ||
gap: 6px; | ||
font-weight: bold; | ||
font-size: 16px; | ||
color: var(--gray-600); | ||
|
||
@media (min-width: 768px) { | ||
gap: 36px; | ||
font-size: 18px; | ||
} | ||
`; | ||
|
||
const NavItem = styled.li` | ||
a:hover { | ||
color: var(--blue); | ||
} | ||
`; | ||
const HeaderRight = styled.div` | ||
margin-right: 16px; | ||
`; | ||
function getLinkStyle(isActive: boolean) { | ||
return { color: isActive ? "var(--blue)" : undefined }; | ||
} | ||
Comment on lines
+53
to
+55
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. style을 적용하기 위해 공통으로 사용될 함수를 잘 만들어주셨네요! |
||
|
||
export default function Header() { | ||
const { pathname } = useRouter(); | ||
|
||
return ( | ||
<GlobalHeader> | ||
<HeaderLeft> | ||
<HeaderLogo href="/" aria-label="홈으로 이동"> | ||
<Logo alt="판다마켓 로고" width="153" /> | ||
</HeaderLogo> | ||
|
||
<nav> | ||
<NavList> | ||
<NavItem> | ||
<Link href="/boards" style={getLinkStyle(pathname === "/boards")}> | ||
자유게시판 | ||
</Link> | ||
</NavItem> | ||
<NavItem> | ||
<Link | ||
href="/items" | ||
style={getLinkStyle( | ||
pathname.includes("/items") || pathname === "/additem" | ||
)} | ||
> | ||
중고마켓 | ||
</Link> | ||
</NavItem> | ||
</NavList> | ||
</nav> | ||
</HeaderLeft> | ||
<HeaderRight> | ||
<Image src={profileImg} alt="프로필" width={50} /> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. next/image는 크기값을 줘야하기 때문에 width와 height 둘 다 작성해주시는 것을 추천드립니다. |
||
</HeaderRight> | ||
</GlobalHeader> | ||
); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import { useEffect, useState } from "react"; | ||
import Image from "next/image"; | ||
|
||
export default function AddImage() { | ||
const [imgSrc, setimgSrc] = useState<string>("/images/default-image.png"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 상태를 문자열로 초기화 해주시는 경우, 타입추론에 의해서 상태가 string으로 추론 되기 때문에 useState에 string 타입을 명시해주시지 않아도 괜찮습니다! |
||
|
||
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { | ||
const file = e.target.files?.[0]; | ||
if (!file) return; | ||
const fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = (e) => { | ||
if (typeof e.target?.result === "string") { | ||
setimgSrc(e.target?.result); | ||
} | ||
}; | ||
}; | ||
|
||
useEffect(() => { | ||
console.log(imgSrc); | ||
}, [imgSrc]); | ||
Comment on lines
+19
to
+21
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. console.log는 제거해주시는 것을 추천드립니다! |
||
|
||
return ( | ||
<div> | ||
<h2>이미지</h2> | ||
<input type="file" accept="image/*" onChange={handleChange} /> | ||
<Image src={imgSrc} alt="" width={200} height={150} priority /> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. priority 옵션 잘 사용해주셨네요. |
||
</div> | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
styled-component는 컴포넌트 하단에 작성해주시는 것이 좋습니다. styled-component가 많아 질수록 컴포넌트 코드가 하단에 배치되서 찾아가기 힘들어지기 때문입니다!