【问题标题】:vue-router this.$route.params is emptyvue-router this.$route.params 为空
【发布时间】:2018-11-23 01:39:53
【问题描述】:

我正在尝试使用 vue-router 从地址栏中获取一个名为 project_id 的变量。我已经像这样初始化了一个路由器:

import Vue from 'vue'
import VueRouter from 'vue-router'
import App from './App'

Vue.config.productionTip = false
Vue.use(VueRouter)

/* eslint-disable no-new */
const router = new VueRouter({
  routes: [
    { path: '/project/:project_id', component: App }
  ]
})

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

并尝试从我的 App.vue 组件中访问 this.$route.params.project_id

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <div id="center_bar">
      oh: {{this.$route.params.project_id}}
    </div>
  </div>
</template>

<script>
import ProjectList from './components/ProjectList'
import ProjectAboutBox from './components/ProjectAboutBox'

export default {
  name: 'App',
  created() {
    console.dir(this.$route.params)
  },
  components: {
    ProjectList,
    ProjectAboutBox
  }
}
</script>

但是,当我将this.$route.params 写入控制台时,我看到它是一个空对象。

我没有看到任何人遇到过类似的事情,所以我的猜测是我遗漏了一些非常基本的东西,但我无法弄清楚它到底是什么。

此外,如果我 console.dir(this.$route) 我看到 fullPath 是“/”,即使我正在访问 http://localhost:8080/project/kljkjkj/

编辑:

我还发现,当我创建一个指向我要解析的地址的&lt;router-link&gt;,然后单击它就可以使整个工作正常进行,只需通过在地址栏中输入地址直接访问它就会失败

【问题讨论】:

    标签: vue.js vue-router


    【解决方案1】:

    我遇到了类似的问题。

    手动输入url或刷新浏览器时,$route对象不会被填充。

    经过一番调查,我发现如果匹配了延迟加载路由:

    对于“路由器视图”之外的组件: $route 对象即使在 'mounted' 钩子中也不会被填充,而是在渲染过程的后期填充。

    对于“路由器视图”内的组件: $route 对象已填充并立即可用

    我的解决方法是在尝试访问 $route 对象中的变量时使用“计算”​​属性而不是“数据”。

    版本: "vue": "^2.6.11", "vue-router": "^3.2.0"

    节点:将模式从“哈希”更改为“历史”对我来说没有帮助。

    【讨论】:

    • 好吧,这让我发疯了。在热重载时,它会按预期工作,但刷新或初始导航则不会。我遇到了这个问题并通过直接访问 URL 来“修复”它:(new URL(location)).searchParams.get('locationId')。我还在使用 Vue 2.6.10 使用“历史”。这发生在我的 App.vue(顶级文件)中,我测试了 created() 和 mount()。
    【解决方案2】:

    默认的 vue-router 是hash mode。您可以尝试访问http://localhost:8080/#/project/kljkjkj/

    你可以切换到历史模式

    const router = new VueRouter({
      mode: 'history',
      routes: [{ path: "/project/:project_id", component: App }]
    });
    

    演示:https://codesandbox.io/s/p9v3172x6j(尝试将 url 更改为https://p9v3172x6j.codesandbox.io/project/1234

    【讨论】:

    • 我实际上只是在一分钟前才想到这一点,并且正要回答我自己的问题!嗯,有点,我发现我需要添加井号,但不明白为什么vue-router 有这种行为!谢谢!
    • 没问题!编码愉快!
    • 进入历史模式这没有任何意义。如果我使用了哈希模式,那么我不想仅仅因为这件事而让它成为历史,应该有一个合乎逻辑的原因。
    【解决方案3】:

    当在&lt;template&gt;时,您不需要参考this

    你试过了吗:

    <template>
      <div id="app">
        <img src="./assets/logo.png">
        <div id="center_bar">
          oh: {{$route.params.project_id}}
        </div>
      </div>
    </template>
    

    ?

    另外,我发现您没有使用&lt;router-view&gt;

    https://router.vuejs.org/api/#router-view

    【讨论】:

    • 当我没有提到this 时,它根本不起作用。我还发现,当我创建一个指向我要解析的地址的&lt;router-link&gt; 时,然后单击它可以使整个工作正常进行,只需通过在地址栏中输入地址直接访问它就会失败
    • 目前,我不需要&lt;router-view&gt;,我只加载一个组件,我只是希望它的行为根据地址栏中的信息略有不同
    猜你喜欢
    • 2022-10-25
    • 1970-01-01
    • 2017-05-21
    • 2018-02-15
    • 2021-06-02
    • 2020-02-15
    • 2021-07-01
    • 2019-12-02
    • 2018-11-10
    相关资源
    最近更新 更多