Uncaught TypeError: Object(...) is not a function at resetStoreState (vuex.esm-browser.js?5502:1

博客内容讲述了在Vue2项目中遇到Vuex版本不匹配的问题,导致控制台出现`Uncaught TypeError`错误。问题源于尝试使用Vue3匹配的Vuex4版本,而项目实际使用的是Vue2。解决方案是通过卸载Vuex4并安装Vue2兼容的Vuex3版本。此外,还遇到了`@vue/cli-plugin-babel`缺失的问题,解决方法是先下载所有依赖,再运行`npm run serve`启动项目。博客提供了详细的错误信息、源码片段和解决步骤。

目录

原因:Vue 2.x和Vuex 4.x版本不对应

同样的问题也会出现在vue-router等依赖包上

问题

控制台报错

vuex源码报错

google浏览器源代码

 VSCode

解决

补充:运行Vue项目


原因:Vue 2.x和Vuex 4.x版本不对应

 Vue 3 匹配 Vuex 4 ,Vue 2 匹配 Vuex 3 

Vuex 是什么? | Vuexicon-default.png?t=M1H3https://vuex.vuejs.org/zh/

 

问题

控制台报错

Uncaught TypeError: Object(...) is not a function
    at resetStoreState (vuex.esm-browser.js?5502:140:1)
    at new Store (vuex.esm-browser.js?5502:932:1)
    at eval (index.js?4360:48:1)
    at Module../src/store/index.js (index.js:1115:1)
    at __webpack_require__ (index.js:849:30)
    at fn (index.js:151:20)
    at eval (main.js:13:64)
    at Module../src/main.js (index.js:1103:1)
    at __webpack_require__ (index.js:849:30)
    at fn (index.js:151:20)

vuex源码报错

google浏览器源代码

store._state = reactive({
    data: state
  });

 VSCode

模块 ""vue"" 没有导出的成员 "XXX"。你是想改用 "import XXX from "vue"" 吗?ts(2614)

解决

npm先卸载Vuex 4.xx

npm uninstall vuex --save

安装Vuex 3.xx

npm install vuex@3 --save

补充:运行Vue项目

运行npm run serve报错

PS C:\Users\lenovo\Desktop\test\vue_test> npm run serve

> vue_test@0.1.0 serve C:\Users\lenovo\Desktop\test\vue_test
> vue-cli-service serve

internal/modules/cjs/loader.js:883
  throw err;
  ^

Error: Cannot find module '@vue/cli-plugin-babel'
Require stack:
- C:\Users\lenovo\AppData\Roaming\npm\node_modules\@vue\cli-service\lib\Service.js
- C:\Users\lenovo\AppData\Roaming\npm\node_modules\@vue\cli-service\bin\vue-cli-service.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    at Function.Module._load (internal/modules/cjs/loader.js:725:27)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at idToPlugin (C:\Users\lenovo\AppData\Roaming\npm\node_modules\@vue\cli-service\lib\Service.js:172:14)
    at C:\Users\lenovo\AppData\Roaming\npm\node_modules\@vue\cli-service\lib\Service.js:211:20
    at Array.map (<anonymous>)
    at Service.resolvePlugins (C:\Users\lenovo\AppData\Roaming\npm\node_modules\@vue\cli-service\lib\Service.js:198:10)
    at new Service (C:\Users\lenovo\AppData\Roaming\npm\node_modules\@vue\cli-service\lib\Service.js:35:25)
    at Object.<anonymous> (C:\Users\lenovo\AppData\Roaming\npm\node_modules\@vue\cli-service\bin\vue-cli-service.js:15:17) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    'C:\\Users\\lenovo\\AppData\\Roaming\\npm\\node_modules\\@vue\\cli-service\\lib\\Service.js',
    'C:\\Users\\lenovo\\AppData\\Roaming\\npm\\node_modules\\@vue\\cli-service\\bin\\vue-cli-service.js'
  ]
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! vue_test@0.1.0 serve: `vue-cli-service serve`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the vue_test@0.1.0 serve script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm WARN Local package.json exists, but node_modules missing, did you mean to install?

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\lenovo\AppData\Roaming\npm-cache\_logs\2022-02-20T10_29_07_846Z-debug.log

