项目简介

vue + axios + vue-router + vuex + ElementUI

架构

vue

vue数据更新,视图不更新

只有当实例被创建时 data 中存在的属性才是响应式的,Vue 不能检测对象属性的添加或删除;

可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性

Vue.set(vm.userProfile, 'age', 27)

this.$set(this.transportAddData.serviceOrderList[a].serviceOrderItems[i], 'deletePoundIds', [])

Vue 不能检测以下变动的数组:

当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue

当你修改数组的长度时,例如:vm.items.length = newLength

持续触发事件的优化

持续触发某个事件可以用函数的节流和防抖来做性能优化

//防抖

function(){

...

clearTimeout(timeoutId);

timeoutId = setTimeout(function () {

console.log('content', content);

player(content.msgTypeId, comId)

}, 500);

...

}

// 节流

var canRun = true;

document.getElementById("throttle").onscroll = function(){

if(!canRun){

// 判断是否已空闲,如果在执行中,则直接return

return;

}

canRun = false;

setTimeout(function(){

console.log("函数节流");

canRun = true;

}, 300);

};

nextTick

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

get() {

this.$http.get('/api/article').then(function (res) {

this.list = res.data.data.list

// ref list 引用了ul元素,我想把第一个li颜色变为红色

document.querySelectorAll('li')[0].style.color = 'red' //这里会报错-,因为还没有 li

this.$nextTick( ()=> {

document.querySelectorAll('li')[0].style.color = 'red'

})

})

},

音频文件自动播放报错

谷歌浏览器(Chrome 66)音频自动播放报错

DOMException: play() failed because the user didn’t interact with the document first.

解决方案:AudioContext

// Chrome

request.get('/baseConfig/messageAudio/play', {

params: {

"comId": Cookies.get('comId'),

"msgTypeId": id

},

responseType: 'arraybuffer' // 这里需要设置xhr response的格式为arraybuffer

})

.then(req => {

...

let context = new (window.AudioContext || window.webkitAudioContext)();

context.decodeAudioData(req.data, decode => play(context, decode));

function play (context, decodeBuffer) {

sourceadio = context.createBufferSource();

sourceadio.buffer = decodeBuffer;

sourceadio.connect(context.destination);

// 从0s开始播放

sourceadio.start(0);

}

...

})

vuex

使用vuex修改state的方法和区别

可以直接使用 this.$store.state.变量 = xxx;

this.

store.commit(commitType, payload)

相同点:能够修改state里的变量,并且是响应式的(能触发视图更新)

不同点: 若将vue创建 store 的时候传入 strict: true, 开启严格模式,那么任何修改state的操作,只要不经过

mutation的函数,vue就会报如下错

throw error : [vuex] Do not mutate vuex store state outside mutation handlers。

使用commit提交到mutation修改state的优点:vuex能够记录每一次state的变化记录,保存状态快照,实现时间漫游/回滚之类的操作。

dispatch 和 commit的区别在于:

使用dispatch是异步操作, commit是同步操作,

所以 一般情况下,推荐直接使用commit,即 this.$store.commit(commitType, payload),以防异步操作会带来的延迟问题。

vuex到底是什么

const store = new Vuex.Store({

state: {

count: 0

},

mutations: {

increment (state) {

state.count++

}

},

actions: {

increment (context) {

context.commit('increment')

}

}

})

==vuex中的state本质上是没有template的隐藏的vue组件。==

axios

兼容问题

Edge 41.16299.15.0 post请求会自动转为get

取消请求

场景:每次请求在拦截器中添加token,后台判断token是否过期;当进入一个页面时触发多次请求,且正好token已经过期。这个时候需要第一次请求完成之后知道token已经过期则弹出提示、页面跳转到登录、停止之后的请求;否则会因为多次请求和axios响应拦截而多次弹框提示。

解决方案

axios自带cancelToken 取消方法,然后在路由跳转后停止之前的请求

// 请求拦截中 添加 cancelToken

axios.interceptors.request.use(config => {

config.cancelToken = store.source.token

return config

}, err => {

return Promise.reject(err)

})

// 路由跳转中进行判断

router.beforeEach((to, from, next) => {

const CancelToken = axios.CancelToken

store.source.cancel && store.source.cancel()

store.source = CancelToken.source()

next()

})

//sort文件/

state: {

source: {

token: null,

cancel: null

}

}

