Vue使用中遇到问题汇总(一)32个
1、安装一些需要编译的包:提示没有安装python
、build失败等
因为一些 npm
的包安装需要编译的环境,mac
和 linux
都还好,大多都齐全 。window 用户依赖 visual studio 的一些库
和python 2+,
windows的小伙伴都装上:
2、can't not find 'xxModule'
- 找不到某些依赖或者模块
这种情况一般报错信息可以看到是哪个包抛出的信息。一般卸载这个模块,安装重新安装下即可。
3、data functions should return an object
这个问题是 Vue 实例内,单组件的data
必须返回一个对象。
为什么要 return 一个数据对象呢?
官方解释如下: data 必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例。如果 data 仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象!简言之,组件复用下,不会造成数据同时指向一处,造出牵一发而动全身的破问题。
4、给组件内的原生控件添加事件不生效
<!--比如用了第三方框架,或者一些封装的内置组件; 然后想绑定事件-->
<!--// 错误例子1-->
<el-input placeholder="请输入特定消费金额 " @mouseover="test()"></el-input>
<!--// 错误例子2-->
<router-link :to="item.menuUrl" @click="toggleName=''">
<i :class="['fzicon',item.menuIcon]"></i>
<span>{{item.menuName}}</span>
</router-link>
<!--上面的两个例子都没法触发事件!!!-->
<!--究其原因,少了一个修饰符 .native-->
<router-link :to="item.menuUrl" @click.native="toggleName=''">
<i :class="['fzicon',item.menuIcon]"></i>
<span>{{item.menuName}}</span>
</router-link>
<!--明明官方文档有的,一堆人不愿意去看-->
<!--https://cn.vuejs.org/v2/guide/components.html#给组件绑定原生事件-->
5、在函数内用了this.xxx=
,为什么抛出Cannot set property 'xxx' of undefined;
需要this重定向
这又是this
的套路了,this
是和当前运行的上下文绑定的。一般你在axios
或者其他 promise
, 或者setInterval
这些默认都是指向最外层的全局钩子。简单点说:“最外层的上下文就是 window
,vue内则是 Vue 对象而不是实例!”;
解决方案:
(1)暂存法:函数内先缓存 this
, let that = this;(let是 es6, es5用 var)
(2)箭头函数:会强行关联当前运行区域为 this 的上下文。
6、为什么我的引入的小图片渲染出来却是 data:image/png;base64xxxxxxxx
这个是 webpack 里面的对应插件处理的。对于小于多少 K 以下的图片(规定的格式)直接转为 base64格式渲染;具体配置在webpack.base.conf.js
里面的 rules里面的 url-loader。
这样做的好处:在网速不好的时候先于内容加载和减少http的请求次数来减少网站服务器的负担。
7、Component template shold contain exactly one root element.If you are useing v-if on multiple elements , xxxxx
大体就是说,单组件渲染 DOM 区域必须要有一个根元素,不能出现同级元素。可以用v-if
和v-else-if
指令来控制其他元素达到并存的状态。
换个直白的解释,就是有一个唯一的父类包裹者;比如一个 div(父包含块) 内部多少个同级或者嵌套都行,但是最外层元素不能出现同级元素。
8、跨域问题怎么破!比如No 'Access-Control-Allow-Origin' header is present on the requested resource.
这种问题老生常谈了,我就不细说了,大体说一下:
(1)CORS
,前后端都要对应去配置,IE10+
(2)nginx
反向代理,一劳永逸,线上环境可以用这个
线下开发模式,比如你用了vue-cli
,里面的 webpack 有引入了proxyTable
这么个玩意,也可做接口反向代理
// 在 config 目录下的index.js
proxyTable: {
"/bp-api": {
target: "http://new.d.st.cn",
changeOrigin: true,
// pathRewrite: {
// "^/bp-api": "/"
// }
}
}
// target : 就是 api 的代理的实际路径
// changeOrigin: 就是是变源,必须是...
// pathRewrite : 就是路径重定向,一看就知道
9、为什么我的组件间的样式不能继承或者覆写?
单组件开发模式下,请确认是否开启了 CSS
模块化功能。也就是scoped
(vue-cli 里面配置了,只要加入这个属性就自动启用)
<style lang="scss" scoped></style>
为什么不能继承或者覆写呢,那时因为每个类或者 id 乃至标签都会给自动在css后面添加hash。比如
// 写的时候是这个
.trangle{}
// 编译过后,加上了 hash
.trangle[data-v-1ec35ffc]{}
这些都是在 css-loader 里面配置。
10、路由模式改为history
后,除了首次启动首页没报错,刷新访问路由都报错。
必须给对应的服务端配置查询的主页面,也可以认为是主路由入口的引导。
官方文档也有:传送门 : Vue-Router history Mode
11、Uncaught ReferenceError: xxx is not define
实例内的 data
对应的变量没有声明,你导入模块报这个错误,那绝对是导出没写好,按着导出导入的一个一个去找,绝对能找到问题。
12、Error in render function:"Type Error: Cannot read property 'xxx' of undefined"
这种问题大多都是初始化的姿势不对;比如引入echart
这些,仔细去了解下生命周期,再来具体初始化。
vue 组件有时候也会(嵌套组件或者 props
传递初始化),也是基本这个问题
13、安装模块时命令窗口输出unsupported platform xxx
一般两种情况,node
版本不兼容,系统不兼容。解决方案: 要么不装,要么满足安装要求。
14、Unexpected tab charater
这些
一般是你用脚手架初始化的时候开了 eslint ,要么遵循规则,要么改变规则;要么直接把 webpack 里面的 eslint 检测给关闭了。
15、Failed to mount component: template or render function not defined
组件挂载失败,问题只有这么几个:组件没有正确引入、挂载点顺序错了了;自行动手排查。
16、Unknown custom element: <xxx> - did you register the component correctly?
组件没有正确引入或者正确使用,依次确认:
(1)导入对应的组件
(2)在 components 内声明
(3)在 dom 区域声明标签
17、axios
的 post
请求后台接受不到
axios
默认是 json 格式提交,确认后台是否做了对应的支持。
若是只能接受传统的表单序列化,就需要自己写一个转义的方法。当然还有一个更加省事的方案,装一个小模块qs
//安装
npm install qs -S
// 然后在对应的地方转就行了,单一请求也行,拦截器也行,我是写在拦截器的。
//POST传参序列化(添加请求拦截器)
Axios.interceptors.request.use(
config => {
// 在发送请求之前做某件事
if (
config.method === "post"
) {
// 序列化
config.data = qs.stringify(config.data); // 这里转义
}
// 若是有做鉴权token , 就给头部带上token
if (localStorage.token) {
config.headers.Authorization = localStorage.token;
}
return config;
},
error => {
Message({
showClose: true,
message: error,
type: "error.data.error.message"
});
return Promise.reject(error.data.error.message);
}
);
18、Invalid prop: type check failed for prop "xxx". Expected Boolean, got String.
这种问题一般就是组件内的 props
类型已经设置了接受的范围类型, 而你传递的值却又不是它需要的类型,写代码严谨些。
19、this.$set | this.$xxx
这个 $
是个什么意思
Vue 的$
和 jQuery 的$
并没有半毛钱的关系,就跟javascript
和java
一样。
Vue 的$
是封装了一些 vue 的内建函数,然后导出以$
开头,这显然并不是 jQuery
的专利。
jQuery 的$
是选择器,取得 DOM区域。两者的作用完全不一致。
20、Module not found: Error : Can’t resolve xxx-loader
in xxxx
这里问题一般就是webpack的配置文件你改动了或对应的 loader 没有装上
21、父组件可以直接调用子组件的方法么!
可以,通过$refs
或者$chilren
来拿到对应的实例,从而操作。
22、Error in event handler for "click":"xxx"
这个问题大多都是你写的代码有问题,你的事件触发了,但是组件内部缺少对应的实现或者变量,所以抛出事件错误。解决方案:看着报错慢慢排查
23、组件的通讯有哪几种?
基本最常用的是这三种;
(1)父传子: props
(2)子传父: emit
(3)兄弟通讯:
1>event bus
: 就是找一个中间组件来作为信息传递中介
2>vuex
: 信息树
传送门:
24、既然localStorage
和sessionStorage
能做到数据维护,为什么还要引入vuex
!
这个问题问得好,Vuex
的目的用来维护同级组件间的数据通讯,拥有一个共同的状态树;仅仅活在SPA
的里面的伪多页(路由)内,这种东东明明然localStorage
和sessionStorage
也可以做到,还能做到跨页面数据维护,还不会被浏览器刷新干掉。为什么还要引入 vuex
,我个人觉得原因只有这么一个,“可维护性”和”易用性”,
怎么理解呢?
(1)可维护性:因为是单向数据流,所有状态是有迹可循的,数据的传递也可以及时分发响应
(2)易用性:它使得我们组件间的通讯变得更强大,而不用借助中间件这类来实现不同组件间的通讯
而且代码量不多,若是你要用 ls
或者ss
,你必须手动去跟踪维护你的状态表,虽说可行,但是代码量会多很多,而且可读性很差。
是不是每个项目都需要用到vuex
?
答案是否定的,小型项目上这个反而是累赘,这东西一般是用在中型项目+的,因为里面涉及需要维护的数据比较多,同级组件间的通讯比较频繁。若是用到vuex
的项目记得结合ss
或者ls
来达到某些状态持久化,为什么看下面!
25、vuex的用户信息为什么还要存一遍在浏览器里(sessionStorage or localStorage)
因为 vuex
的 store 干不过刷新啊,保存在浏览器的缓存内,若用户刷新的话,值再取一遍呗。
26、npm run dev 报端口错误:Error: listen EADDRINUSE :::8080
自己用 webpack搭脚手架的都不用我说了,Vue-cli 里面的 webpack 配置: config/index.js
dev: {
env: require("./dev.env"),
port: 8080, // 这里,若是这个端口已经给系统的其他程序占用了,需要改掉
autoOpenBrowser: true,
assetsSubDirectory: "static",
assetsPublicPath: "/",
proxyTable: {
"/bp-api": {
target: "http://new.d.st.cn",
changeOrigin: true,
// pathRewrite: {
// "^/bp-api": "/"
// }
}
},
原因:8080端口被占用,不轻易关闭被占用的端口,将index.js文件中的port改为其他的端口号即可
在一个就是如果你的host是采用ip形式写的话,那么你就要看下你电脑的ip是不是一致的
27、什么时候用v-if
,什么时候用 v-show
!
我们先来说说两者的核心差异:
v-if
:DOM 区域没有生成,没有插入文档,等条件成立的时候才动态插入到页面。
有些需要遍历的数组对象或者值,最好用这货控制,等到拿到值才处理遍历,不然一些操作过快的情况会报错,比如数据还没请求到。
v-show
:DOM 区域在组件渲染的时候同时渲染了,只是单纯用 css 隐藏了。
对于下拉菜单、折叠菜单这些数据基本不怎么变动,用这个最合适了,而且可以改善用户体验,因为它不会导致页面的重绘,DOM 操作会。
简言之:DOM结构不怎么变化的用v-show
,数据需要改动很大或者布局改动的用v-if。
28、单组件中里面的 import xxx from '@/components/layout/xxx'
中的@
是什么意思?
这是 webpack 方面的知识,看到了也说下吧。webpack可以配置alias
(也就是路径别名),玩过 linux 或者 mac 都知道,依旧如上,会自己搭脚手架的不用我说了,看看 vue-cli 里面的,文件名: build -> webpack.base.conf.js
resolve: {
extensions: [".js", ".vue", ".json"], // 可以导入的时候忽略的拓展名范围
alias: {
vue$: "vue/dist/vue.esm.js",
"@": resolve("src"), // 这里就是别名了,比如@就代表直接从/src 下开始找起!!!
"~": resolve("src/components")
}
},
29、Failed to compile with x errors : This dependency was not found !
编译错误,对应的依赖没找到。
解决如下:
(1)知道缺少对应的模块,直接装进去
(2)若是一个你已经安装的大模块(比如 axios)里面的子模块(依赖包)出了问题,卸载重装整个大模块。因为你补全不一定有用。
30、为什么我的 npm
或者 yarn
安装依赖会生成 lock
文件,有什么用!
lock 文件的作用是统一版本号,这对团队协作有很大的作用。若是没有 lock 锁定,根据package.json
里面的^
,~
这些,不同人、不同时间安装出来的版本号不一定一致,有些包甚至有一些breaking change
(破坏性的更新),造成开发很难顺利进行!!!
31、我有个复杂组件需要有新增和编辑的功能同时存在,但是字段要保持不变性怎么破
字段保持不变性怎么理解呢? 就是说比如新增和编辑同时共享一份 data
。
有一种就是路由变了,组件渲染同一个(不引起组件的重新渲染和销毁!),但是功能却不同(新增和编译)。比如从编辑切到新增,data
必须为空白没有赋值的,等待我们去赋值。这时候有个东西就特别适合了,那就是immutable-js,这个东西可以模拟数据的唯一性,或者叫做不变性。
32、Vue PC(桌面)端、M(mobile:移动)端,用什么 UI 框架好?
PC:推荐的只有两个 element UI
和iview
Mobile:推荐Vux
当然还有很多,但是基本用户的认知度都不高,这三个比较流行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律