We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
nextLoad(다음페이지)
refresh(새로고침)
parameterChange(페이지 필터 변경)
SSR
STATE === 'INIT'
parameterChange
useEffect
load
useEffect(() => { if(STATE === 'INIT') { load(); } }, [load]) // 초기 렌더링에서도 불러오게 됨, => isInitLoad가 되어있던 상황이면, 중복된 데이터가 들어감 useEffect(() => { load(); }, [load])
cache
redux
mutate
swr
react-query
refresh
useState
front
back
observer
fetch
query
제어 컴포넌트
page
another page(parameter)
queryReset
메타 데이터
isLoadMore
resetData
export default function useListReadPost({ page, pageSize }: ListReadPostUrlQuery) { const dispatch = useDispatch(); const { status, data: result } = useFetchStatus(listReadPost.TYPE); const data = useAppSelector(postSelector.listData); const isInitFetch = useRef(!!data.length); const isLoadingMore = useMemo(() => result?.length, [result?.length]); const resetData = useCallback(() => { dispatch(listReadReset()); }, [dispatch]); const load = useCallback(() => { dispatch(listReadPost.request({ page, pageSize }, { isLoadMore: true })); }, [dispatch, page, pageSize]); useEffect(() => { if (!isInitFetch.current) { load(); } else { isInitFetch.current = false; } }, [load]); return { status, data, isLoadingMore, resetData, load }; }
const handleChangePageSize = useCallback( (value) => { resetData(); setPage(1); setPageSize(value); }, [resetData], );
const handleRefreshPostListData = useCallback(() => { resetData(); if (page === 1 && pageSize === DEFAULT_PAGE_SIZE) { load(); } else { setPage(1); setPageSize(DEFAULT_PAGE_SIZE); } }, [load, page, pageSize, resetData]);
export default function useListReadPost({ mode }: IProps) { const dispatch = useDispatch(); const { status, data: result } = useFetchStatus(listReadPost.TYPE); const filter = useAppSelector(postSelector.listReadFilter); const data = useAppSelector(postSelector.listData); const isInitFetch = useRef(!!data.length); const isMoreRead = useMemo(() => result?.length, [result?.length]); const resetData = useCallback(() => { dispatch(listReadReset()); }, [dispatch]); const filterChange = useCallback( (filters: Partial<IPostState['listReadFilter']>) => { dispatch(listReadFilterChange(filters)); }, [dispatch], ); const refresh = useCallback(() => { resetData(); dispatch(listReadFilterReset()); }, [dispatch, resetData]); const load = useCallback(() => { dispatch( listReadPost.request({ page: filter.page, pageSize: filter.pageSize }, { isLoadMore: mode === 'infinite' }), ); }, [dispatch, filter.page, filter.pageSize, mode]); useEffect(() => { if (!isInitFetch.current) { load(); } else { isInitFetch.current = false; } }, [load]); return { status, data, isMoreRead, filter, resetData, load, filterChange, refresh }; }
const handleChangePageSize = useCallback( (value) => { resetData(); filterChange({ page: 1, pageSize: value, }); }, [filterChange, resetData], );
const ListReadView = () => { const {status, data: postListData, resetData, isMoreRead, filter, filterChange, refresh} = useListReadPost({ mode: 'infinite', }); const {page, pageSize} = filter; const nextLoad = useCallback(() => { if (isMoreRead) { filterChange({ page: page + 1, }); } }, [filterChange, isMoreRead, page]); const handleChangePageSize = useCallback( (value) => { resetData(); filterChange({ page: 1, pageSize: value, }); }, [filterChange, resetData], ); useEffect(() => { const onScroll = throttle(function () { if (window.scrollY + document.documentElement.clientHeight > document.documentElement.scrollHeight - 300) { nextLoad(); } }, 300); window.addEventListener('scroll', onScroll); return () => { window.removeEventListener('scroll', onScroll); }; }, [nextLoad]); return ( <> {/* ... */} </> ); }
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Infinite Scroll
주요 Action
nextLoad(다음페이지)
=> isLoadingMore[check] => loadrefresh(새로고침)
=> data[empty], query[reset] => loadparameterChange(페이지 필터 변경)
=> parameter[pageSize, keyword....] => load고려해야할 사항
SSR
STATE === 'INIT'
상황이면 로드 하면된다고 생각했지만,parameterChange
할 때useEffect
로load
하도록 하기 때문에, 해당 STATE 비교로는 부족해 보인다.cache
redux
에서 캐시 (key[parameter]-value[listData]) 형태로 저장을 할까 생각해 봄mutate
처럼 데이터를 다시 로드 해야하거나, 추가된 데이터를 어디 key로 보관 되어야 할지에대해 고민이 커짐redux
에서 캐시 까지 더 하는건 너무 오버 스택 같다고 생각swr
,react-query
를 적용해보는게 좋을거 같다고 판단.refresh
refresh
할 때, 개별useState
를 관리하게 되면,load
가 반응이 일어나지 않는다.isLoadingMore
front
=> result.length === pageSizeback
=> get parameter(ex. nextPage)load
observer
=> parameter[change] => isInitLoad?(중복된 api call 막기) => loadfetch
=> parameter 바뀔때마다, fetchload
해야하는 함수마다query
를 이용하는제어 컴포넌트
의 state와 싱크를 맞춰주는것을 신경써야 한다.observer
형태가 나올 수 있다.(ex. nextLoad)parameterChange
page
=> page[n] => loadanother page(parameter)
=> resetData, page[1], parameter[pageSize, keyword....] => loadrefresh
queryReset
=> resetData, parameter[INIT] => loadresetData
메타 데이터
로isLoadMore
판단하여 list를 이어 붙일지 판단한다.resetData
를 호출하고load
가 호출되도록 하면 된다.페이지 네이션 전략
1. state 전략
useHooks
parameterChange
refresh
observer
형태라면, resetData만 될것이고, queryReset하더라도 load가 되지 않을것이다.2. redux replace 전략
useHooks
parameterChange
refresh
component 전체 코드
The text was updated successfully, but these errors were encountered: