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

如何阻止Vite热重载清除Vue3中的变量状态?

解决Vite热重载后Vue3 Ref数据丢失的问题

问题原因

Vite的热重载机制会重新加载修改后的模块文件,你在my-file.ts里导出的items是模块级的ref变量,每次模块重新执行都会创建新的空数组实例,之前通过loadItems加载的数据自然会丢失。

解决方案

1. 使用全局状态管理库(推荐)

将状态迁移到Pinia或Vuex这类全局状态管理工具中,它们的状态实例不会随模块热重载而重置,能稳定保留数据。

以Pinia为例,创建一个store:

// stores/itemStore.ts
import { defineStore } from 'pinia'
import axios from 'axios'

export const useItemStore = defineStore('items', {
  state: () => ({
    list: [] as string[]
  }),
  actions: {
    async loadItems() {
      this.list = await axios.get(...)
    }
  }
})

在组件或入口文件中使用:

import { useItemStore } from '@/stores/itemStore'
const itemStore = useItemStore()
// 应用启动时调用
itemStore.loadItems()

2. 利用Vite热更新API手动保存状态

如果不想引入状态管理库,可以通过Vite提供的import.meta.hotAPI在热重载时保存和恢复数据:

// my-file.ts
import { ref } from 'vue'
import axios from 'axios'

export const items = ref<string[]>([])
export async function loadItems() {
  items.value = await axios.get(...)
}

// 热重载时处理状态
if (import.meta.hot) {
  // 卸载模块前保存当前数据
  import.meta.hot.dispose(data => {
    data.items = items.value
  })
  // 接受更新后恢复数据
  import.meta.hot.accept((newModule) => {
    if (newModule?.items) {
      newModule.items.value = import.meta.hot.data?.items || []
    }
  })
}

3. 持久化到浏览器本地存储

把数据存在localStorage或sessionStorage中,初始化时从存储中读取,热重载后数据会自动恢复:

// my-file.ts
import { ref } from 'vue'
import axios from 'axios'

const STORAGE_KEY = 'app_items'
// 初始化时从localStorage读取数据
export const items = ref<string[]>(JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]'))

export async function loadItems() {
  const res = await axios.get(...)
  items.value = res.data
  // 加载成功后保存到localStorage
  localStorage.setItem(STORAGE_KEY, JSON.stringify(items.value))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:38:14