返回

为什么在 Vue 路由器中传递的对象在页面刷新时会被清除?

前端

问题

在 Vue 路由器中,当您在组件之间传递对象时,如果用户刷新页面,该对象将被清除。这是因为 Vue 路由器使用查询字符串来传递数据,而查询字符串在页面刷新时会丢失。

原因

Vue 路由器使用查询字符串来传递数据,因为这是一种轻量级且易于实现的方法。查询字符串是附加到 URL 末尾的一系列键值对,用问号 (?) 分隔。例如,以下 URL 包含一个名为 foo 的查询字符串参数,其值为 bar

https://example.com/?foo=bar

当 Vue 路由器在组件之间传递对象时,它会将对象序列化为 JSON 字符串,然后将其添加到查询字符串中。例如,以下代码将一个名为 user 的对象传递给 UserProfile 组件:

this.$router.push({
  name: 'UserProfile',
  query: {
    user: JSON.stringify({
      id: 1,
      name: 'John Doe',
      email: 'johndoe@example.com'
    })
  }
});

UserProfile 组件被渲染时,它可以从查询字符串中检索 user 对象,如下所示:

const user = JSON.parse(this.$route.query.user);

解决方案

有几种方法可以解决这个问题:

使用查询字符串

一种方法是继续使用查询字符串,但在页面刷新时将对象存储在本地存储中。当页面刷新时,您可以从本地存储中检索对象并将其重新添加到查询字符串中。例如,以下代码将 user 对象存储在本地存储中:

localStorage.setItem('user', JSON.stringify(this.$route.query.user));

当页面刷新时,您可以从本地存储中检索 user 对象,如下所示:

const user = JSON.parse(localStorage.getItem('user'));
this.$router.push({
  name: 'UserProfile',
  query: {
    user: JSON.stringify(user)
  }
});

使用 beforeRouteUpdate 钩子函数

另一种方法是使用 beforeRouteUpdate 钩子函数。此钩子函数在组件更新之前被调用,您可以使用它来检查查询字符串中是否包含 user 对象。如果查询字符串中包含 user 对象,您可以将它存储在组件的数据中。例如,以下代码将 user 对象存储在组件的数据中:

beforeRouteUpdate(to, from, next) {
  if (to.query.user) {
    this.user = JSON.parse(to.query.user);
  }
  next();
}

持久化数据

如果需要将数据持久化到本地存储,可以使用以下代码:

localStorage.setItem('user', JSON.stringify(this.$route.query.user));

当页面刷新时,您可以从本地存储中检索数据,如下所示:

const user = JSON.parse(localStorage.getItem('user'));

总结

在 Vue 路由器中传递对象时,如果您需要在页面刷新后保留这些对象,可以使用查询字符串或 beforeRouteUpdate 钩子函数来实现。您也可以将数据持久化到本地存储。