【问题标题】:VueJS: $router.push not working with query parametersVueJS:$router.push 不适用于查询参数
【发布时间】:2020-05-31 05:03:43
【问题描述】:

在我的 NuxtJS(v. 2.10.2) 应用程序中,我有一个如下所示的 URL,其中 pid 是帖子的 ID。

/post?pid=5e4844e34202d6075e593062

此 URL 工作正常,并根据传递给 pid 查询参数的值加载帖子。但是,用户可以通过单击打开对话框的应用程序栏上的Add Post 按钮来添加新帖子。一旦用户单击添加,就会向后端服务器发出请求以保存请求。一旦成功,用户将使用 vue 路由器 push 重定向到新帖子,如下所示

.then(data => {
  if (data) {
    this.$router.push({ path: `/post?pid=${data.id}` });
  }
})

问题是,用户没有被重定向到新帖子,只有查询参数pid被更新。我怀疑 VueJS 不承认这是一个不同的 URL,因此什么都不做。

如何解决这个问题?

更新:作为替代方法,尝试了以下语法,但得到了相同的行为。

this.$router.push({ path: "post", query: { pid: data.id } });

【问题讨论】:

  • 这不是传递参数的方式,试试this
  • @ChristianCarrillo 我试过this.$router.push({ path: "post", query: { pid: data.id } });。但是只有查询参数被更新,页面没有被重定向,才能获得相同的行为。它对你有用吗?
  • 尝试使用 name 而不是 path,之前在您的路线配置中设置了 name 属性

标签: vue.js vue-router nuxt.js query-parameters


【解决方案1】:

假设您有一个组件post.vue,它与/post URL 映射。

现在,如果您将用户重定向到/post?pid=13post.vue 如果组件已经挂载,则不会再次挂载,即。当您已经在/post/post?pid=12 时。

[1] 在这种情况下,您可以在route 上加上watch 以了解路由是否已更改。

watch: {
 '$route.path': {
   handler (oldUrl, newUrl) {
     let PID = this.$route.query.pid
     // fetch data for this PID from the server.
     // ...
  }
 }
}

[2] 如果组件post.vue 映射到某个路由,比如/post

你也可以使用生命周期->vue-router提供的beforeRouteUpdate

beforeRouteUpdate (to, from, next) {
  let PID = to.query.pid
  // fetch data for this PID from the server.
  // ...
  next()
}

【讨论】:

  • 这对我有用。想在这里补充一点,如果您通过单击通知铃图标标题 comp (sey) 打开电子邮件组件(例如),单击不同的通知将不会刷新已经打开的电子邮件组件。因此,按照您的建议使用了手表,但有所不同。在我的情况下,因为刷新的方法是在不同的组件中,具有相应的 html 等,使用 eventBus 发出一个标志,然后到达已安装的电子邮件组件和刷新的 API。
  • @shivam 可以直接调用 router.go () 吗?
【解决方案2】:

试试这个解决方案

.then(data => {
  if (data) {
    this.$router.push({ name: 'post', query: { pid: data.id } });
  }
})

提示:

// with query, resulting in /register?plan=private
router.push({ path: 'register', query: { plan: 'private' } })

【讨论】:

    【解决方案3】:

    通过更改方法组件数据可以根据新的查询字符串值进行更新。这是如何做到的。

    而不是尝试使用不同的查询字符串再次推送到同一页面。可以观察查询字符串pid 本身的变化,并在更新时获取新数据并更新组件数据。在 NuxtJS(v. 2.10.2) 应用程序中,这可以通过 watchQuery 实现。 watchQuery 是一个 NuxtJS 属性,用于监视查询字符串的变化。一旦检测到更改,所有组件方法(asyncData、fetch、validate..)都会被调用。你可以阅读更多https://nuxtjs.org/api/pages-watchquery/

    对于解决方案,使用新的查询字符串推送到同一页面保持不变。

    .then(data => {
      if (data) {
        this.$router.push({ name: 'post', query: { pid: data.id } });
      }
    })
    

    但是,在 page.vue 上,数据是从服务器获取的。我们需要添加watchQuery 属性。

    watchQuery: ["pid"],
    async asyncData(context) {
      let response = await context.$axios.$get(
        `http://localhost:8080/find/id/${context.route.query.pid}`
      );
      return { postData: response };
    },
    data: () => ({
      postData: null
    })
    

    现在,每次查询字符串 pid 发生变化时,都会调用 asyncData。就是这样。查询字符串值更改时更新组件数据的简单修复。

    【讨论】:

      【解决方案4】:

      使用 watchQuery 属性 (https://nuxtjs.org/docs/2.x/components-glossary/pages-watchquery)

      export default {
        watchQuery: true,
        data: () => ...
      }
      

      【讨论】:

        【解决方案5】:

        试试这个:

        .then(data => {
          if (data) {
            this.$router.push('/post?pid=' + data.id);
          }
        })
        

        希望有用!!!

        【讨论】:

        • 请不要只发布代码作为答案,而是说明您的代码的作用以及它如何解决问题的问题。带有解释的答案通常质量更高,更有可能吸引投票。
        猜你喜欢
        • 2019-11-08
        • 2022-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-03
        相关资源
        最近更新 更多