You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vuetify折叠面板:用sessionStorage存状态,避免触发watch监听器

解决方法

核心思路是给组件加一个初始化完成的标记,只在用户手动操作面板时才触发sessionStorage存储,避免初始化阶段的赋值触发监听。

步骤1:添加初始化状态标记

在组件的data中新增一个isInitialized变量,初始值设为false:

data() {
  return {
    panel: this.expand ? [0] : [1],
    isInitialized: false // 新增初始化完成标记
  }
}

步骤2:完成初始化后更新标记

在mounted钩子的最后,将isInitialized设为true,表示组件初始化流程结束,后续的panel变化都属于用户手动操作:

mounted: function () {
  this.getTimesheetsKpis();
  if (sessionStorage.getItem("analyticsSession") !== null) {
    var analyticsSession = JSON.parse(
      sessionStorage.getItem("analyticsSession")
    );
    var currentDate = moment(new Date());
    var sessionDate = analyticsSession.date;

    var duration = moment.duration(currentDate.diff(sessionDate));
    var hours = duration.asHours();
    console.log("hours", hours);
    var secs = duration.asSeconds();
    console.log("secs", secs);

    if (secs > 45 /* hours >= 12 */) {
      console.log("session expired");
      sessionStorage.removeItem("analyticsSession");
    } else {
      this.panel = analyticsSession.panel;
    }
  }
  // 新增:初始化完成后更新标记
  this.isInitialized = true;
},

步骤3:修改watch监听器的触发条件

更新watch的handler,只有当isInitialized为true,且面板状态确实发生变化时,才执行存储操作。同时修正原代码中错误的判断逻辑(oldVal.length !== newVal是笔误,应该对比数组长度):

watch: {
  panel: {
    handler(newVal, oldVal){
      console.log(oldVal.length, newVal.length)
      // 仅在初始化完成且状态真的变化时触发存储
      if(this.isInitialized && oldVal.length !== newVal.length){
        console.log("panel watcher", newVal, oldVal);
        this.setSessionStorage();
      }
    }
  },
}

额外提示

你代码里用secs > 45作为过期测试条件,正式环境记得改回hours >= 12,避免逻辑错误。

内容的提问来源于stack exchange,提问作者Fabian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:55:18