React ํŽ˜์ด์ง€ ์ด๋™ ์‹œ Scroll ๋งจ ์œ„๋กœ ์˜ค๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•

2023. 3. 5. 17:35ใ†portfolio issue

ํฌํŠธํด๋ฆฌ์˜ค ์ž‘์—…ํ•˜๋‹ค๊ฐ€ scroll ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌ! 

 

๋ฐ”๋กœ ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์Šคํฌ๋กค ์œ„์น˜๊ฐ€ ๊ทธ ์ „ ํŽ˜์ด์ง€์˜ ์œ„์น˜์— ์žˆ๋‹ค๋Š” ๊ฒƒ SPA๋กœ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋‹ˆ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์†Œํ•œ ๋ฌธ์ œ!

๊ตฌ๊ธ€๋งํ–ˆ๋”๋‹ˆ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ๋‚˜์™”๋‹ค 

 

import { useEffect } from "react";
import { useLocation } from "react-router-dom";

export default function ScrollToTop() {
  const { pathname } = useLocation();

  useEffect(() => {
    window.scrollTo(0, 0);
  }, [pathname]);

  return null;
}

pathname์ด ๋ณ€๊ฒฝ๋  ๋•Œ scrollTop๊ฐ’์ด 0์œผ๋กœ ๊ฐ€๋„๋ก ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  Router ์•ˆ์— ์‹ฌ์–ด์ฃผ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค

scrollTop.js ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ค„๊นŒ ํ•˜๋‹ค๊ฐ€ ๊ตณ์ด ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ ์‹ถ์–ด์„œ index.js ์•ˆ์— ๋งŒ๋“ค์—ˆ๋‹ค

 

import React, { useEffect } from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { HashRouter, useLocation } from 'react-router-dom';
import { Provider } from 'react-redux';
import { configureStore } from '@reduxjs/toolkit';
import youtubeReducer from './redux/youtubeSlice';
import flickrReducer from './redux/flickrSlice';
import menuReducer from './redux/menuSlice';

const store = configureStore({
	reducer: {
		youtube: youtubeReducer,
		flickr: flickrReducer,
		menu: menuReducer,
	},
});

export default function ScrollToTop() {
	const { pathname } = useLocation();

	useEffect(() => {
		window.scrollTo(0, 0);
	}, [pathname]);

	return null;
}

ReactDOM.render(
	<React.StrictMode>
		<HashRouter>
			<Provider store={store}>
				<ScrollToTop />
				<App />
			</Provider>
		</HashRouter>
	</React.StrictMode>,
	document.getElementById('root')
);

Router ์•ˆ์— ScrollToTop ์„ ์„ ์–ธํ•ด์ฃผ๋ฉด ๋! 

 

ํŽ˜์ด์ง€ ์ด๋™ ์‹œ scroll์ด ๋งจ ์œ„๋กœ ์˜ค๋Š” ๊ฒƒ ํ™•์ธ!