初学者使用Vuex 遇到的问题及解决方案 (自己在项目中遇到的问题及解决方法)

333 阅读1分钟

1. 在组件中,怎么获取 通过mutations改变的 state数据

  • 组件中的使用
methods: {
    //    字体大小设置
    setFontSize(fontSize) {
        this.$store.commit('setFontSize', fontSize)
    }
}
  • Vuex
mutations: {
    setFontSize(state, payload) {
            state.defaultFontSize = payload
    },
}
问题:想要在组件中 获取 mutations 改变的state里的数据defaultFontSize
  • 容易掉的坑: 在组件的data里获取数据

    data() {
        return {
            defaultFontSize: this.$store.state.defaultFontSize
        }
    }
    
    

    这种方法确实可以获得defaultFontSize 的值,但是不能动态的获取,也就是说这里的得到的defaultFontSize不会改变

    因为data 中的内容只会在 created 钩子触发前初始化一次,这时属性的值是纯粹的字面量,JS 字面量赋值后显然不会自动更新

  • 解决方法: 在computed里获取数据

    computed 是通过【依赖追踪】实现的,在 computed 求值时引用的 Vue 变量变化时,会触发对 computed 的重新计算。可以使用 computed 去引用 Vuex 状态变量,从而使得依赖追踪生效。

    computed: { 
        defaultFontSize() {
            return this.$store.state.defaultFontSize
        }  
    },
    

2.获取state 的数据 在组件的方法中使用

在上面的问题我们解决了动态获取state数据的问题,但是在项目中,发现想要在组件的方法中使用这个数据,又出现了无法动态获取state数据的问题

查阅一些相关资料,解决办法如下:

在组件内,监听全局参数的变化,参数变化后调用组件内需要触发的函数

watch: {
        defaultFontSize (newVal, oldVal) {
            // 数据变化后调用setFontSize()
            this.setFontSize()
        }
},

资料来源:

  1. 关于动态获取vuex state 使用computed 而不是data:segmentfault.com/q/101000000…
  2. 监听全局参数的变化blog.csdn.net/sinat_42684…