使用vue-router保留组件状态?

时间:2017-01-20 13:26:51

标签: vue.js vue-router

我有一个列表/详细用例,用户可以双击产品列表中的项目,转到详细信息屏幕进行编辑,然后在完成后返回列表屏幕。我已经使用此处描述的动态组件技术完成了此操作:https://vuejs.org/v2/guide/components.html#Dynamic-Components。但是现在我计划在应用程序的其他地方使用vue-router,我想重构它以使用路由。使用我的动态组件技术,我使用keep-alive来确保当用户切换回列表视图时,存在与编辑之前相同的选择。但在我看来,通过路由,产品列表组件将被重新渲染,这不是我想要的。

现在,看起来路由器视图可以包含在keep-alive中,这可以解决一个问题,但会引入很多其他问题,因为我只希望该路由保持活动,而不是全部(并且目前我和#39) ;我只使用一个顶级路由器视图)。 Vue 2.1通过引入router-view的include和exclude参数,显然已经做了一些事情来解决这个问题。但我也不是真的想要这样做,因为在我的主页面中预先声明应该或不应该使用keep-alive的所有路线似乎非常笨拙。在我配置路由的那一点(即在路由数组中)声明我是否想要保持活动会更加简洁。那么,我最好的选择是什么?

5 个答案:

答案 0 :(得分:6)

您可以指定要保留的路线,例如:

<keep-alive include="home">
  <router-view/>
</keep-alive>

在这种情况下,只有本地路由会保持活动状态

答案 1 :(得分:1)

在我看来,你正在寻找某种state management。如果您有多个组件共享的数据,并且您希望以不同的顺序呈现组件,但又不想为每个组件再次加载数据。

这类似如下:

enter image description here

Vue提供simple state management,但我建议使用Vuex这是vue社区中的州管理标准。

答案 2 :(得分:1)

我遇到了类似的问题并查看了Vuex,但认为在我的代码中需要进行太多更改/添加才能添加到项目中。

我发现这个库https://www.npmjs.com/package/vue-save-state为我解决了这个问题,保持了1个组件的状态与localStorage同步,并且只花了几分钟和几行代码(所有这些都记录在Github页面中包裹)。

答案 3 :(得分:0)

一个没有localStorage的解决方案:

import {Component, Provide, Vue} from "vue-property-decorator";

@Component
export default class Counter extends Vue {
  @Provide() count = 0

  /**
   * HERE
   */
  beforeDestroy() {
    Object.getPrototypeOf(this).constructor.STATE = this;
  }

  /**
   * AND HERE
   */
  beforeMount() {
    const state = Object.getPrototypeOf(this).constructor.STATE;
    Object.entries(state || {})
        .filter(([k, v]) => /^[^$_]+$/.test(k) && typeof v !== "function")
        .forEach(([k]) => this[k] = state[k]);
  }
}

答案 4 :(得分:0)

Vue 3

<router-view v-slot="{ Component }">
  <keep-alive>
    <component :is="Component" />
  </keep-alive>
</router-view>

完全一样,您不需要 App.vue 中的 Component 属性。即使您的组件没有指定 name 属性,您的 this 也会起作用。