vuex中getter的使用

vuex中getter的主要目的是为了数据过滤,得到自己想要的数据,先说如果不使用getters,功能一样可以完成,使用...mapstate,直接请看下图:

 看,当前组件是可以获取到goodInfo下的spuSaleAttrList的,但是麻烦点有两个

1.要保证你写的路径是正确的,由于路径过长,极有可能出错,影响开发效率,你要确定是哪个小仓库(模块化思想)

2.代码冗长,本可以使用getters当然能用最少的代码避免不必要的问题是最优选择

让我们来看看getters的优点吧!直接看下图:

 直接这么写肯定得不到效果,我们要在vuex的getters对象中配置

// 利用getter简化路径
const getters = {
     // 产品售卖属性的变化
    spuSaleAttrList(state){
        return state.goodInfo.spuSaleAttrList||[]
    }
}

步骤:

        1.先将请求成功的数据保存至state中,例如goodInfo:

   我们打印出发现想要的数据在goodInfo下的spuSaleAttrList

        2.在getters中简化代码,和计算属性写法相同,也是需要返回值,并且数据没有来得及返回所以要默认定义为空数组或者空对象(这要依据返回的数据类型)

const getters = {
     // 产品售卖属性的变化
    spuSaleAttrList(state){
        return state.goodInfo.spuSaleAttrList||[]
    }
}

        3.在需要数据的组件引入mapGetters

                import {mapGetters} from 'vuex'

        4.在计算属性中使用,注意,mapGetters的参数是一个数组,而mapState的参数是一个对象

                computed:{

                        ...mapGetters(['spuSaleAttrList'])

                        },

这样数据就在组件身上了!

### Vuex 数据在控制台可打印但在使用时无值的原因及解决方案 #### 1. 页面刷新导致的数据丢失 由于 Vuex 中的数据保存在运行内存中,当页面刷新时,页面会重载 Vue 实例,Vuex 中的数据会被重新赋值[^1]。因此,在页面刷新后,即使之前通过 `console.log` 能够看到数据,实际操作时可能会发现数据已经丢失。 为了防止这种情况发生,建议使用持久化插件来保持状态不随页面刷新而消失。例如,可以使用 `vuex-persistedstate` 插件: ```javascript import createPersistedState from 'vuex-persistedstate'; const store = new Vuex.Store({ plugins: [createPersistedState()] }); ``` #### 2. 异步操作未完成前访问 state 如果在异步操作(如 API 请求)尚未完成的情况下尝试读取 state 的值,则可能遇到 undefined 或者旧版本的状态。确保所有的异步调用都已完成再进行后续处理非常重要。 对于异步 action,应该等待其返回后再继续执行其他逻辑。可以通过 `async/await` 来简化这一过程: ```javascript export default { async mounted() { await this.fetchData(); // 确保 fetchData 完成后再往下走 console.log(this.$store.state.someData); }, methods: { ...mapActions(['fetchData']) } } ``` #### 3. Getter 和 Computed Property 缓存问题 有时直接从 store 获取的数据可能是缓存的结果而不是最新的更新后的结果。此时应当考虑利用 Vuex 提供的 getter 功能来代替直接访问 state 属性[^2]: ```javascript computed: { someComputedValue () { return this.$store.getters['module/someGetter']; } }, ``` 这样不仅可以获得更灵活的数据转换能力,还能有效避免因计算属性缓存带来的潜在问题。 #### 4. Service 文件中正确引入 Store 针对服务端文件 (service.js),想要获取 Vuex 的 state 需要先导入整个 store 对象并将其传递给需要使用的模块或方法[^4] : ```javascript // main.js 初始化应用时创建全局变量 $store Vue.prototype.$store = store; // service.js 导入 vue 并初始化 import Vue from 'vue'; function getServiceData(){ const currentState = Vue.prototype.$store.state; // 进一步的操作... } export default getServiceData; ``` 另一种更好的做法是在项目启动阶段就将 store 注册为全局依赖注入器的一部分,从而让任何地方都能方便地拿到当前的应用上下文环境下的 store 实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值