Nuxt.js中使用keep-alive进行页面缓存相关汇总

前言:在Nuxt.js实际的项目开发过程中可能会遇到各种的使用需求场景,其中很多还是后台管理系统的会比较多,并且多数以分页表格的形式展示数据。主要解决从表格进入详情再返回表格当前数据不变化。

Nuxt.js的官方使用

针对根目录的layouts文件下配置

<template>
  <div>
    <Nuxt keep-alive :keep-alive-props="{ exclude: ['modal'] }" />
  </div>
</template>

<!-- will be converted into something like this -->
<div>
  <KeepAlive :exclude="['modal']">
    <RouterView />
  </KeepAlive>
</div>

针对page下配置

<template>
  <div>
    <NuxtChild keep-alive :keep-alive-props="{ exclude: ['modal'] }" />
  </div>
</template>

<!-- will be converted into something like this -->
<div>
  <KeepAlive :exclude="['modal']">
    <RouterView />
  </KeepAlive>
</div>

管理系统效果

管理系统效果

keep-alive使用无效的解决办法

说明:实际项目中可能由于各种原因keep-alive并不能解决进入详情再返回列表,列表数据并没有得到缓存,可通过以下得到解决。通过组件路由钩子函数处理

  1. 在路由配置列表主表格界面路由给meta增加两个参数
  {
    path: 'modelList',
    component: dynamicWarp(() => import('@/pages/coupon/modelList')),
    name: 'modelList',
    meta: {
      title: 'couponModelList',
      auths: 'cardManagement.maintain',
      keepData: {}, // 需要缓存的数据参数,
      refresh: false, // 是否做刷新处理
    },
  },
  1. 在主表格路由组件添加离开路由对data的值进行缓存
 beforeRouteLeave(to, from, next){
   this.$router.from.meta.keepData = {...this._data}; //把当前data的需求缓存在meta的keepData中
   next();
 }
  1. 主表格路由组件页面对路由进来进行判断是否使用缓存值
  beforeRouteEnter(to, from, next) {
    if (
      to.name === 'modelList' &&   //to为当前的路由信息
      (from.name === 'couponDetail' ||
        from.name === 'couponUnShelf' ||
        from.name === 'couponShelf' ||
        from.name === 'couponAdd' ||
        from.name === 'couponUpdate' ||
        from.name === 'couponDiscard')  //from为前一个路由信息,这是需要做缓存的路由名称
    ) {
      to.meta.refresh = true;
    } else {
      to.meta.refresh = false;
    }
    next();
  },
  1. 在created或者mounted进行数据处理时,判断当前路由是否做刷新而更改请求参数

    生命周期钩子函数使用created使用

 created() {
    const { paging, form, modelTypeVal } = this.$route.meta.keepData;
    if (this.$route.meta.refresh) {
      let parmas = {
        ...paging,
        ...form,
        departmentId: form.departmentId,
        status: form.status,
        type: form.type,
        modelTypeVal,
      };
      this.queryBtn(parmas); //主表格存在是否需要刷新处理,包括搜索条件的赋值
    } else {
      this.queryBtn();
    }
  },

页面组件data包含的参数信息

  data() {
    return {
      ownerDepart: {}, // 所属机构
      rechargeShow: false, // 电子现金劵充值弹窗
      recordShow: false, // 变更记录弹窗
      currentRowData: {}, // 当前选中行的值
      tableLoading: false,
      modelTypeVal: undefined, // 模型类型下拉列表的值
      allTypes: {}, // 从模型类型下拉列表数据中过滤出类型
      typeProps: {
        value: 'id',
        label: 'typeName',
        children: 'childList',
        checkStrictly: true,
      },
      typeOptions: [],
      statusOptions: this.$route.name === 'couponDrafts' ? STATUS_DRAFTS : STATUS,
      // 查询表单
      form: { status: statusAll, departmentId: null, couponTitle: undefined },
      // 分页数据
      total: 0,
      paging: {
        pageIndex: 1,
        pageSize: 10,
      },
      // 表格数据
      tableData: [],
      isDrafs: this.$route.name === 'couponDrafts', // 是否是个人草稿箱
    };
  },

