Vue3 watch 不可以监听vuex和localstorage吗,监听localstorage不生效,监听vuex报错state

Vue3 watch 不可以监听vuex和localstorage吗,监听localstorage不生效,监听vuex报错state

img

该回答采用chatgpt:

Vue3 中的 watch API 可以监听 Vue 实例中的响应式数据变化,但是对于 VuexLocalStorage 变化的监听需要特殊处理。

对于 Vuex 的监听,可以使用 computed 属性来获取状态值,并在 watch 监听该 computed 属性的变化。例如:
javascript
import { computed, watch } from 'vue'
import { useStore } from 'vuex'

export default {
  setup() {
    const store = useStore()

    // 创建一个计算属性,获取需要监听的状态值
    const stateValue = computed(() => store.state.value)

    // 监听 stateValue 的变化
    watch(stateValue, (newValue, oldValue) => {
      console.log('state value changed:', newValue)
    })

    // ...
  }
}
对于 LocalStorage 的监听,可以使用浏览器提供的 window.localStorage API 来监听。例如:
javascript
import { watch } from 'vue'

export default {
  setup() {
    // 监听 localStorage 的变化
    watch(
      () => window.localStorage.getItem('key'),
      (newValue, oldValue) => {
        console.log('local storage changed:', newValue)
      }
    )

    // ...
  }
}
需要注意的是,如果在 watch 监听函数中修改了 localStorage 或者 Vuex 状态值,会导致循环依赖的问题,因此需要避免这种情况的发生。

localstorage不能被监听是因为没有对localstorage进行数据劫持,这里报错是说state没有定义,是不是导入有问题


import { onMounted, watch } from 'vue'

export default {
  name: 'MyComponent',
  mounted () {
    // 监听 Vuex 状态变化
    this.$store.watch(
      (state) => state.myState,
      (newVal, oldVal) => {
        console.log('Vuex 状态变化', newVal, oldVal)
      }
    )

    // 监听 LocalStorage 变化
    onMounted(() => {
      this.$nextTick(() => {
        window.addEventListener('storage', (e) => {
          if (e.key === 'myKey') {
            console.log('LocalStorage 变化', e.newValue, e.oldValue)
          }
        })
      })
    })
  }
}

  • 你看下这篇博客吧, 应该有用👉 :vuex结合localStorage的使用方法
  • 除此之外, 这篇博客: 在Vue中使用 localStorage中的 和vuex的对比 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

      用法: https://vuex.vuejs.org/zh/

    • 区别 

      (1)vuex存储在内存,在vue项目中用vuex来做全局的状态管理, 发现当刷新网页后,保存在vuex实例store里的数据会丢失
      (2)localstorage(本地存储)则以文件的方式存储在本地,永久保存;
      (3)sessionstorage( 会话存储 ) ,临时保存。

      (4)localStorage和sessionStorage只能存储字符串类型,对于复杂的对象可以使用ECMAScript提供的JSON对象的 stringify 和 parse 来处理

       

    • 应用场景:vuex用于组件之间的传值,localstorage,sessionstorage则主要用于不同页面之间的传值。
    • 永久性:当刷新页面(这里的刷新页面指的是 --> F5刷新,属于清除内存了)时vuex存储的值会丢失,sessionstorage页面关闭后就清除掉了,localstorage不会。  
    • 注:很多同学觉得用localstorage可以代替vuex, 对于不变的数据确实可以,但是当两个组件共用一个数据源(对象或数组)时,如果其中一个组件改变了该数据源,希望另一个组件响应该变化时,localstorage,sessionstorage无法做到,原因就是区别1

     

  • 您还可以看一下 周新老师的Vue2.x经典后台管理系统案例讲解课程中的 localstorage本地数据存储小节, 巩固相关知识点

总结,箭头函数导致无法访问到useStore()在外部 const store = useStore()解决