MST

星途 面试题库

面试题:Solid.js 路由懒加载下如何处理异步数据加载与路由切换的协同

假设在 Solid.js 应用中,每个路由对应的组件都需要从后端加载异步数据。在路由懒加载的情况下,如何确保在路由切换时,新路由组件的数据能及时、高效地加载,同时避免旧路由组件加载过程中的资源浪费?请给出具体的实现思路和关键代码示例。
11.8万 热度难度
前端开发Solid.js

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用 Suspense 组件:Solid.js 中的 Suspense 组件用于处理异步渲染,可在数据加载时显示加载状态。
  2. 路由懒加载结合 Suspense:在路由配置中使用懒加载,并将懒加载的组件包裹在 Suspense 中。
  3. 取消旧请求:为避免旧路由组件加载过程中的资源浪费,在路由切换时取消旧的异步请求。可以利用 AbortController 来实现。

关键代码示例

  1. 路由配置与懒加载
import { Router, Route, Link } from '@solidjs/router';
import { Suspense } from 'solid-js';

const routes = [
  {
    path: '/home',
    component: () => import('./HomePage'),
  },
  {
    path: '/about',
    component: () => import('./AboutPage'),
  },
];

function App() {
  return (
    <Router>
      <nav>
        <Link href="/home">Home</Link>
        <Link href="/about">About</Link>
      </nav>
      <Suspense fallback={<div>Loading...</div>}>
        <Route routes={routes} />
      </Suspense>
    </Router>
  );
}
  1. 组件内异步数据加载与请求取消
import { createResource, onCleanup } from'solid-js';

function HomePage() {
  const controller = new AbortController();
  const { signal } = controller;
  const fetchData = async () => {
    const response = await fetch('/api/data', { signal });
    return response.json();
  };
  const [data] = createResource(fetchData);

  onCleanup(() => {
    controller.abort();
  });

  return (
    <div>
      {data()?.map(item => (
        <div key={item.id}>{item.name}</div>
      ))}
    </div>
  );
}

在上述代码中,createResource 用于处理异步数据加载,onCleanup 回调函数在组件卸载时取消尚未完成的请求,Suspense 组件在数据加载时显示加载状态。通过这些手段确保了新路由组件数据能及时、高效加载,并避免旧路由组件加载资源浪费。