查询按钮的事件判断

  queryBtn(val) {
  //val['pageIndex']是为了给返回当前路由再次点击查询,val会为event时间做判断依据
    if (this.$route.meta.refresh && val['pageIndex']) {  
      this.query(val);
    } else {
      this.query();
    }
  },

请求参数处理

  queryBtn(val) {
  //val['pageIndex']是为了给返回当前路由再次点击查询,val会为event时间做判断依据
    if (this.$route.meta.refresh && val['pageIndex']) {  
      this.query(val);
    } else {
      this.query();
    }
  },

请求接口的事件处理
if条件下的赋值非常重要!!!数据最好为更改后的接口数据,因为详情或者其他界面可以进行数据处理

  async query(val) {
  //if else是为了判断是详情或者其他界面进入还是首次进入主表格界面
    if (val && Object.keys(val).length > 0 && val['pageIndex']) {
      const { couponTitle, departmentId, modelTypeVal, status, type } = val;
      delete val.modelTypeVal;
      let parmas = val;
      if (parmas['status'] === 1010) delete parmas.status;
      this.tableLoading = true;
      const result = await modelList(parmas).finally(() => {
        this.tableLoading = false;
      });
      const { data, total } = result;
      this.paging = {  //为分页的赋值处理
        pageIndex: val.pageIndex,
        pageSize: val.pageSize,
      };
      this.form = { couponTitle, departmentId, status, type };   //为搜索条件的赋值处理
      this.modelTypeVal = modelTypeVal;
      this.total = total;  //为请求接口之后的数据
      this.tableData = data;  //为请求接口之后的数据
    } else {
      const { type, status, departmentId, couponTitle } = this.form;
      const params = {
        ...this.paging,
        departmentId,
        type,
        couponTitle,
      };
      const { id } = this.ownerDepart;
      if (departmentId === null && id !== DEPART_TZ) {
        params.departmentId = `0,${id}`;
      }
      // 模型状态如果不是全部
      if (status !== statusAll) Object.assign(params, { status });
      if (this.isDrafs) {
        Object.assign(params, { userId: this.$store.getters.uid });
      }
      this.tableLoading = true;
      const { data, currentPage, total } = await (this.isDrafs ? draftList : modelList)(
        params,
      ).finally(() => {
        this.tableLoading = false;
      });
      this.tableData = data;
      this.total = total;
      this.paging.pageIndex = currentPage;
    }
  },

总结:遇到问题不用急,沉下心总会有解决的办法。共勉
如有错误/不足,烦请斧正。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要在Nuxt.js使用vue-seamless-scroll,首先需要在plugins目录下创建一个vue-seamless-scroll.js文件,并在文件导入Vue和SeamlessScroll组件,然后使用Vue.use(SeamlessScroll)进行注册。 接下来,在nuxt.config.js文件的plugins配置项添加如下内容: ```javascript plugins: [ '@/plugins/element-ui', '@/plugins/axios', { src: '@/plugins/vue-seamless-scroll', ssr: false }, ] ``` 这样就可以将vue-seamless-scroll插件引入到Nuxt.js项目了。 然后,在需要使用滚动组件的文件使用`<vue-seamless-scroll>`标签,并传入相应的数据和类名等参数。例如: ```html <vue-seamless-scroll :data="runningData" :class-option="scrollOption" class="scroll-container"> <div class="flex-row" v-for="item in runningData" :key="item.id"> <span class="row-1 row-nomal">{{ item.mbShowName }}</span> <span class="row-2 row-nomal">{{ item.mbShowVal }}</span> <span class="row-3 row-nomal">{{ item.updateTime | dateFilter }}</span> </div> </vue-seamless-scroll> ``` 这样就可以在Nuxt.js使用vue-seamless-scroll组件了。 如果你在公司的基于Nuxt.js的项目使用滚动组件后刷新页面出现"window is not defined"的错误,可能是因为滚动组件依赖于浏览器环境,而在服务器端渲染时无法访问到window对象。解决这个问题可以将ssr选项设置为false,如前面的配置所示。这样就可以避免在服务器端渲染时出现该错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [在 Nuxt使用滚动组件 vue-seamless-scroll](https://blog.csdn.net/weixin_44769310/article/details/116144924)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕咕鱼123_blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值