存在问题: 如果 token过期提示弹框为二次确认弹框,再次确认之后才会进行页面跳转,那么在点击确认之前,页面中之前的请求还是会继续进行;

解决方案:给弹窗添加全局状态,根据状态判断是否需要弹出弹框

预检请求

CORS跨域

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,==IE浏览器不能低于IE10。==

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

简单请求

请求方法是以下三种方法之一:

HEAD

GET

POST

HTTP的头信息不超出以下几种字段:

Accept

Accept-Language

Content-Language

Last-Event-ID

Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

简单请求不会触发 CORS 预检请求。

非简单请求

当请求满足下述任一条件时,即为非简单请求:

使用了下面任一 HTTP 方法:

PUT

DELETE

CONNECT

OPTIONS

TRACE

PATCH

人为设置了对 CORS 安全的首部字段集合之外的其他首部字段。该集合为:

Accept

Accept-Language

Content-Language

Content-Type (but note the additional requirements below)

DPR

Downlink

Save-Data

Viewport-Width

Width

Content-Type 的值不属于下列之一:

application/x-www-form-urlencoded

multipart/form-data

text/plain

请求中的XMLHttpRequestUpload 对象注册了任意多个事件监听器。

请求中使用了ReadableStream对象。

预检请求

非简单请求,会在正式通信之前,增加一次HTTP OPTIONS方法发起的查询请求,称为"预检"请求(preflight)。以获知服务器是否允许该实际请求。

"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。

==该方法不会对服务器资源产生影响==

优化方案

Access-Control-Max-Age: //单位是秒。

表示 preflight request (预检请求)的返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 可以被缓存多久

Vue Router

push、replace的区别

push会向history添加新的记录,replace只是替换掉原来的记录,不会添加新的记录;

这就导致了用replace方法跳转的页面是无法回到之前的页面的;(类似window.history)

路由懒加载

为了提升页面加载速度,实现按需加载,也就是当路由访问时才加载对应组件,我们可以结合vue的异步组件和webpack的代码分割功能来实现路由的懒加载。

{

path: '/iov/login',

name: '登录',

component: resolve => require(['@/views/login/login'], resolve),

},

{

path:'/iov/organization',

name:'组织管理',

component:() => import('@/views/enterprise/organization')

}

elementUI

表单弹窗中 elementform 清除验证残留提示

给表单添加不同的 ref (REFNAME),如果有相同的ref 会导致残留验证提示清除失败

this.dialogTranspor = true

//弹窗打开后 dom 没有生成,所有要用 this.$nextTick

this.$nextTick(function () {

this.$refs.REFNAME.resetFields();

})

页码数无法正常显示

场景:列表页在跳到详情或其他页面后再返回列表页,无法正常显示对应页数(页码数放在state中),但请求的数据时正常的;

解决方案:页码数、总页数必须要在同一个对象中,否则当前页码数不能正常显示

data() {

return {

//完成查询条件

searchComplate: {

"comId": Cookies.get('comId'),

"transportOrderCode": null,

"orderCode": null,

"customerId": null,

"abnormal": 2,

"startTime": null,

"endTime": null,

"pageNum": 1,

"pageSize": 20,

total: 0,

currentRow: '',

dataArea: ['', ''],

activeName: '',

expands: []

},

}

}

动态多级表单验证

:rules="{required: true, message: '卸货地不能为空', trigger: 'blur'}">

:rules="[{required: true, message: '必填项', trigger: 'blur'},{pattern: /^((([1-9]+(\d+)?)(\.\d+)?)|(0\.\d+))$/, message: '必须为正数且不为0'}]">

placeholder="预卸吨数">

...

