Vue2项目中<router-link>与router.js失效问题求助
Vue 2 路由问题排查与修复
问题现象
运行项目后文章列表正常展示,但<router-link>包裹的标题无法点击;所有路径都显示PostItem页面,路由配置完全无效。
核心问题分析与修复步骤
1. Vue Router 未正确初始化与挂载
这是路由完全失效的根本原因:
- 原
router.js仅导出了路由数组,未创建Router实例并注册到Vue中 App.vue直接渲染PostItem组件,未使用<router-view>作为路由组件的挂载容器
修正后的router.js
import Vue from 'vue' import VueRouter from 'vue-router' import PostItem from './components/PostItem.vue'; import singlePost from './components/singlePost.vue'; // 注册Vue Router插件 Vue.use(VueRouter) const routes = [ { path: '/', component: PostItem }, { path: '/post/:id', component: singlePost } ] // 创建Router实例 const router = new VueRouter({ routes }) export default router
修正main.js(项目根目录下,需确保存在)
import Vue from 'vue' import App from './App.vue' import router from './router' new Vue({ // 注入路由实例 router, render: h => h(App) }).$mount('#app')
修正App.vue
将硬编码的<PostItem/>替换为路由视图容器:
<template> <div id="app"> <router-view/> </div> </template> <script> export default { name: 'App' } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
2. singlePost 组件的多处错误
- 模板中使用
{{blog.title}},但data中定义的变量是post,变量名不匹配 - 使用
this.$http需要额外安装Vue Resource依赖,改用原生fetch更简洁 - 原
then回调用普通函数导致this指向错误,改用箭头函数绑定组件实例
修正后的singlePost.vue
<template> <div id="single-post"> <h1>{{post.title}}</h1> <p>{{post.body}}</p> </div> </template> <script> export default{ data(){ return { post: {} } }, created(){ fetch(`https://jsonplaceholder.typicode.com/posts/${this.$route.params.id}`) .then(res => res.json()) .then(data => this.post = data) .catch(err => console.log(err.message)) } } </script> <style> #single-post{ max-width: 960px; margin: 0 auto; } </style>
验证修复效果
完成上述修改后:
- 文章标题的
<router-link>可正常点击跳转 - 访问
/post/:id路径会渲染对应单篇文章 - 根路径
/显示文章列表,路由规则生效
内容的提问来源于stack exchange,提问作者Oğulcan
相关产品推荐
相关产品推荐

