Traview
전에 없던 한국
업데이트 내역
-
0.0.1
- 개발 환경 구축
-
1.0.0
- 구글 로그인
- 사진 업로드
- 댓글 작성
- 지역 검색
- 분위기 분류
-
1.0.1
- 팔로우
- 신기해요
- 찜목록
- 유저 페이지
- 프로필 편집
- 팔로워 Pick
국내 여행 사진 소셜 리뷰 서비스
전에 없던 한국
0.0.1
1.0.0
1.0.1
유저들이 내가 쓴글, 회원 정보를 볼 수 있는 마이페이지를 제작한다.
작업 시작을 위한 프로젝트 세팅
살짝 둘러보고 있는 중인데요, 그때 그때 간단하게 코드리뷰 이슈 올려보려고 합니다.
'내가 리뷰해주는대로 바꿔라!'는건 절대 아니구요 ^^;; 자유롭게 의견 교환 되었으면 좋겠습니다!
(근데 Label에 붙어있는 아이콘은 어디서 가져온건가요? ㅋㅋ)
props로 일일이 넘겨주기보다는 data
자체를 넘기고, 받는 쪽에서 destructuring하면 어떨까요?
const BestPictures = ({ data }) => {
const {num,interest, like, user, username, imagePath, location} = data;
...
}
...
<BestPicture data={data} />
...
props의 상태에 따라 다른 View를 보여줘야 하는 상황 같은데요! 가독성이 조금 더 고려되면 좋을 것 같습니다.
아래와 같은 구조는 어떤가요?
(Props 네이밍도 조금 더 명시적으로 바꾸면 좋을 것 같습니다! 예를 들면 pictureNo
라던가 ... )
const BestPicture = () => {
return 윗부분;
}
const Picture = () => {
return 아랫부분;
}
export default const BestPictures = ({ num }) => {
const isFirstPicture = num === 0;
return isFirstPicture ? <BestPicture/> : <Picture />;
}
최신, 팔로워, 신기한 사진 분류에 따라 사진을 볼 수 있게한다.
서비스를 위한 메인화면의 배너를 제작한다
현재 구체적으로 정해지지 않음
제목 및 내용 업로드 기능 구현
신기해요 기능 및 별점 (5단계) 기능 구현
마이페이지 내 게시글 삭제 및 수정 기능 구현
게시글 내 댓글 기능 구현
지역 선택 및 분위기 선택 기능 구현
사진 업로드 기능 구현
로그인, 회원가입 기능 구현
마이페이지 내 개인정보 수정, 게시글 삭제 및 수정 기능 구현
관리자 기능 구현(게시글 및 댓글 삭제 기능)
유저 간 팔로우 기능 구현
검색 후 결과에 따른 사진 분류를 보여준다.
이렇게 반복적으로 같은 엘리먼트가 반복될 경우 데이터를 배열로 정의하고 map
을 쓰면 조금 더 가독성이 좋아질 수 있을 것 같아요~
const cityMenuList = [
{ name : '서울', to : '/area/seoul' },
{ name : '부산', to : '/area/busan' },
{ name : '대구', to : '/area/daegu' },
.... (다 적기는 힘드네요 ㅠㅠ)
]
export default () => {
return (
<Container>
<Title to={'/'}>Traview</Title>
<NavContainer>
<AreaContainer>
{cityMenuList.map(item => (
<ListItem>
<AreaLink to={item.to}>{item.name}</AreaLink>
</ListItem>
)}
</AreaContainer>
</NavContainer>
...
)
}
apiRoot
나 accessKey
는 이 컴포넌트가 아니더라도 여러군데서 사용될 가능성이 있는 것 같은데요, 그렇다면 지역 변수로 선언하기보다는 공통적으로 사용할 수 있는 상수 파일을 따로 만들어서 import하여 사용하는게 좋을 것 같습니다. 그렇게 했을 때 장점은
따라서 아래와 같은 구조는 어떨지 고려해보세요 :)
// src/const/apiConst.js
export const API_ROOT = 'https://api.unsplash.com';
export const ACCESS_KEY = process.env.REACT_APP_ACCESSKEY;
// src/components/MainArea/MainArea.js
import { API_ROOT, ACCESS_KEY } from '../../../const/apiConst.js'
함수를 컴포넌트 내부에서 정의하면 rerender될 때 마다 함수가 새로 정의됩니다.
물론 함수를 정의하는 것이 리소스를 많이 잡아먹지는 않기 때문에 당장 성능상으로 문제가 되지는 않겠지만요,, 때로는 치명적일수도 있습니다.
이럴때는 컴포넌트 바깥에서 함수를 정의하는 간단한 방법으로 회피할 수 있으니 습관화하면 좋을 것 같아요 :)
이런 문제를 해결하기 위해 React에서는
useCallback
이라는 훅을 제공해주고 있습니다. 나중에 한번 찾아보셔요 ㅎㅎ
const fetchImages = (images, setImages) => {
const apiRoot = 'https://api.unsplash.com';
const accessKey = process.env.REACT_APP_ACCESSKEY;
axios
.get(`${apiRoot}/photos/random?client_id=${accessKey}&count=15`)
.then((res) => setImages([...images, ...res.data]));
};
const MainArea = ( ) => {
const [images, setImages] = useState([]);
useEffect(() => {
fetchImages(images, setImages);
}, []);
}
Axios를 이용해 API를 호출할 때 async&await를 사용해보는건 어떨까요? 물론 지금 방식으로도 잘 동작하겠지만, 코드가 좀 더 깔끔해질거에요!
//AS-IS
const fetchImages = () => {
const apiRoot = 'https://api.unsplash.com';
const accessKey = process.env.REACT_APP_ACCESSKEY;
axios
.get(`${apiRoot}/photos/random?client_id=${accessKey}&count=15`)
.then((res) => setImages([...images, ...res.data]));
};
//TO-BE
const fetchImages = async () => {
const apiRoot = 'https://api.unsplash.com';
const accessKey = process.env.REACT_APP_ACCESSKEY;
const result = await axios.get(`${apiRoot}/photos/random?client_id=${accessKey}&count=15`);
setImages([...images, ...result.data]));
};
Readme에 애플리케이션에 대한 설명과 정보를 추가한다.
유저들이 회원가입 할 수 있는 페이지를 제작한다.
내 글을 볼 수 있는 페이지를 제작한다.
사진 업로드를 위한 페이지를 제작한다.
사진 클릭시 유저가 볼 수 있는 상세 페이지를 제작한다.
회원가입을 위한 페이지를 제작한다.
회의 후 디자인 수정에 따른 작업
서비스를 위한 메인화면을 제작한다.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.