【问题标题】:Utilizing browser back/forward buttons in a vue.js app在 vue.js 应用程序中使用浏览器后退/前进按钮
【发布时间】:2017-06-08 17:14:29
【问题描述】:

我有一个应用程序,它有一堆改变状态的下拉组件。 .下拉菜单的状态控制一个主数据表,该数据表具有基于参数的信息。很酷。

我还想更改 URL,以便用户可以与同事共享 url,并且无需选择下拉参数即可显示数据表。

例如:http://localhost:8080/?region=372&pc=341&pc=375http://localhost:8080/?region=372&pc=341&vendor=123456

现在我已经通过手动查看选择的下拉参数(通过watch)并构建一个url并使用this.$router.push在事情发生变化时更新浏览器历史记录来完成这项工作。我觉得这并不完全正确,但这是我能够持续更新 url 的唯一可靠方法。

主要问题是当我点击浏览器的后退/前进按钮时,组件不会根据 url 更新它们的状态。如果我后退/前进,应用程序将保持当前状态。我该如何正确处理?

【问题讨论】:

  • 你使用的是历史模式吗?
  • 是的。没有hasbangs。
  • 我猜是因为你使用的是 URL 查询参数,它不像 vue-router 的路由参数那样绑定。也许您可以在$route.query 上放置一个观察者并根据更改的值设置数据?
  • 这就是我现在正在做的事情,但问题是我认为框架可以更轻松地处理一些事情似乎需要大量的手动工作。主要问题是当用户改变状态时我改变了 url 查询,这反过来又重新填充了数据表。当 url 查询基于上述更新时,观看$route.query 根据 URL 更新应用程序的状态。这有点导致循环人口问题。当手动更新状态时,我不得不手动设置一个变量,以免重新检查$route.query

标签: javascript vue.js state


【解决方案1】:

看起来您正在有效地尝试将下拉列表的状态绑定到您的 URL 查询。不幸的是,VueRouter 没有针对此问题的内置解决方案。

我不确定您的数据是如何构成的,因此假设您有一个包含相关参数的对象 dropdownParams

dropdownParams: {
  region: 372,
  pc: 341,
  vendor: 123456,
}

您需要在dropdownParams 上设置一个观察者,以便在更新时更新$route 中的查询。使用$router.replace 而不是$router.push,这样历史记录就不会改变:

watch: {
  dropdownParams(params) {
    // format the data however you want this is an example with lodash
    let query = _.pickBy(params, p => !_.isEmpty(p));
    this.$router.replace({ query: query });
  }
}

然后,在mounted 挂钩中,您可以根据任何相关的$route.query 参数设置dropdownParams 对象(如果它们已经存在):

mounted() {
  let keys = _.keys(this.dropdownParams);
  _.assign(this.dropdownParams, _.pick(this.$route.query, keys));
}

现在,当用户更改下拉参数时,这些更改将反映在 URL 中。而且,如果用户加载组件时已经存在 URL 查询参数,组件会将这些值设置到下拉列表中。

【讨论】:

  • 如果有问题的路由使用相同的组件,挂载的钩子是否也适用于浏览器的后退/前进按钮?
  • mounted 将在组件安装到 DOM 时触发一次。如果组件在路由更改时挂起,则不会触发。
  • 因此,我们再次回到如何处理浏览器后退/前进使用。似乎需要手动完成。
  • 不确定你的意思。如果路由更改为包含下拉组件,mounted 函数将触发,更新dropdownParams。或者你的意思是你想在添加一个参数后点击返回按钮,它会删除参数而不是去上一个路由?
  • 如果我向 url 添加查询参数,从技术上讲,它是相同的路线,是吗?因此,我必须观看$route.query。因为如果我单击后退按钮,将访问相同的路由,因此除非我手动更新状态,否则不会发生任何事情。如果这令人困惑,我深表歉意。我不完全确定如何在给定组件的情况下显示问题。我会试着把它分解一下并举一个熊骨头的例子。
猜你喜欢
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多