You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SolidJS Router路由内容未加载问题求助

问题描述

配置SolidJS Router后,页面仅显示NavBar组件,HeroPage等页面组件无法加载,相关代码如下:

index.tsx(路由配置)

import './index.css';
import { render } from 'solid-js/web';

import App from './App';
import { Router, Route } from '@solidjs/router';
import HeroPage from './pages/HeroPage';
import News from './pages/NewsPage';
import RegistrationPage from './pages/RegistrationPage';
import RaceRoutes from './pages/RoutesPage';
import RaceRules from './pages/RulesPage';

const root = document.getElementById('root');

if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
  throw new Error(
    'Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?',
  );
}

render(() => (
  <Router root={App}>
    <Route path="/" component={HeroPage} />
    <Route path="/routes" component={RaceRoutes} />
    <Route path="/registrations" component={RegistrationPage} />
    <Route path="/rules" component={RaceRules} />
    <Route path="/news" component={News} />
    {/* <Route path="/edition-2024" component={Edition2024Page} /> */}
    {/* <Route path="/contact" component={ContactPage} /> */}
  </Router>
), root!);

App组件

import type { Component } from 'solid-js';

import NavBar from './components/NavBar';

const App: Component = () => {
  return (
    <NavBar />
  );
};

export default App;

HeroPage组件

import type { Component } from 'solid-js';

const HeroPage: Component = () => {
  return (
    <section id="hero" class="bg-cover bg-center h-screen" style="background-image: url('https://example.com/mountain.jpg');">
      <div class="flex items-center justify-center h-full bg-gray-900 bg-opacity-50">
        <div class="text-center text-white">
          <h1 class="text-5xl font-bold mb-4">Cursa de Muntanya</h1>
          <p class="text-xl mb-8">Uneix-te a nosaltres per una experiència inoblidable</p>
          <a href="#inscripcio" class="focus:outline-none text-white bg-red-700 hover:bg-red-800 focus:ring-4 focus:ring-red-300 font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2 dark:bg-red-600 dark:hover:bg-red-700 dark:focus:ring-red-900">Inscriu-te Ara</a>
        </div>
      </div>
    </section>
  );
};

export default HeroPage;

解决思路

问题核心是App组件未包含路由出口(Outlet),SolidJS Router需要通过Outlet来渲染匹配到的页面组件,当前App只返回了NavBar,导致路由组件无处渲染。

步骤1:修改App组件,添加Outlet

从@solidjs/router导入Outlet,并在App的JSX中添加该组件,路由匹配的页面会自动渲染在Outlet的位置:

import type { Component } from 'solid-js';
import { Outlet } from '@solidjs/router'; // 新增导入
import NavBar from './components/NavBar';

const App: Component = () => {
  return (
    <>
      <NavBar />
      <Outlet /> {/* 添加路由出口 */}
    </>
  );
};

export default App;

步骤2:(可选)优化Router配置写法

SolidJS Router更推荐将App作为Router的子组件,而非通过root属性传入,修改index.tsx的Router部分:

render(() => (
  <Router>
    <App />
    <Route path="/" component={HeroPage} />
    <Route path="/routes" component={RaceRoutes} />
    <Route path="/registrations" component={RegistrationPage} />
    <Route path="/rules" component={RaceRules} />
    <Route path="/news" component={News} />
    {/* 注释的路由保持不变 */}
  </Router>
), root!);

额外检查

确保NavBar中的页面跳转使用@solidjs/router提供的<Link>组件,而非原生<a>标签,避免页面刷新:

// NavBar组件示例
import { Link } from '@solidjs/router';

const NavBar = () => {
  return (
    <nav>
      <Link href="/">首页</Link>
      <Link href="/routes">路线</Link>
      {/* 其他导航链接 */}
    </nav>
  );
};

内容的提问来源于stack exchange,提问作者Jordi Cabré

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:17:05