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์ด ๋งจ ์๋ก ์ค๋ ๊ฒ ํ์ธ!