问题描述

因为Vue项目的依赖包(node_modules)太大,一般上传、下载时忽略,

可以根据 package.json 进行下载安装

解决办法

先下载依赖包

npm i

在运行

npm run serve  

你遇到的错误是: ``` Uncaught TypeError: receiverRef.value?.focus is not a function ``` 这个错误说明你在尝试调用 `receiverRef.value.focus()` 的时候,`receiverRef.value` 并不是一个具有 `focus()` 方法的对象。 --- ## ✅ 问题原因分析 你可能在 `<el-cascader>` 或其他组件上使用了 `ref="receiverRef"`,但你尝试调用 `.focus()` 的时候失败了。 ### 原因如下: - `el-cascader` 是一个组件,它本身 **不提供 `focus()` 方法**。 - `ref.value` 拿到的是组件实例,**不是 DOM 元素**。 - 如果你想要聚焦到 `el-cascader` 的 `<input>` 元素,**你需要手动查询 DOM**。 --- ## ✅ 正确做法:聚焦 `el-cascader` 的 `<input>` 元素 ### ✅ 解决方案一:使用 `querySelector` 获取 input 并聚焦(推荐) ```ts const focusCascaderInput = async (refName) => { await nextTick(); // 确保 DOM 已更新 const el = refName?.value?.$el?.querySelector('input'); if (el) { el.focus(); } }; ``` #### ✅ 使用示例: ```ts if (!formData.value.receive_id) { HsMessage.error('请选择领用人'); focusCascaderInput(receiverRef); return false; } ``` --- ### ✅ 解决方案二:使用 `el-form` 的 `validateField`(如果你用了 el-form) 如果你用了 `el-form`,可以使用它来聚焦错误字段: ```ts const formRef = ref(); // 对应 el-form 的 ref formRef.value.validateField('receive', (errorMessage, invalidFields) => { if (errorMessage) { focusCascaderInput(receiverRef); } }); ``` --- ## ✅ 完整示例代码 ### ✅ `<template>` 中 ```vue <el-cascader v-model="formData.receive" ref="receiverRef" :options="userOptions" :props="{ expandTrigger: 'hover' }" /> ``` ### ✅ `<script setup>` 中 ```ts import { ref, nextTick } from 'vue'; const receiverRef = ref(); // 工具函数:聚焦 el-cascader 内部的 input const focusCascaderInput = async (refName) => { await nextTick(); const el = refName?.value?.$el?.querySelector('input'); if (el) { el.focus(); } }; // 工具函数:滚动到指定元素 const scrollToElement = (refName) => { const el = refName?.value?.$el; if (el && el.scrollIntoView) { el.scrollIntoView({ behavior: 'smooth', block: 'center' }); } }; // 校验方法 const validateForm = () => { const errors = []; if (!formData.value.receive_id) { errors.push({ field: 'receive', message: '请选择领用人' }); } if (errors.length > 0) { const firstError = errors[0]; HsMessage.error(firstError.message); switch (firstError.field) { case 'receive': scrollToElement(receiverRef); focusCascaderInput(receiverRef); break; } return false; } return true; }; ``` --- ## ✅ 总结:为什么 `receiverRef.value?.focus()` 不行? | 原因 | 说明 | |------|------| | `focus()` 不是组件实例的方法 | `receiverRef.value` 是组件实例,不是 DOM | | `el-cascader` 没有暴露 `focus()` | 它不支持 `ref.focus()`,需要手动查找 input | | 推荐使用 `querySelector('input')` | 这是聚焦 `el-cascader` 的标准方式 | --- ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z6q6k6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值