【问题标题】:How to use vue-router params如何使用 vue-router 参数
【发布时间】:2017-07-25 07:21:35
【问题描述】:

我是 vue 的新手,现在正在使用它的路由器。 我想导航到另一个页面,我使用以下代码:

this.$router.push({path: '/newLocation', params: { foo: "bar"}});

然后我希望它在新组件上

this.$route.params

这不起作用。 我也试过了:

this.$router.push({path: '/newLocation'});
this.$router.push({params: { foo: "bar"}});

我稍微检查了源代码,发现这个属性被新对象 {} 覆盖。

我想知道参数的使用是否与我想的不同? 如果没有,如何使用?

提前致谢

【问题讨论】:

  • 而不是推到路径,推到名称,然后它会工作。

标签: vuejs2 vue-router


【解决方案1】:

由于您想将参数传递给相应路由的组件,因此您路由对象的路径属性应该有一个由: 表示的动态段,后跟参数对象中的键名

所以你的路线应该是

routes: [
    {path: '/newLocation/:foo', name: 'newLocation', component: newComponent}
]

然后以编程方式导航到您应该执行的组件:

this.$router.push({name: 'newLocation', params: { foo: "bar"}});

看到我正在使用路由的name 而不是path,因为您通过属性params 传递参数。

如果你想使用path 那么它应该是:

this.$router.push({path: '/newLocation/bar'});

通过路径方法,参数将自动映射到$route.params上的相应字段。

现在,如果您在新组件中console.log(this.$route.params),您将获得对象:{"foo": "bar"}

【讨论】:

  • 我不知道 Vue 路由器在 2017 年的工作方式是否有所不同,但现在 Vue 路由器在路由上需要 props: true 才能开始解析 url 的 :foo 部分
  • 感谢您的澄清,我错过了这个。$router.params。我假设当参数被传递时,当它在 data 下声明时,我可以自动捕获该参数
【解决方案2】:

我发现最简单的方法是使用命名路由和参数选项。假设您有一个如下所示的路由器文件:

并且您想使用一些 ID 访问“电影”页面。您可以使用 Vue 的路由器链接组件(或 Nuxt 的链接组件)来访问它:

Vue:

<router-link :to="{ name: 'movie', params: { id: item.id } }">{{ item.title }}</router-link>

努克斯特:

<nuxt-link :to="{ name: 'movie-id', params: { id: item.id } }">{{ item.title }}</nuxt-link>

注意,name 参数必须与路由器文件中所需路由的“name”属性相匹配。同样,参数名称必须匹配。

Nuxt 在你创建一个路由文件时会自动为你创建一个路由文件 新页面。要查看 Nuxt 为其路线命名的名称,请转到 .Nuxt 在项目中的文件夹中查找“router.js”文件

【讨论】:

    【解决方案3】:

    尝试使用查询而不是参数

    this.$router.push({path: '/newpath', query : { foo: "bar"}});
    

    在你的组件中

    console.log(this.$route.query.foo)
    

    【讨论】:

    • 有效,但它会生成一个奇怪的 URL。因为我正在传递一个对象,所以它显示http://...?player=%5Bobject%20Object%5D。有什么办法不让它这样做?
    • @tazboy 你找到解决方法了吗?我还使用一个对象作为我的路由和 URL 的道具,如果我的对象有一个“名称”字段,我想在 URL 中显示它而不是 %5Bobject%20Object%5D
    • 我使用 localStorage 来存储我需要的内容,而不是使用查询传递它。更容易使用。
    【解决方案4】:

    将属性绑定到路由器不是通常被认为是一种反模式吗?

    让它们绑定到它自己的组件是一个更加 DRY 的解决方案,我实际上相信 Vue 路由器会这样做。请参阅:https://router.vuejs.org/en/essentials/passing-props.html,了解更多关于最佳实践的信息

    您可以尝试接受组件的 props: [] 属性中的属性吗?你可以在这里看到如何做到这一点:https://vuejs.org/v2/guide/components.html#Props

    如果您有任何问题,请务必弹出!很乐意为您提供进一步帮助。

    【讨论】:

    • 我想将参数从一个视图传递到另一个视图。对我来说听起来不错。当给路由命名然后执行 'this.$router.push({path: '/newLocation', name: 'newRouteName', params: { foo: "bar"}});'成功了,现在我可以通过以下方式访问我新加载的视图上的参数:this.$route.params。感谢您的时间和精力!
    • 还有一件事,我看不出为什么必须命名它才能工作。你有什么想法吗?
    猜你喜欢
    • 2017-07-02
    • 2017-03-15
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2020-05-15
    • 2020-05-07
    • 2021-06-23
    • 2020-05-10
    相关资源
    最近更新 更多