blog-hero-img

React RouterやTanStackを使わないページ移動の実装方法(Code-based routing)

pen-icon2026.2.18

この記事は約2分で読めます

Profile Pic

この記事の筆者:三好アキ


🟢 専門用語なしでプログラミングを教えるメソッドに定評があり、1200人以上のビギナーを、最新のフロントエンド開発入門に成功させる。
🟢『はじめてつくるReactアプリ with TypeScript』、『動かして学ぶ!Next.js/React開発入門(翔泳社/*韓国でも出版)』著者。


▼ Amazon著者ページはこちら
amazon.co.jp/stores/author/B099Z51QF2



パッケージなしでページを遷移(コードでページを設定)

React(+ Vite)アプリでページ切り替え(ルーティング)を実装する時には、React RouterやTanStack Routerを使うのが一般的です。

しかしこれらを使わずともルーティングは可能なので、その簡単な方法を紹介します。

本記事では、『コードでページを切り替える方法(Code-based routing)』を説明します。

まずはReact + Viteを用意しましょう。

そしてindex.css内のコードはすべて消しておいてください。

(*React + Viteのセットアップについてはこちらの記事をご覧ください)

ページの用意

ページとして「About」、「Home」、そしてページが存在しない場合の「Not Found」のファイルを用意しましょう。

code-based-routing-1

各ファイルには次のように書きます。

// Home.jsx

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

export default Home
// About.jsx

const About = () => {
    return (
        <div>
            <h1>About</h1>
        </div>
    )
}

export default About
// NotFound.jsx

const NotFound = () => {
    return (
        <div>
            <h1>Not Found</h1>
        </div>
    )
}

export default NotFound

ページ切り替えの仕組みの用意

App.jsxのコードをすべて消したら、次のように書いてください。

// App.jsx

const App = () => {
    return 
}

export default App

現在のページを保存するために、stateを用意します。

// App.jsx

import { useState } from "react"        // 追加

const App = () => {
    const [path, setPath] = useState(window.location.pathname)  // 追加

    return 
}

export default App

そして、ブラウザのURLの変更を扱う次のコードを追加しましょう。

// App.jsx

import { useEffect, useState } from "react"    // 追加

const App = () => {
    const [path, setPath] = useState(window.location.pathname)

    // ⬇追加
    const renderByUrl = () => {
        setPath(window.location.pathname)
    }

    useEffect(() => {
        window.addEventListener("popstate", renderByUrl)
        return () => window.removeEventListener("popstate", renderByUrl)
    }, [])
    // ⬆追加

    return
}

export default App

最後に、先ほど作ったページをURLに合わせて表示するコードを加えます。

// App.jsx

import { useEffect, useState } from "react"
import Home from "./Home"               // 追加
import About from "./About"             // 追加
import NotFound from "./NotFound"       // 追加

const App = () => {
    const [path, setPath] = useState(window.location.pathname)

    const renderByUrl = () => {
        setPath(window.location.pathname)
    }

    useEffect(() => {
        window.addEventListener("popstate", renderByUrl)
        return () => window.removeEventListener("popstate", renderByUrl)
    }, [])

    // ⬇追加
    if (path === "/") return <Home />
    if (path === "/about") return <About />
    return <NotFound />
    // ⬆追加
}

export default App

Linkタグの用意

ページを移動するリンクに<a>タグを使い、次のように書くとします。

<a href="/about">About</a>

しかしこれではページがリロードされてしまい、SPA(Single Page Application)の特徴である「スムーズなページ遷移」にはなりません。

なので、専用の<Link>タグを用意しましょう。

Link.jsxを作ってください。

code-based-routing-2

次のように書きます。

// Link.jsx

export function Link({ to, children }) {
    const handleClick = (e) => {
    e.preventDefault()
    window.history.pushState({}, "", to)
    window.dispatchEvent(new PopStateEvent("popstate"))
}

return (
        <a href={to} onClick={handleClick}>
            {children}
        </a>
    )
}

export default Link

そして各ページに読み込みましょう。

// Home.jsx
import Link from "./Link"      // 追加

const Home = () => {
    return (
        <div>
            <h1>Home</h1>
            <Link to="/about">About</Link>   // 追加
        </div>
    )
}

export default Home
// About.jsx
import Link from "./Link"      // 追加

const About = () => {
    return (
        <div>
            <h1>About</h1>
            <Link to="/home">Home</Link>    // 追加
        </div>
    )
}

export default About
// NotFound.jsx
import Link from "./Link"      // 追加

const NotFound = () => {
    return (
        <div>
            <h1>Not Found</h1>
            <Link to="/home">Home</Link>      // 追加
        </div>
    )
}

export default NotFound

これで、パッケージを使わない、コードベースでのルーティングをReactに実装できました。

しかしこのようなマニュアル方式には限界もあります。

この実装方法の限界

ページが増えたときにコードも増えていく、動的ルートが扱いづらい、テストが書きづらいといった問題が典型的です。

そのためやはり一般的には、React RouterやTanStack Routerといったパッケージを使うことになります。


image

▼【無料フロントエンド・ガイド】は下記ページで受け取れます。

https://monotein.com/present-for-readers

Profile Pic

🟩 フロントエンド開発者入門ガイド【無料配布中】


最初にこれが知りたかった!
フロントエンド初心者が必ず押さえておきたい ― 『挫折しない勉強法』とその具体的ステップ、無料配布中。
(*名前不要・メールアドレスだけで受け取り可能です)