
本文介绍在 Astro 构建的静态网站中,如何通过 URL 路由(如 /country/us)实现数据筛选,并利用客户端脚本联动下拉菜单,确保用户选择的选项在页面跳转后仍被保留和高亮。
本文介绍在 astro 构建的静态网站中,如何通过 url 路由(如 `/country/us`)实现数据筛选,并利用客户端脚本联动下拉菜单,确保用户选择的选项在页面跳转后仍被保留和高亮。
在 Astro 中实现“按选项过滤数据 + 跨页保持选中状态”,核心在于服务端路由驱动数据展示与客户端脚本驱动导航+状态同步的协同设计。Astro 本身是静态站点生成器(SSG),不支持服务端会话或实时状态存储,因此需将筛选状态显式编码进 URL(如 /country/us),再通过前端逻辑读取并同步 UI。
✅ 正确架构:URL 即状态(URL-as-State)
首先,将数据源统一管理(例如 src/data.json):
[
{ "country": "us", "title": "United States" },
{ "country": "gb", "title": "Great Britain" },
{ "country": "jp", "title": "Japan" }
]
接着,使用 Astro 的动态路由创建语义化路径:
在 src/pages/country/[country].astro 中:
---
import data from '../../data.json';
const { country } = Astro.params;
const countryData = data.find(item => item.country === country);
if (!countryData) {
throw new Error(`Country "${country}" not found`);
}
---
<h1>{countryData.title}</h1>
<p>Code: {countryData.country}</p>
该文件会自动生成 /country/us、/country/gb 等页面,每个页面仅渲染对应数据 —— 天然支持 SEO、直链分享、后退/刷新无状态丢失。
? 下拉菜单:导航即筛选,选中态自动同步
关键点在于:页面加载时,应根据当前 URL 自动设置 <select></select> 的 value;切换时,跳转到对应 /country/:code 路径。
在 src/pages/index.astro(或任何含筛选器的布局页)中:
---
import data from '../data.json';
// 从当前 URL 解析已选国家码(例如 /country/jp → 'jp')
const url = new URL(Astro.url.href);
const currentCode = url.pathname.split('/')[2] || '';
---
<select name="country" id="country-select"><option value="" disabled selected>Select a country</option>
{data.map(item => (
<option value="{item.country}" selected currentcode>
{item.title}
</option>
))}
</select><script is:inline>
const select = document.getElementById('country-select');
select?.addEventListener('change', (e) => {
const code = e.target.value;
if (code) {
window.location.href = `/country/${code}`;
}
});
</script>
?
is:inline确保脚本内联注入(避免 hydration 错误),selected={item.country === currentCode}实现服务端渲染时的初始选中态,无需等待 JS 执行。
⚠️ 注意事项与增强建议
-
404 处理:未匹配的
country参数应返回 404 页面(可在[country].astro中throw new NotFound()或用Astro.redirect()降级)。 -
无障碍优化:为
<select></select>添加label和aria-label,提升可访问性。 - SEO 友好:所有国家页独立存在,搜索引擎可分别索引;首页下拉菜单本身不阻塞内容,符合静态站点最佳实践。
-
扩展性提示:如需多条件筛选(如 country + category),可升级为嵌套路由
country/[country]/category/[category]或使用查询参数(但需注意 SSG 预生成限制)。
通过将筛选逻辑解耦为「URL 路由(服务端)+ 表单同步(客户端)」,你既获得静态站点的高性能与可靠性,又实现了类 SPA 的流畅用户体验 —— 这正是 Astro “渐进式增强”理念的典型实践。










