Vue使用中遇到问题汇总(一)32个
2018-04-23 11:46
344 查看
1、安装一些需要编译的包:提示没有安装
因为一些
windows-build-tools
python 2.x
2、
这种情况一般报错信息可以看到是哪个包抛出的信息。一般卸载这个模块,安装重新安装下即可。
3、
这个问题是 Vue 实例内,单组件的
为什么要 return 一个数据对象呢?
官方解释如下: data 必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例。如果 data 仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象!简言之,组件复用下,不会造成数据同时指向一处,造出牵一发而动全身的破问题。
4、给组件内的原生控件添加事件不生效
5、在函数内用了
需要this重定向
这又是
解决方案:
(1)暂存法:函数内先缓存
(2)箭头函数:会强行关联当前运行区域为 this 的上下文
6、为什么我的引入的小图片渲染出来却是
这个是 webpack 里面的对应插件处理的。对于小于多少 K 以下的图片(规定的格式)直接转为 base64格式渲染;具体配置在
7、
大体就是说,单组件渲染 DOM 区域必须要有一个根元素,不能出现同级元素。可以用
换个直白的解释,就是有一个唯一的父类包裹者;比如一个 div(父包含块) 内部多少个同级或者嵌套都行,但是最外层元素不能出现同级元素。
8、跨域问题怎么破!比如
这种问题老生常谈了,我就不细说了,大体说一下:
(1)
线下开发模式,比如你用了
9、为什么我的组件间的样式不能继承或者覆写?
单组件开发模式下,请确认是否开启了
为什么不能继承或者覆写呢,那时因为每个类或者 id 乃至标签都会给自动在css后面添加hash。比如
这些都是在 css-loader 里面配置。
10、路由模式改为
必须给对应的服务端配置查询的主页面,也可以认为是主路由入口的引导。
官方文档也有:传送门 : Vue-Router history Mode
11、
实例内的
12、
这种问题大多都是初始化的姿势不对;比如引入
vue 组件有时候也会(嵌套组件或者
13、安装模块时命令窗口输出
一般两种情况
14、
一般是你用脚手架初始化的时候开了 eslint ,要么遵循规则,要么改变规则;要么直接把 webpack 里面的 eslint 检测给关闭了。
15、
组件挂载失败,问题只有这么几个:组件没有正确引入、挂载点顺序错了了;自行动手排查。
16、
组件没有正确引入或者正确使用,依次确认:
(1)导入对应的组件
(2)在 components 内声明
(3)在 dom 区域声明标签
17、
若是只能接受传统的表单序列化,就需要自己写一个转义的方法。当然还有一个更加省事的方案,装一个小模块
18、
这种问题一般就是组件内的
19、
Vue 的
Vue 的
jQuery 的
20、Module not found: Error : Can’t resolve
这里问题一般就是webpack的配置文件你改动了或对应的 loader 没有装上
21、父组件可以直接调用子组件的方法么!
可以,通过
22、
这个问题大多都是你写的代码有问题,你的事件触发了,但是组件内部缺少对应的实现或者变量,所以抛出事件错误。解决方案:看着报错慢慢排查
23、组件的通讯有哪几种?
基本最常用的是这三种;
(1)父传子:
(2)子传父:
(3)兄弟通讯:
1>
2>
传送门:
基本通讯
Vuex
24、既然
这个问题问得好,
怎么理解呢?
(1)可维护性:因为是单向数据流,所有状态是有迹可循的,数据的传递也可以及时分发响应
(2)易用性:它使得我们组件间的通讯变得更强大,而不用借助中间件这类来实现不同组件间的通讯
而且代码量不多,若是你要用
是不是每个项目都需要用到
答案是否定的,小型项目上这个反而是累赘,这东西一般是用在中型项目+的,因为里面涉及需要维护的数据比较多,同级组件间的通讯比较频繁。若是用到
25、vuex的用户信息为什么还要存一遍在浏览器里(sessionStorage or localStorage)
因为
26、npm run dev 报端口错误:
自己用 webpack搭脚手架的都不用我说了,Vue-cli 里面的 webpack 配置: config/index.js
原因:8080端口被占用,不轻易关闭被占用的端口,将index.js文件中的port改为其他的端口号即可
在一个就是如果你的host是采用ip形式写的话,那么你就要看下你电脑的ip是不是一致的
27、什么时候用
我们先来说说两者的核心差异:
有些需要遍历的数组对象或者值,最好用这货控制,等到拿到值才处理遍历,不然一些操作过快的情况会报错,比如数据还没请求到。
对于下拉菜单、折叠菜单这些数据基本不怎么变动,用这个最合适了,而且可以改善用户体验,因为它不会导致页面的重绘,DOM 操作会。
简言之:DOM结构不怎么变化的用
28、单组件中里面的
这是 webpack 方面的知识,看到了也说下吧。webpack可以配置
29、
编译错误,对应的依赖没找到。
解决如下:
(1)知道缺少对应的模块,直接装进去
(2)若是一个你已经安装的大模块(比如 axios)里面的子模块(依赖包)出了问题,卸载重装整个大模块。因为你补全不一定有用。
30、为什么我的
lock 文件的作用是统一版本号,这对团队协作有很大的作用。若是没有 lock 锁定,根据
31、我有个复杂组件需要有新增和编辑的功能同时存在,但是字段要保持不变性怎么破
字段保持不变性怎么理解呢? 就是说比如新增和编辑同时共享一份
有一种就是路由变了,组件渲染同一个(不引起组件的重新渲染和销毁!),但是功能却不同(新增和编译)。比如从编辑切到新增
32、Vue PC(桌面)端、M(mobile:移动)端,用什么 UI 框架好?
PC:推荐的只有两个
Mobile:推荐
当然还有很多,但是基本用户的认知度都不高,这三个比较流行
python、build失败等
因为一些
npm的包安装需要编译的环境,
mac和
linux都还好,大多都齐全 。window 用户依赖
visual studio 的一些库和
python 2+,windows的小伙伴都装上:
windows-build-tools
python 2.x
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-loaderin 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: 信息树
传送门:
基本通讯
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
当然还有很多,但是基本用户的认知度都不高,这三个比较流行
相关文章推荐
- Vue使用中遇到问题汇总(三)
- Vue使用中遇到问题汇总(二)
- 当使用Vue开发前端遇到的问题及解决办法汇总
- vue使用遇到问题汇总
- win8系统使用时遇到的常见问题汇总及解答
- 【汇总】iOS开发及Xcode使用中遇到的一些报错问题汇总
- CGI和BOA使用期间遇到的问题汇总(转)
- CGI和BOA使用期间遇到的问题汇总
- REVIT使用中遇到的各种问题汇总
- 使用WebDriver遇到的一些问题汇总
- RobotFramework+Selenium2library使用遇到的问题汇总
- tomcat使用遇到问题汇总
- (笔记)Linux下的CGI和BOA使用期间遇到的问题汇总
- CGI和BOA使用期间遇到的问题汇总
- Ubuntu 14.4 使用中遇到的问题汇总
- CGI和BOA使用期间遇到的问题汇总(转)
- 视频监控(B/S模式下)CGI和BOA使用期间遇到的问题汇总
- 使用kettle工具遇到的问题汇总及解决方案
- 使用10.04过程中遇到了很多中文问题,都解决了,汇总下来供大家参考
- 使用WebDriver遇到的一些问题汇总