tkdals9048
@sangmin1242
Reviews Written
4
Average Rating
5.0
Posts
Q&A
models ์ต์ ๋ฌธ๋ฒ์ผ๋ก ๋ณ๊ฒฝ ํ
์ด๋ฐ.. import ๋ฅผ ์๋ชปํด์ค๊ณ ์์์ด์ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค!
- 0
- 2
- 282
Q&A
Router ๋ฅผ ์ฌ์ฉํด SSR ํ์ด์ง ์ด๋ํ ๋ ์ง๋ฌธ์ ๋๋ค!
๊ฐ์ฌํฉ๋๋ค!
- 0
- 2
- 235
Q&A
Avatar ํด๋ฆญ์ /user/1 ๋ก ์ด๋ ํ ๋
๋ต ํ์ด์ง ์ฃผ์๋ ๋ณ๊ฒฝ ๋๊ณ , getServerSideProps ๋ด๋ถ๋ ์คํ์ด ๋๋๋ฐ ๋ก๋ฉ๋ฐ๋ง ์๋๋๊ฑฐ๋ฉด ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ์ ํ ํ ๋ ๋ญ๊ฐ ๋น ํธ๋ ธ๋ ๋ณด๋ค์ ๊ฐ์ ๋ค์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค! ๋ต๋ณ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
- 0
- 11
- 555
Q&A
Avatar ํด๋ฆญ์ /user/1 ๋ก ์ด๋ ํ ๋
๋ฆฌ๋์์ชฝ๋ ๋ค์ ์ฒดํฌํด๋ด์ผ๊ฒ ๋ค์ ใ ๋ต ๋ง์์ ์ ๋ก์ด๋ ์ฝ๋ ch6 ํด๋์ front ์คํ์์ผ์ ๋น๊ตํด๋ดค๋๋ฐ ์๋ฐํ๋ฅผ ํด๋ฆญํ์ ๋ ๋ค๋ฅด๊ฒ ์๋ํด์ ์ ๋ก์ด๋ ์ฝ๋๋ ์๋ฐํ ํด๋ฆญ์ (์ฌ์ง) ์ ์ฝ๋ ์๋ฐํ ํด๋ฆญ์ (์ฌ์ง) ์ ์ฝ๋์์ ์๋ฐํ๋ฅผ ํด๋ฆญํ์ ๋ ๋ ๋ก๋ฉ๋ฐ๊ฐ ์๋์์ ์ด๋ถ๋ถ์ SSR์ด ์ ๋๋ก ๋๊ณ ์์ง ์๋ค๊ณ ๋ด์ผํ๋๊ฑด๊ฐ์?
- 0
- 11
- 555
Q&A
Avatar ํด๋ฆญ์ /user/1 ๋ก ์ด๋ ํ ๋
import axios from 'axios'; import React, { useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { END } from 'redux-saga'; import { useRouter } from 'next/router'; import Head from 'next/head'; import { Card, Avatar } from 'antd'; import { LOAD_USER_REQUEST, LOAD_MY_INFO_REQUEST } from '../../reducers/user'; import { LOAD_USER_POSTS_REQUEST } from '../../reducers/post'; import AppLayout from '../../components/AppLayout'; import PostCard from '../../components/PostCard'; import wrapper from '../../store/configureStore'; const User = () => { const dispatch = useDispatch(); const router = useRouter(); const { id } = router.query; const { hasMorePosts, loadPostLoading, mainPosts, retweetError, } = useSelector((state) => state.post); const { userInfo } = useSelector((state) => state.user); useEffect(() => { if (retweetError) { alert(retweetError); } }, [retweetError]); useEffect(() => { function onScroll() { if (window.pageYOffset + document.documentElement.clientHeight > document.documentElement.scrollHeight - 300) { if (hasMorePosts && !loadPostLoading) { const lastId = mainPosts[mainPosts.length - 1]?.id; dispatch({ type: LOAD_USER_POSTS_REQUEST, data: id, lastId, }); } } } window.addEventListener('scroll', onScroll); return () => { window.removeEventListener('scroll', onScroll); }; }, [hasMorePosts, loadPostLoading, id, mainPosts]); return ( AppLayout> Head> title>{userInfo.nickname}๋์ ๊ธtitle> meta name="description" content={`${userInfo.nickname}๋์ ๊ฒ์๊ธ`} /> meta property="og:title" content={`${userInfo.nickname}๋์ ๊ฒ์๊ธ`} /> meta property="og:description" content={`${userInfo.nickname}๋์ ๊ฒ์๊ธ`} /> meta property="og:image" content="https://nodebird.com/favicon.ico" /> meta property="og:url" content={`https://nodebird.com/user/${id}`} /> Head> {userInfo ? ( Card actions={[ div key="twit"> ์งน์งน br /> {userInfo.Posts} div>, div key="following"> ํ๋ก์ br /> {userInfo.Followings} div>, div key="follower"> ํ๋ก์ br /> {userInfo.Followers} div>, ]} > Card.Meta avatar={Avatar>{userInfo.nickname[0]}Avatar>} title={userInfo.nickname} /> Card> ) : null} {mainPosts.map((post) => PostCard key={post.id} post={post} />)} AppLayout> ); }; export const getServerSideProps = wrapper.getServerSideProps(async (context) => { console.log('getServerSideProps Start'); const cookie = context.req ? context.req.headers.cookie : ''; axios.defaults.headers.Cookie = ''; if (context.req && cookie) { axios.defaults.headers.Cookie = cookie; } context.store.dispatch({ type: LOAD_MY_INFO_REQUEST, }); context.store.dispatch({ type: LOAD_USER_POSTS_REQUEST, data: context.params.id, }); context.store.dispatch({ type: LOAD_USER_REQUEST, data: context.params.id, }); context.store.dispatch(END); console.log('getServerSideProps End'); await context.store.sagaTask.toPromise(); }); export default User; ์ ๋๋ค!
- 0
- 11
- 555
Q&A
Avatar ํด๋ฆญ์ /user/1 ๋ก ์ด๋ ํ ๋
๋ต ๋ค์ ํ์ธํ๋๋ฐ ํ๋ก ํธ ์๋ฒ ํฐ๋ฏธ๋์๋ dispatch๊ฐ ์ ์์ ์ผ๋ก SUCCESS ๊น์ง ์๋ํ๋๋ฐ ๋ฆฌ๋์ค ๋ฐ๋ธํด๋ก ํ์ธํด๋ณด๋ __NEXT_REDUX_WRAPPER_HYDRATE__ ๊ฐ ์คํ๋์ง ์๊ณ ์ ์ ๊ฐ์ ์๋ฌ๊ฐ ๋์ ----------- ์ ๋ก์ด๋ ๊นํ ์์ค๋ฅผ ๋ด๋ ค๋ฐ์ ์คํํ๋ฉด์ ๋น๊ตํด๋ดค๋๋ฐ ์ ๋ก์ด๋ ์ ์๋ฐํ ํด๋ฆญ์ ๋ฆฌํ๋ ์ฌ ๋๋ฉด์ ํ์ด์ง ์ด๋ํ๋๋ฐ ์ ๊ฐ ์์ฑํ ์ฝ๋๋ ๋ฆฌํ๋ ์ฌ ๋์ง ์์์ ใ
- 0
- 11
- 555
Q&A
์ธํผ๋ํธ ์คํฌ๋กค๋ง ๋ฆฌํ์คํธ
ํ์ฌ๋ takeLatest ์ํฉ์ด์์ (throttle ๋ก ํ์ ๊ฒฝ์ฐ 2๋ฒ SUCCESS๊ฐ ์ผ์ด๋์) ๊ทธ๋ผ ์ผ๋จ ์งํ ํ๊ณ ์๋ฃ ํ ์ฒ์๋ถํฐ ๋ค์ํ๋ฒ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค! ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค!
- 2
- 4
- 281
Q&A
์ธํผ๋ํธ ์คํฌ๋กค๋ง ๋ฆฌํ์คํธ
(์ฌ์ง) ๋งค๋ฒ 2๋ฒ์์ฒญ ๊ฐ๋๊ฒ์ ์๋๊ณ ์ ์ด๋ฏธ์ง์ฒ๋ผ 1๋ฒ ์์ฒญ๊ฐ๋ ๊ฒฝ์ฐ๋ ์๊ณ 2๋ฒ ์์ฒญ๊ฐ๋ ๊ฒฝ์ฐ๋ ์๊ณ ์ด๋ฐ ์ํฉ์ธ๋ฐ์ ใ /reducers/post.js /sagas/post.js /pages/index.js ์ ์ธ๊ฐ ํ์ผ์ ํ์๋ ๊นํ์ ์ฌ๋ผ๊ฐ์๋ ์๋ณธ ์์ค์ ๋์ผํ๊ฒ ์์ ํด๋ ๊ฐ์ ํ์์ด ์ผ์ด๋๋ ์ค์ธ๋ฐ.. ํน์ ์ด๋๋ถ๋ถ์ด ๋ฌธ์ ์ธ์ง ์ ์ถ๊ฐ ๊ฐ๋ฅํ ๊น์? reducer ์ LOAD_POST_REQUEST -> draft.loadPostLoading = true ๊ฐ ์ ์ ์๋๋๋๋ฐ ์ ๋๋ฒ ์คํ๋๋ ๊ฒ์ธ์ง ใ
- 2
- 4
- 281
Q&A
passport.authenticate (req, res, next)
๊ฐ์ฌํฉ๋๋ค!
- 1
- 2
- 386
Q&A
TicTacToe.jsx reducer ๋ถ๋ถ ์ง๋ฌธ์ ๋๋ค
๊ฐ์ฌํฉ๋๋ค!
- 1
- 2
- 206




