Nuxt能否识别/slug路径对应页面类型并实现渲染与404跳转?
回答
这个需求完全可以实现,不需要重构你现有的三类页面模板,核心通过Nuxt兜底路由+后端统一slug解析接口就能完成,具体实现方案如下:
实现步骤
新增兜底路由
在pages目录下新建_.vue文件,这是Nuxt的全匹配兜底路由,只会命中所有你现有明确路由(/category/*、/post/*、/page/*等)匹配不到的路径,不会影响原有页面的正常访问。后端新增统一slug解析接口
在你的Laravel项目里新增一个查询接口,比如/api/resolve-slug,接收slug参数,内部逻辑按你需要的优先级依次查询:- 先查slug是否匹配文章记录
- 再查是否匹配分类记录
- 最后查是否匹配普通页面记录
匹配到结果就直接返回资源类型、资源ID对应数据,三类资源都查不到就返回404状态码。记得给三类资源表的slug字段加索引,避免查询性能问题。
在兜底路由中做判断分发
在_.vue的服务端数据获取逻辑(Nuxt2用asyncData、Nuxt3用useAsyncData)中按如下流程处理:- 从路由参数中提取当前访问路径的slug值
- 调用上一步写好的slug解析接口,传入当前slug
- 接口返回404时,直接调用Nuxt的错误处理方法抛出404状态,自动渲染项目的404页面
- 接口返回资源类型为
post时,服务端重定向到/post/{资源ID}路径,复用你已经写好的pages/post/_id.vue的所有请求、渲染逻辑 - 接口返回资源类型为
category时,重定向到/category/{资源ID}路径,复用分类页模板 - 接口返回资源类型为
page时,重定向到/page/{资源ID}路径,复用普通页面模板
可选优化
如果你不希望用户访问/slug时地址栏跳转到带/post/、/category/前缀的路径,可以不用做重定向,直接在_.vue里根据接口返回的资源类型,动态引入对应页面组件,同时把接口拿到的初始数据传入组件即可,用户地址栏会始终保持/slug的格式。
内容的提问来源于stack exchange,提问作者Mojyo
相关产品推荐
相关产品推荐