vue 预检_vue全家桶+element 项目踩坑总结相关推荐

  1. html2canvas图片的文字偏移,html2canvas在Vue项目踩坑-生成图片偏移不完整

    背景 最近做一个Vue项目需求是用户长按保存图片,页面的数据是根据不同id动态生成的,页面渲染完生成内容图片让用户长按保存的时候,把整个页面都保存起来. 在项目遇到的坑是图片能生成,可是生成的图片总是 ...

  2. java 做项目踩坑,web项目踩坑过程

    sql函数设计: 一开始本来是直接用Java的jdbc直接传输操作语句的.但后来学了存储过程发现存储过程可以提高不少的效率.就重构了自己对数据库的操作代码.包括:开启,查找,修改,关闭. 开启:直接使 ...

  3. 配合Opencv2.4.9,CMake3.12.1和VS2010在win10下构建项目踩坑记录

    配合Opencv3,CMake和VS2010在win10下构建项目踩坑记录 参考https://blog.csdn.net/qq_26623659/article/details/78322782 博 ...

  4. 使用VUE仿写【E宠商城】踩坑点

    使用VUE仿写[E宠商城]踩坑点 1.无论是否是否写了!important 父元素的规则 都是被子元素继承的 继承的样式优先级小 所以这边的字体大小还是保留reset那边的样式!!! 2.canvas ...

  5. 丰田项目踩坑手记(REACT)

    丰田项目踩坑手记(REACT) 路由配置的时候:要引入hash路由不是browswer那个 路由参考网址:react-guide.github.io/react-route- 路由网址:reacttr ...

  6. vue @input带参数_Vue 全家桶开发的一些小技巧和注意事项

    前言 用 vue 全家桶开发一年多了,踩过不少坑,也解决了很多的问题,把其中的一些点记录下来,希望能帮到大家.以下内容基于最新版的 vue + vuex + vue-router + axios + ...

  7. Vue3 全家桶 + Element Plus + Vite + TypeScript + Eslint 项目配置最佳实践

    尤大的 Vue3.0 已经发布有一阵子了,已经很成熟了. 而且 Element Plus + Vite 也出了一段时间了,是时候该上手体验分享一波了. 主要是要熟练一下 Vue3,好准备用 Vue3 ...

  8. vue怎么改logo_vue全家桶项目构建教程

    前言 vue是现阶段很流行的前端框架,很多人通过vue官方文档的学习,对vue的使用都有了一定的了解,但再在项目工程化处理的时候,却发现不知道改怎么更好的管理自己的项目,如何去引入一些框架以及vue全 ...

  9. Vue全家桶构建项目

    步骤一.安装vue-cli 首先,我们可以通过npm安装vue-clic,前提是我们需要有node环境,如果电脑还没安装node,先安装,可通过 node -v 查询node的版本号,有版本号则已经安 ...

最新文章

  1. docker(4)docker的网络,自定义网桥
  2. python中6 2是什么意思_python2.6中SyntaxError是什么错误?
  3. Reactor学习笔记
  4. MyBatis源码解析【4】反射和动态代理
  5. hdu1978(递推dp)
  6. cross_val_score的使用
  7. 红米手机停在机器人这里_iQOO Z1和红米K30 至尊纪念版,谁更值得选择?
  8. 某次元app之data参数分析
  9. SparkStreaming - 无状态与有状态 updataStateByKey
  10. 机器学习实战9-运行Tensorflow(california_housing数据集)
  11. 第四章 生命周期函数--36 结合Node手写JSONP服务器剖析JSONP原理
  12. 在线文本代码对比工具
  13. 【IoT】产品设计:硬件产品开发流程之ID与MD设计(文字)
  14. Android 8(1),腾讯字节爱奇艺网易华为实习面试汇总
  15. RPCBind 服务被利用进行 UDP 反射 DDoS 风险预警
  16. 操作系统µC/OS的故事,最终Micrium被Silicon Labs收购
  17. laravel:如何快速实现数据填充,创建模拟数据(使用seeder)
  18. 文学赏析 - 人生若只如初见
  19. 【20200401程序设计思维与实践 Week7作业】
  20. [数据分析笔记] 网易云歌单分析系列03—pyecharts折线图

热门文章

  1. python oop求三角形面积公式_Python OOP --action()函数
  2. 圆 最小外包矩形_【OpenCV3图像处理】提取轮廓的凸包、外包矩形、最小外包矩形、最小外包圆...
  3. java yml value_Spring Boot:从YAML文件加载@Value
  4. 哪里下载linux内核补丁,给大家科普一下linux内核补丁,顺便说一下华为的事
  5. 特征筛选11——ExtraTrees筛选特征
  6. Numpy random生成不重复的随机数
  7. 地面波天线怎样能多收台_GPS天线的分类介绍及应用
  8. 编辑视频贴纸软件_视频特效编辑软件下载-视频特效编辑器下载V10.9.93-西西软件下载...
  9. 上学吧在线计算机考试中心题库,上学吧考试题库
  10. 深入理解JVM(4)——对象内存的分配策略