MST

星途 面试题库

面试题:SvelteKit 路由多语言支持下的动态路由参数与语言切换的协同处理

假设 SvelteKit 项目中有动态路由参数(如 /product/[id]),同时要实现多语言支持。当语言切换时,如何确保动态路由参数对应的内容也能正确切换到相应语言版本,描述具体的实现思路与关键代码片段。
29.9万 热度难度
前端开发Svelte

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 语言切换机制:使用一个状态管理来跟踪当前语言,例如在 SvelteKit 中可以利用 $app/stores 中的 page 存储结合 beforeNavigate 事件。
  2. 动态路由参数处理:在组件中获取动态路由参数 id,根据当前语言从相应语言的数据源中获取对应内容。数据源可以是 JSON 文件或者 API 接口。
  3. 语言切换时更新内容:当语言切换时,触发重新获取数据的逻辑,确保页面内容更新为新语言版本。

关键代码片段

  1. 设置语言切换状态+layout.js 中:
import { page } from '$app/stores';
import { beforeNavigate } from '$app/navigation';

export const load = async ({ url }) => {
    const lang = url.searchParams.get('lang') || 'en';
    return { lang };
};

beforeNavigate(({ url }) => {
    const lang = url.searchParams.get('lang');
    if (lang) {
        page.update((p) => {
            p.data.lang = lang;
            return p;
        });
    }
});
  1. 在动态路由组件中获取数据+page.svelte 中:
<script lang="ts">
    import { page } from '$app/stores';
    import { onMount } from'svelte';
    import type { PageData } from './$types';

    const { params } = $page;
    const { lang } = $page.data as PageData;
    let productData;

    const fetchProductData = async () => {
        const response = await fetch(`/api/products/${params.id}?lang=${lang}`);
        productData = await response.json();
    };

    onMount(() => {
        fetchProductData();
    });

    $: $page.on('update:data', () => {
        fetchProductData();
    });
</script>

{#if productData}
    <h1>{productData.title}</h1>
    <p>{productData.description}</p>
{/if}
  1. API 端根据语言返回数据 在 Node.js 示例中:
const express = require('express');
const app = express();
const productsEn = require('./products.en.json');
const productsFr = require('./products.fr.json');

app.get('/api/products/:id', (req, res) => {
    const { id } = req.params;
    const lang = req.query.lang || 'en';
    const product = lang === 'en'? productsEn.find(p => p.id === id) : productsFr.find(p => p.id === id);
    if (product) {
        res.json(product);
    } else {
        res.status(404).send('Product not found');
    }
});

const port = process.env.PORT || 3000;
app.listen(port, () => {
    console.log(`Server running on port ${port}`);
});