取不到vuex的state中的数据而且不报错(已解决)

记录一下在做硅谷外卖的时候犯的小错误

原来的代码:

vuex-state:

export default {
    adress: {}, // 地址相关信息对象
}

vuex的actions:

async getAddress({commit, state}){
        // 发送 异步 ajax 请求
        const geohash = state.latitude + ',' + state.longitude;
        const result = await reqAddress(geohash)
        if(result.code === 0){
            const  address = result.data
            // 提交一个mutation
            commit('receive_address', {address})
        }
    },

vuex的mutations:

receive_address(state, {address}){
        state.address = address
    },

MSite组件里获取state.address:

  mounted() {
    this.$store.dispatch("getAddress");
  },

computed: {
    // ...mapState(["address]"),
    address(){
      console.log('Msite-computed-address'); // 这里的输出会执行两次
      return this.$store.state.address
    },
  }

此时上述代码会导致MSite组件里的计算属性address= undefined;

为什么呢?
因为 state 里不存在 address 这个属性( state 里写的是 adress )

组件在加载时执行的顺序是 先执行 computed 再执行 mounted

然后在组件加载的时候computed里的计算属性函数会执行一次,

此时 computedaddress中的 return this.$store.state.address返回的是undefined (因为 state 里不存在 address 这个属性),读取的就是一个不存在的值

然后执行 mounted中的this.$store.dispatch("getAddress");
–> 然后执行 commit('receive_address', {address})
–> 然后执行 state.address = address,这句代码就会往state身上添加一个叫 “address” 的属性

我们知道 computed 里的计算属性所依赖的值发生变化时计算属性函数会重新执行一次, 但是 : 由于 计算属性 address 所依赖的值在第一次执行的时候不存在, 所以计算属性address函数监测不到 state中的 address 已然发生改变, 所以 组件里的计算属性 address函数不会再执行一次, 所以计算属性 address 依然还是 undefined

然后 我们把 state 中的代码改成正确的:

export default {
    address: {}, // 地址相关信息对象
}

改完后,重新执行:

组件加载, computed函数执行

计算属性address函数执行, 输出"Msite-computed-address"
address = {};
计算属性address依赖了一个已存在的值 store.address

然后执行 this.$store.dispatch("getAddress");
–> 执行commit('receive_address', {address})
–> 执行 state.address = address;
此时 MSite组件里的计算属性address所依赖的值 store.address 发生了改变, 所以计算属性 address 函数会重新执行一次,
输出Msite-computed-address

此时 计算属性 address 就会获取到 store 里的 address 最新的值, 计算属性address不再是undefined

综上所述

快去检查一下你们的state中的属性名是否写对了吗

<think>嗯,用户在使用Vue3和Vuex时遇到了TypeError: Cannot read properties of undefined (reading 'state')的问题,需要解决。首先,我得回忆一下Vue3和Vuex4的搭配使用方式,因为Vue3和Vuex4有一些变化,可能用户还在用旧的方法导致错误。 根据用户提供的引用[^2],问题可能出在Vuex的安装或引入方式上。Vuex4需要显式地通过useStore来获取store实例,而Vue2中可能直接通过this.$store访问。所以用户可能在组件中直接调用了this.$store,但Vue3中如果没有正确注入,就会导致undefined。 另外,引用[^4]提到state中的某个属性可能是空对象,导致访问深层属性时报错。这可能也是用户的问题,但结合错误信息中的'state',更可能是store实例未正确获取。 首先,我需要检查用户是否正确安装了Vuex4,因为Vue3兼容Vuex3。安装命令应该是npm install vuex@next。然后,在创建store时,Vuex4使用createStore方法,而是原来的new Vuex.Store,所以用户的项目中可能还在使用旧语法,导致store未被正确创建。 接下来,在main.js中,用户需要将store实例通过app.use(store)挂载到Vue应用中。如果漏掉了这一步,组件中就无法访问到store,导致this.$store为undefined。 在组件中,Vue3的组合式API需要使用useStore()获取store实例,而是直接使用this.$store。如果用户还在选项式API中,可能需要检查是否正确地注入了store。此外,如果用户使用了模块化的store,需要确保模块被正确注册,命名空间路径正确。 还有可能用户在访问state时,没有使用计算属性或响应式引用,导致在初始渲染时state还未被填充,从而引发错误。应该建议用户使用computed或者确保state有默认。 总结可能的解决方案步骤:检查Vuex版本,确认使用createStore和正确挂载,组件中使用useStore获取实例,检查模块配置,使用计算属性或可选链操作符避免未定义错误。</think>### Vue3中使用Vuex报错`Cannot read properties of undefined (reading 'state')`的解决方案 #### 一、核心原因分析 该错误通常发生在以下场景: 1. **Vuex未正确初始化**:Vue3需使用`createStore`创建实例并通过`app.use()`挂载 2. **组件获取store实例**:Vue3再自动注入`this.$store`,需显式调用`useStore()` 3. **异步数据未初始化**:访问未初始化的state属性导致报错,如空对象访问嵌套属性[^4] #### 二、具体解决步骤 1. **安装正确版本** ```bash npm install vuex@next ``` 2. **创建store实例(store/index.js)** ```javascript import { createStore } from 'vuex' export default createStore({ state: { user: null, goods: {} }, mutations: { /* ... */ }, actions: { /* ... */ } }) ``` 3. **挂载到Vue实例(main.js)** ```javascript import { createApp } from 'vue' import App from './App.vue' import store from './store' const app = createApp(App) app.use(store) app.mount('#app') ``` 4. **组件中正确使用(组合式API示例)** ```javascript import { useStore } from 'vuex' export default { setup() { const store = useStore() // 访问state建议使用计算属性 const user = computed(() => store.state.user) return { user } } } ``` 5. **添加状态默认(预防空报错)** ```javascript state: { goods: { categoryView: {} // 初始化空对象 } } ``` 6. **安全访问建议** ```javascript // 使用可选链操作符 computed: { categoryName() { return this.$store.state.goods?.categoryView?.name || '默认名称' } } ``` #### 三、常见错误排查 | 错误场景 | 解决方案 | |---------|---------| | 直接访问未初始化的state | 添加空对象初始化或使用`||`设置默认 | | 在异步回调中访问state | 使用`computed`属性或添加`v-if`条件渲染 | | 模块化store路径错误 | 检查模块命名空间注册路径是否匹配 | | 混合使用Vue2/Vue3语法 | 统一使用`createStore`和`useStore` |
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值