Quasar QTable 从子组件返回后丢失状态

Posted

技术标签:

【中文标题】Quasar QTable 从子组件返回后丢失状态【英文标题】:Quasar QTable lost state after returning from child component 【发布时间】:2020-10-04 02:16:56 【问题描述】:

我有一个 QTable 呈现链接,用户可以点击进入详细页面并使用后退按钮稍后返回此表。如果我移动到第 2 页并单击链接以查看详细信息页面,则返回时,表格状态将丢失,并再次显示第 1 页。

我曾尝试使用 Keep-Alive,希望组件不会被破坏,但它没有帮助。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

如果您将表格包装在keep-alive 中,只要该页面处于活动状态,它将保持活动状态。但是,由于您正在导航到另一个页面,因此该表将与包含它的页面一起被销毁。

因此,要实现您的目标,您必须使整个页面保持活力。你可以这样做:

<template>
  <q-page>
    <!-- ... -->
    <q-table ... />
    <!-- ... -->
  </q-page>
</template>
<script>
export default 
  name: 'ThePageYouWantToKeepAlive',
  // ...

</script>

keep-alive 有一些道具来管理包含/排除,您可以使用 include 道具来包含页面,它接受逗号分隔的列表、数组或正则表达式),你想保持活着。这样您就可以将性能损失降到最低。

<!-- /src/layouts/MainLayout.vue -->
<!-- ... -->
<q-page-container>
  <keep-alive include="ThePageYouWantToKeepAlive">
    <router-view></router-view>
  </keep-alive>
</q-page-container>
<!-- ... -->

下面的演示将有助于更好地了解情况。

// Source: https://codepen.io/yusufkandemir/pen/zYrZOKx?editors=1010
// Adopted from: https://jsfiddle.net/Linusborg/L613xva0/4/

const Foo = 
    name: 'foo',
  template: '<div><p v-for="n in numbers"> n </p></div>',
  data: function() 
    return 
        numbers: [Math.round(Math.random() * 10), Math.round(Math.random() * 10)]
    
  


const Bar = 
    name: 'bar',
    template: '<div><p v-for="n in numbers"><strong> n </strong></p></div>',
  data: function() 
    return 
        numbers: [Math.round(Math.random() * 10), Math.round(Math.random() * 10)]
    
  


const Baz = 
    name: 'baz',
  components: 
    Foo
  ,
    template: '<div><foo></div>'


const routes = [
   path: '/foo', component: Foo ,
   path: '/bar', component: Bar ,
   path: '/baz', component: Baz 
]

const router = new VueRouter(
  routes
);

const app = new Vue(
  router
).$mount('#app');
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue-router/3.2.0/vue-router.min.js"></script>

<div id="app">
  <ul>
    <router-link to="/foo">
      <li>Go to Foo</li>
    </router-link>
    <router-link to="/bar">
        <li>Go to Bar</li>
    </router-link>
    <router-link to="/baz">
      <li>Go to Baz</li>
    </router-link>
  </ul>

  <keep-alive include="foo">
    <router-view></router-view>
  </keep-alive>
</div>

【讨论】:

【参考方案2】:

需要将表的状态存储在路由或vuex、localStorage的参数中。

【讨论】:

以上是关于Quasar QTable 从子组件返回后丢失状态的主要内容,如果未能解决你的问题,请参考以下文章

Quasar QTable单击可点击行上的操作按钮

在表格单元格中显示复杂内容时,Quasar qTable 的 q-td 上的 Id 值

即使从父组件传递函数后也无法从子组件更改状态

如何从子组件内部设置父组件的状态[重复]

从子组件设置父状态

如何在 ReactJS 中将更改的状态从子组件传递给其父组件