페이지 이동시에 음악 재생 유지하기

페이지 이동시에도 음악을 끊지 않고 재생하는 방법을 설명합니다.

# React
title

준비

여기서는 SPA 라이브러리 중 하나인 리액트 React 를 이용하여 페이지 이동시에 음악을 끊지 않고 재생하는 방법을 설명합니다. 먼저 디렉토리를 하나 생성한 뒤에 리액트 개발 환경을 구축합니다.

npx create-react-app .

예제에 필요한 패키지를 추가합니다.

npm i react-router-dom

실행

npm start





페이지 구축

src 폴더 하위에 아래 폴더와 파일들을 생성합니다.

  • Document.js

  • pages/Home.jsx

  • pages/Author.jsx

  • components/Layout.jsx

  • components/Menubar.jsx


파일들을 열어 아래와 같이 작성합니다.

Document.js

import React from 'react';
import App from './App';
import { BrowserRouter } from 'react-router-dom';

const Document = () => {
  return (
    <BrowserRouter>
      <App />
    </BrowserRouter>
  );
};

export default Document;

URL 구성을 위해 App.js 를 가져와 BrowserRouter 로 감싸주는 역할을 합니다.


index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import reportWebVitals from './reportWebVitals';
import Document from './Document';

ReactDOM.render(<Document />, document.getElementById('root'));

reportWebVitals();

작성한 Document.js 를 가져와 렌더링합니다.


components/Menubar.jsx

import React from 'react';
import { Link } from 'react-router-dom';

const Menubar = () => {
  return (
    <div>
      <ul>
        <li>
          <Link to='/'>Home</Link>
        </li>
        <li>
          <Link to='/author'>Author</Link>
        </li>
      </ul>
    </div>
  );
};

export default Menubar;

components/Layout.jsx

import React from 'react';
import Menubar from './Menubar';

const Layout = ({ children }) => {
  return (
    <div>
      <Menubar />
      {children}
    </div>
  );
};

export default Layout;

Home.jsx

import React from 'react';
import Layout from '../components/Layout';

const Home = () => {
  return (
    <Layout>
      <h1>Home</h1>
    </Layout>
  )
};

export default Home;

Author.jsx

import React from 'react';
import Layout from '../components/Layout';

const Author = () => {
  return (
    <Layout>
      <h1>Author</h1>
    </Layout>
  )
};

export default Author;

App.js

import './App.css';
import { Route } from 'react-router-dom'; 
import Home from './pages/Home';
import Author from './pages/Author';

function App() {
  return (
    <div className="App">
      <Route exact path='/' component={Home} />
      <Route exact path='/author' component={Author} />
    </div>
  );
}

export default App;

URL path 와 page 를 지정합니다.





음악 재생

먼저 간단하게 audio 태그를 App.js 에 작성하고 재생해보겠습니다.

function App() {
  return (
    <div className="App">
      <Route exact path='/' component={Home} />
      <Route exact path='/author' component={Author} />
      <audio
        src='https://docs.google.com/uc?export=open&id=14JlzHWUE2TqAsN237ft43SOw02xDPori'
        autoPlay={true}>
      </audio>
    </div>
  );
}

페이지에 접속하면 자동으로 음악이 재생되고 Menubar 를 이용하여 페이지 이동시에 음악이 종료되지 않는 것을 확인할 수 있습니다.





활용

조금 더 유용하게 사용하도록 Context 를 이용할 수 있습니다.

src 폴더 하위에 파일을 생성하고 작성합니다.

store/index.jsx

import React, { useState } from 'react';

export const Context = React.createContext({});

const Container = (props) => {

  const [isPlay, setIsPlay] = useState(false);

  return (
    <Context.Provider value={{ isPlay, setIsPlay }}>
      {props.children}
      {isPlay && (
        <audio
          src='https://docs.google.com/uc?export=open&id=14JlzHWUE2TqAsN237ft43SOw02xDPori'
          autoPlay={true}>
        </audio>
      )}
    </Context.Provider>
  );
};

export default Container;

아래와 같이 파일을 수정합니다.

Document.js

import React from 'react';
import App from './App';
import { BrowserRouter } from 'react-router-dom';
import Container from './store/index';

const Document = () => {
  return (
    <BrowserRouter>
      <Container>
        <App />
      </Container>
    </BrowserRouter>
  );
};

export default Document;

components/Menubar.jsx

import React, { useContext, useCallback } from 'react';
import { Link } from 'react-router-dom';
import { Context } from '../store/index';

const Menubar = () => {

  const { isPlay, setIsPlay } = useContext(Context);

  const onClickPlayMusicButton = useCallback(() => {
    setIsPlay(!isPlay);
  }, [isPlay, setIsPlay]);

  return (
    <div>
      <ul>
        <li>
          <Link to='/'>Home</Link>
        </li>
        <li>
          <Link to='/author'>Author</Link>
        </li>
        <button onClick={onClickPlayMusicButton}>{isPlay ? '⏹' : '▶'}</button>
      </ul>
    </div>
  );
};

export default Menubar;

Menubar 의 버튼을 클릭하면 음악 재생 여부 조절이 가능합니다.

이외에도 리액트에서 상태가 유지되는 점과 원리를 파악하면 활용할 수 있는 기능이 많습니다.





저장소

전체 소스코드는 아래 레포지토리에서 확인이 가능합니다.

https://github.com/KHJcode/keep-music-play-move-pages-blog-example



읽어주셔서 감사합니다.

😍  댓글