Vue 项目中常遇到的问题
刷新页面,传的参数类型变了
问题描述
vue-router
通过query
传参,比如:?fromWork=true&extraType=1
,传过去的fromWork
是boolean
型,extraType
是number
型,但是当刷新页面时,拿到的参数都变成了字符串。
解决方式
拿到参数后进行类型转换
用boolean型用
0/1
代替,如果需要number
型,则在页面转换
页面合并时,各个组件样式冲突
问题描述
比如两个组件都设有background-color
,一个为red
,另一个为green
,都在App页面中引入使用了。页面渲染时会发生合并,样式冲突。后引入的组件样式会覆盖先引入的组件样式。
解决方式
在
css
中引入scoped
v-if 与 v-for 同时使用会报错
问题描述
在进行项目开发的时候因为在一个标签上同时使用了v-for和v-if两个指令导致的报错。
提示错误:The 'undefined' variable inside 'v-for' directive should be replaced with a computed property that returns filtered array instead. You should not mix 'v-for' with 'v-if'
v-for 的优先级比 v-if 的高,所以每次渲染时都会先循环再进条件判断,而又因为 v-if 会根据条件为 true 或 false来决定渲染与否的,所以如果将 v-if 和 v-for一起使用时会特别消耗性能,如果有语法检查,则会报语法的错误。
解决方式
将 v-for 放在外层嵌套 template (页面渲染不生成 DOM节点) ,然后在内部进行 v-if 判断
<template v-for="Oitem in Object.keys(cItem)">
<el-input
type="textarea"
:autosize="{ minRows: 2, maxRows: 8}"
:key="Oitem" // 注意点:key值写在包裹的元素中
v-if="Oitem !== 'title'"
v-model="cItem[Oitem]">
</el-input>
</template>
如果条件出现在循环内部,不得不放在一起,可通过计算属性computed 提前过滤掉那些不需要显示的项
key属性值要唯一,且不是index
问题描述
vue中使用 v-if
和v-for
要加上key属性,否则在高版本的vue中控制台会报错。这个Key是一个唯一值,不能是index。key一般应用在v-if
和v-for
中更新渲染时,它们都是默认“就地复用” 的策略。
解决方案
使用index 作为 key和没写基本上没区别,因为不管数组的顺序怎么颠倒,index 都是 0, 1, 2...这样排列,导致 Vue 会复用错误的旧子节点,做很多额外的工作。
需要深拷贝数组或对象
问题描述
对象或数组的简单赋值,修改新值也会改变原值。这时我们需要获取原值的深拷贝对象。
解决方案
对于对象,可以通过
newObj = JSON.parse(JSON.stringfy(obj))
实现。对于数组,可以通过
newArr = […arr]
或者newArr = arr.slice(0)
来实现。
vue 2.0 修改对象属性
问题描述
在vue 2.0 中,由于Object.defineproperty() 的弊端,给对象新增属性,删除属性,或者对象属性又是一个对象的时候,无法被监听到,页面不会被更新。
解决方案
vue 3.0 中使用Proxy 解决了这个问题。
使用Vue.$set() 进行修改。
对数组对象,进行深度监听
问题描述
后端传过来的数组每一项都是对象,当对象的属性变化时调用某个函数,自然想到就是watch
方法。但如何watch
数组对象中某一个具体的属性,显然不可能一个个属性写watch
。
解决方案
watch
整个数组,设置deep
为true
,当该对象发生改变时,调用处理函数。将页面中绑定的属性写在
computed
函数中,watch
这个computed
中的函数,当对象值改变时会进入computed
函数中,进而进入watch
函数中,再调用处理函数。
样式切换时,动态增加class
问题描述
当样式需要切换的时候,尽量不要写两个 v-if
或 v-show
来切换样式。v-show 不是惰性的,在没有必要的时候,还是插入在DOM中;然后v-if 又有一个明显的创建和删除过程。可以通过动态添加class
的方法切换样式。
解决方案
给元素动态增加class
时,可以在模板中通过:class={‘hasClass’: ifHasClass}
来实现,当ifHasClass
为true
时,该元素会自动加上hasClass
的样式。 如果在一个元素中使用了两个class
则会报错,动态绑定的class
可以与正常写的一起使用。
父子组件通信,props单向绑定
问题描述
vue中的props是单向绑定的,父组件的属性变化时会传递给子组件,子组件内部不应改变props的值,否则控制台会给出警告。虽然当 props的类型为数组或者对象时,在子组件内部改变props的值 vue 检测不到。但官方不建议在子组件内改变父组件的值,因为这违反了vue中props单向绑定的思想。
解决方案
eventBus
事件总线适用于父子组件、非父子组件等之间的通信。依赖注入(provide / inject)用于父子组件、祖孙组件之间的通信。
provide(发送) / inject(接收)
是Vue提供的两个钩子,和data
、methods
是同级的。
vue中函数的this指向问题
问题描述
箭头函数中的this指向定义后就固定不变; 普通函数中的this指向是变谁调用的指向谁。
created () {
// 箭头函数中this指向vue
setInterval(() => { console.log(this) }, 1000)
// 普通函数中this指向window,因为setInterval()函数是window对象的函数
setInteval(function () { console.log(this) }, 1000)
}
解决方案
如果要使用普通函数,要使用了一个变量来当中间值
function(){
let temp = this;
setInvertal(function(){....}, 1000)
}
Vue 项目中常遇到的问题的更多相关文章
- vue 项目中实用的小技巧
# 在Vue 项目中引入Bootstrap 有时在vue项目中会根据需求引入Bootstrap,而Bootstrap又是依赖于jQuery的,在使用npm按照时,可能会出现一系列的错误 1.安装jQu ...
- 如何在VUE项目中添加ESLint
如何在VUE项目中添加ESLint 1. 首先在项目的根目录下 新建 .eslintrc.js文件,其配置规则可以如下:(自己小整理了一份),所有的代码如下: // https://eslint.or ...
- 在vue项目中, mock数据
1. 在根目录下创建 test 目录, 用来存放模拟的 json 数据, 在 test 目录下创建模拟的数据 data.json 文件 2.在build目录下的 dev-server.js的文件作如下 ...
- 浅谈 Axios 在 Vue 项目中的使用
介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 特性 它主要有如下特性: 浏览器端发起XMLHttpRequests请求 Node端发起http ...
- 去除vue项目中的#及其ie9兼容性
一.如何去除vue项目中访问地址的# vue2中在路由配置中添加mode(vue-cli创建的项目在src/router/index.js) export default new Router({ m ...
- vue 项目中当访问路由不存在的时候默认访问404页面
前言: 在Vue项目中,当访问的页面路由不存在或错误时,页面显示为一片空白.然而,通常我们需要对访问url不存在或者错误的情况下添加默认的404页面,即not found页面. 一般的处理方法是: 在 ...
- vue项目中遇到的那些事。
前言 有好几天没更新文章了.这段实际忙着做了一个vue的项目,从 19 天前开始,到今天刚好 20 天,独立完成. 做vue项目做这个项目一方面能为工作做一些准备,一方面也精进一下技术. 技术栈:vu ...
- scss/less语法以及在vue项目中的使用(转载)
1.scss与less都是css的预处理器,首先我们的明白为什么要用scss与less,因为css只是一种标记语言,其中并没有函数变量之类的,所以当写复杂的样式时必然存在局限性,不灵活,而scss与l ...
- Vue项目中GraphQL入门学习与应用
1.GraphQL是什么,能干什么? 正如官网所说,GraphQL是一种用于API查询的语言.Facebook 的移动应用从 2012 年就开始使用 GraphQL.GraphQL 规范于 2015 ...
随机推荐
- SpringMVC的web配置
之前并没有意愿写关于下面内容的小作文.因为总结SPI相关的标准(SPI机制之JDK中的SPI - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)),而这个也是关于标准的,Servlet3.0 ...
- blender导入灰度图生成地形模型
安装软件 在此处下载blender并安装. 添加平面 1.打开blender,右键删除初始的立方体. 2.shift+a选择平面添加进场景: 3.按下s键鼠标拖动调节平面大小确定后按下鼠标左键: 4. ...
- 基于node的tcp客户端和服务端的简单通信
1.简单介绍下TCP/IP TCP/IP是互联网相关协议的集合,分为以下四层:应用层.传输层.网络层.数据链路层. 分成四层的好处是,假如只有一层,某个地方需要改变设计时,就必须把所有整体替换掉,而分 ...
- WebGL 与 WebGPU比对[5] - 渲染计算的过程
目录 1. WebGL 1.1. 使用 WebGLProgram 表示一个计算过程 1.2. WebGL 没有通道 API 2. WebGPU 2.1. 使用 Pipeline 组装管线中各个阶段 2 ...
- NSSCTF-[SWPU 2019]Network
下载附件打开之后发现是和ascii比较像,但是尝试解码发现不是ascii,然后这里问了一下大佬然后又翻了一下自己的笔记,最后发现是TTL,这里直接上脚本, import binascii with o ...
- 主流的商业智能BI工具推荐,学会数据分析没难度
伴随着大数据概念的深入企业越来越重视大数据,商业智能BI工具已经成为许多企业数据分析的首选.也许有些小伙伴对商业智能BI工具还是有些陌生,在了解商业智能BI工具之前,先来了解一下什么是商业智能. 百度 ...
- json系列(一)cjson,rapidjson,yyjson解析示例
前言 项目上通过消息中间件传输json格式的数据,其他接收模块需要对json格式的数据进行解析,反序列化.对json解析工具有几个关注点,一是具备解析和构造的基础功能,二是具备解析和构造的高性能,三是 ...
- C# mutex互斥锁构造
概念 Mutext 出现的比monitor更早,而且传承自COM,当然,waitHandle也是它的父类,它继承了其父类的功能,有趣的是Mutex的脾气非常的古怪,它 允许同一个线程多次重复访问共享区 ...
- ubuntu 18.04安装hadoop 2.9.2
先试用命令su,进入root用户权限 下载jdk及hadoop 分别解压,/java,/hadoop tar xvf xxx.tar(在所在目录下进行,或者) tar xvf /x/x/xxx.tar ...
- Python:os
1.os.walk 学习自:python中os.walk的用法详解 - 马里亚纳仰望星空 - 博客园 说明 遍历某个文件夹下的所有文件(包括子文件夹中) 用法 os.walk( top , topdo ...