vue-项目使用过程中遇到的一些问题
vue-项目使用过程中遇到的一些问题
最近项目比较忙,五一前要把初版做完,周六加了一天班,今天收尾,明天做测试联调,改改bug,后面再找用户提提意见,估计晃晃悠悠就到五一了。
项目确实让人成长,我是个新手,项目过程中不是难免,是必定遇到了很多问题,我想记下来,一些技术上的盲点,还有一些思维上的盲点。
问题一 Cannot read property ‘xxx’ of undefined 这类问题
这个错误,在vue代码撰写中经常遇到。
原因主要分为这几类
原因一、你调用的数据没有初始化
解决方法,在你使用前进行初始化操作,或者一开始就在mouted中定义好,就像你会先在data里声明很多对象,需用用的时候直接使用this去拿。
原因二、你调用了当前对象没有的属性
你调用的对象中没有你想要的属性,自然是拿不到的,注意链式调用是你返回的到底是什么,中间是不是有空值。
解决方法,实现声明,但有的没有就是没有
原因三、你传入的类型不对
最常见的例子,他要传个函数,你传了一个对象
原因四、你调用的对象他空了,他是undefined,Nan,null
解决方法,提前声明,获取的对象要提前判空
单个数值用三目运算符,对象,建议自己写个方法
总结,其实这玩意就跟java空指针差不多,基本你java怎么做的,js也怎么做。你java遍历中间空指针会直接结束,js也是这样。
/*** 判断非空(包含 undefined、null、NaN、空字符串)* @param {*} data*/
export function isNotNull(data) {if(data == undefined || data == null || data == NaN || data == '') {return false}return true
}/*** 判断空(包含 undefined、null、NaN、空字符串)* @param {*} data*/
export function isNull(data) {if(data == undefined || data == null || data == NaN || data == '') {return true}return false
}
问题二、 使用elementui时,如何调节一些 内部样式
说实话,新人,不是从项目开头做起,其实很多东西,以前老前辈都做的差不多了,基本这粘贴一段,那粘贴一段,真到了要自己写组件的时候,还真的要下点心思的,周六加班,画了个穿梭框,用的elementui的穿梭框,但中间各种问题,专门拿出来讲一讲。
这次我是做了wms里的一个盘点模块,要求让用户选完仓库后,自动弹出一个穿梭框,让用户自己勾选物料。我自己找了半天,在CSDN和知否上翻了半天也没找到解决方法,几个解决方法都是那种只能解决一半,根本没法彻底解决。最终还是问的边上的大哥。顺便学到了一点js的调试知识。
因为穿梭框,除了主框体还有内部两个小框体,搜索栏,按钮,标题等内部组件,elementui文档也没有写如何更改这方面的样式。解决方法:
步骤一:浏览器 F12打开调试模式
步骤二:点击这个鼠标箭头的表示,然后点击页面元素,他可以直接跳到当前元素对应的css
我点击了elementui官网的穿梭框组件的标题,它会自动指向这个元素,并且边上会显示他的css样式,这时候你就可以调试你想要的样式尺寸。
步骤三:复制样式类型,写到style里
顺便介绍一些几个js基础知识。
scoped 让css只在当前页面生效, 他会在你的样式后生成一个hash值,让你的样式不会重复
/deep/ 和 >>> 这两个都是深度选择器,意义一样 比scoped更好用 深度选择器 在你调用别人的组件,又想拥有自己的样式 ,就可以使用/deep/ 写在css前面
!important 样式内部存在层级覆盖,使用!important 让你的样式不被覆盖
>>> .el-transfer-panel {border: 1px solid #ebeef5;border-radius: 4px;overflow: hidden;background: #fff;display: inline-block;vertical-align: middle;width: 400px !important;max-height: 100%;box-sizing: border-box;position: relative;
}
问题三、 在前端卡控输入内容,表单校验
表单校验有很多种方式,在这里只说两种 vue原生的rule 还有elementui提供的绑定事件
vue原生
<el-form ref="form" :inline="true" :model="form" label-width="280px" id="userForm" style="margin-top:10px;":rules="rules"><el-row type="flex"><el-col :span="10"><el-form-item label="登录名" prop="loginName"><el-input v-model="form.loginName" class="input-common-width" :maxlength="60" style="width:250px;"clearable></el-input></el-form-item><el-form-item label="性别" prop="gender"><el-switch v-model="form.gender" active-text="男" inactive-text="女"></el-switch></el-form-item><el-form-item label="身份证号"><el-input v-model="form.idCard" class="input-common-width" :maxlength="18" style="width:250px;"clearable></el-input></el-form-item><el-form-item label="归属单位" prop="companyId"><div style="width: 360px"><el-select filterable v-model="form.companyId" placeholder="请选择单位" @change="selectCompany"class="input-search-width" style="width:250px"><el-option v-for=" option in companyList" :key="option.companyId" :label="option.companyName ":value="option.companyId"></el-option></el-select><el-checkbox v-model="form.isCompanyManager" style="margin-left:10px">单位负责人</el-checkbox></div></el-form-item><el-form-item label="归属部门" prop="officeId"><div style="width: 360px"><el-select filterable v-model="form.officeId" placeholder="请选择部门" class="input-search-width"style="width:250px"><el-option v-for=" option in officeList" :key="option.officeId" :label="option.officeName ":value="option.officeId"></el-option></el-select><el-checkbox v-model="form.isOfficeManager" style="margin-left:10px">部门负责人</el-checkbox></div></el-form-item></el-col><el-col :span="12"><el-row style="margin-top:15px"><el-form-item label="照片"><el-upload class="avatar-uploader" :action="fileuploadurl" :show-file-list="false":on-success="handleAvatarSuccess" style="height:151px;width:100px"><img v-if="form.avatar" :src="form.avatar"class="avatar" style="height:151px;width:100px"><i v-else class="el-icon-plus avatar-uploader-icon" style="height:151px;width:100px"></i></el-upload></el-form-item></el-row><el-row style="margin-top:2px"><el-form-item label="年龄" prop="age"><!--min 最小数量 maxlength 最大长度 --><el-input v-model="form.age" class="input-width" @input="checkNumber()" min="18" maxlength="3" clearable></el-input></el-form-item></el-row><el-row style="margin-top:2px"><el-form-item label="邮箱"><el-input v-model="form.email" class="input-common-width" :maxlength="60" clearable></el-input></el-form-item></el-row></el-col></el-row><el-row><el-col :span="10"><el-form-item label="姓名" prop="name"><el-input v-model="form.name" class="input-common-width" :maxlength="60" clearable></el-input></el-form-item></el-col><el-col :span="14"><el-form-item label="手机号"><el-input v-model="form.mobile" class="input-common-width" :maxlength="11" clearable></el-input></el-form-item></el-col></el-row><el-row><el-col :span="10"><el-form-item label="电话"><el-input v-model="form.phone" class="input-common-width" :maxlength="60" clearable></el-input></el-form-item></el-col><el-col :span="14"><el-form-item label="民族"><el-select v-model="form.nation" placeholder="请选择民族" class="input-width" clearable filterable><el-option v-for="item of nationCodeList" :key="item.decodeId" :label="item.decodeValue":value="item.decodeId"></el-option></el-select></el-form-item></el-col></el-row><el-row></el-row><el-row><el-form-item label="角色" prop="role"><el-checkbox-group v-model="form.role" class="rolesClass" :style="{width: myWidth}" id="check"><el-checkbox v-for="item in roles" :key="item.roleId" :label="item.roleId" :value="item.roleId"class="boxClass">{{item.roleName}}</el-checkbox></el-checkbox-group></el-form-item></el-row><el-row><el-form-item label="来源类型"><el-select v-model="form.sourceType" filterable clearable class="input-common-width" ><el-option v-for="item in sourceTypeList" :key="item.decodeId" :label="item.decodeValue":value="item.decodeId"></el-option></el-select></el-form-item></el-row><el-row><el-form-item label="备注"><el-input v-model="form.remarks" type="textarea" :rows=4 style="width: 360px;" :maxlength="60"clearable></el-input></el-form-item></el-row><el-row><el-form-item label="是否启用"><el-switch v-model="form.useable" active-text="是" inactive-text="否" style="margin-left:40px;"></el-switch></el-form-item></el-row></el-form>
rules: {loginName: [//required 是否必须 如果不符合条件提示什么 在什么时候触发 blur 失去焦点 change 提交{required: true, message: '请填写登录名称', trigger: 'blur'}],name: [{required: true, message: '请填写姓名', trigger: 'blur'}],sourceType: [{required: true, message: '来源类型不能为空', trigger: 'change'}],role: [//type 制定提交类型{type: 'array', required: true, message: '请至少选择一个角色', trigger: 'change'}],gender: [{required: true, message: '性别不能为空', trigger: 'change'}],companyId: [{required: true, message: '单位不能为空', trigger: 'change'}],age: [{required: true, message: '年龄不能为空', trigger: 'blur'},{validator: validateAmount, trigger: 'blur'}//validator 制定验证的方法]},
vue原生的验证基本满足了一般的需求,但只用rules 事件略少,所以可以选择绑定事件,例如elementui提供的一些事件绑定
<!-- 使用oninput 绑定正则 ,实时监听输入 ,这段代码的意思是 只能输数字和小数点 别的什么都输入不出来-->
<el-input type="text" v-model="scope.row.firstAmount" maxlength="5"oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')"class="input"></el-input>
问题四、 分页,前端分页?后端分页,筛选选中内容,批量选中?
先自己回答一下,后端分页,后端筛选,前段选中
前两天,组长叫我改一个bug,之前留下的问题,选中的物料,依然在选择菜单里,没有筛选掉,增加一个批量选中的功能。
批量选中没啥好说,反倒是分页和筛选,我觉得是个业务问题。代表我最近脑子不好了。
我一开始想在前段筛掉数据,但出现一个问题,分页是后端,我前段筛掉数据后,这一页数据可能就没了,留个空。
而且就算这样,那我关掉选择页面,再触发一次搜索,数据又回来了,我一开始想做成前端分页作为解决方法,前端分页,前端筛选,实际证明。费力不讨好,还丑。
说下最终的解决方法
我前段点击添加的时候,把当前已选的内容传回后端,让后端筛掉这部分数据,再返回,这个筛选必须放在存入页码数据之前。
这样前段就没有什么改变,只在搜索的时候,多返回一个参数。后端sql里 多一个notin的list。
批量选中没啥好说,反倒是分页和筛选,我觉得是个业务问题。代表我最近脑子不好了。
我一开始想在前段筛掉数据,但出现一个问题,分页是后端,我前段筛掉数据后,这一页数据可能就没了,留个空。
而且就算这样,那我关掉选择页面,再触发一次搜索,数据又回来了,我一开始想做成前端分页作为解决方法,前端分页,前端筛选,实际证明。费力不讨好,还丑。
说下最终的解决方法
我前段点击添加的时候,把当前已选的内容传回后端,让后端筛掉这部分数据,再返回,这个筛选必须放在存入页码数据之前。
这样前段就没有什么改变,只在搜索的时候,多返回一个参数。后端sql里 多一个notin的list。
vue-项目使用过程中遇到的一些问题相关推荐
- antimalware service executable占用内存_解决 vue 项目运行过程中内存泄漏问题
vue-cli3.0 内存溢出 JavaScript heap out of memory vue-cli3.0构建的项目,开发过程中,可能会遇到内存溢出的情况,改动一点代码,代码编译,进程就会断掉, ...
- [项目过程中所遇到的各种问题记录]部署篇——项目部署过程中那些纠结的问题-SQLServer...
前一篇文章说了些有关IIS的,这篇则是说SQLServer的,相比IIS来说,SQLServer的配置过程中问题就少了许多,而且都比较有针对性,下面开始记录: 注:由于实际项目的开发都是基于SQL20 ...
- 软件外包项目实施过程中的关键因素(摘自IT168技术频道)
外包是发包方和接包方互相信任.高度协作的共同行为.为了顺利实施外包,对于发包方,要求企业具有一定的技术水平.项目管理水平.人力资源和沟通控制能力.对于接包方,要求企业具有一定的成本.质量控制能力,具有 ...
- [转]项目实施过程中的风险控制
2019独角兽企业重金招聘Python工程师标准>>> 项目不同于日常任务,它有明确的起止时间和目标,要在明确的范围.时间和成本约束下,达到相应的质量标准,并取得用户的满意.影响项目 ...
- Vue项目在标签中如何书写多个内敛style样式
Vue项目在标签中如何书写多个内敛style样式 例如:对一个数组进行循环,我想给偶数项的添加红色背景,奇数项的添加蓝色背景,这时候就可以用v-bind:style="[]",详细 ...
- vue项目在vscode中编译eslint报错没显示红色波浪线提示
vue项目在vscode中编译eslint报错没显示红色波浪线提示. 如下图所示: 下图是预期效果: 不符合Eslint校验规则的代码位置都能展示出来,这样一目了然.能帮助我们迅速找到报错的位置. 然 ...
- ERP项目实施过程中的致命过失(转)
ERP项目实施过程中的致命过失 自从1990年Gartner Group提出了ERP概念之后,引起了全球性的管理变革.在美国和一些欧洲发达国家,ERP已经接近饱和,它们现在看好的是CRM系统,2001 ...
- idea安装及项目导入过程中pom报错解决办法
1.idea安装可用破解版或者在淘宝上买正版账号(20多块钱一年,挺便宜的) 2.pom报错解决办法: 在项目导入过程中pom报错: 原因:相关jar包未下载完.(下载速度慢,因为下载的链接是国外的节 ...
- 性能测试 架构层(二) 从性能测试层面了解架构设计 分布式项目实施过程中的常见难点,测试架构层面思考性能测试应该如何做?自行思考解决方案是什么?
目录 前言 架构预览 小节 一.访问层架构设计 1.LVS 2.Nginx 二.API 网关层架构设计 1.分布式会话管理 2.接入层控制 Filter过滤器 三.核心服务层架构设计 1.核心服务 ...
- 关于以太坊智能合约在项目实战过程中的设计及经验总结(1)
此文已由作者苏州授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 1.智能合约的概述 近几年,区块链概念的大风吹遍了全球各地,有的人觉得这是一个大风口,有的人觉得他是个泡沫.众所 ...
最新文章
- 基于曲率的体素聚类的三维激光雷达点云实时鲁棒分割方法
- linux 手动添加 swap 分区
- C/C++语言中闭包的探究及比较
- Linux调试——gdb调试器的简单使用调试coredump文件
- 微型计算机地未来发展,微型计算机的发展历史、现状和未来(最新) PDF.doc
- 日志处理两大生态Splunk和ELK深度对比
- Web前端开发笔记——第四章 JavaScript程序设计 第二节 变量
- Spring自学日志01
- mysql存储ip地址_MySQL怎样存储IP地址
- springboot热部署之spring-boot-devtools
- C++对象数组与对象指针的用法【C++初学面向对象编程】
- 关于NLP相关技术全部在这里:预训练模型、信息抽取、文本生成、知识图谱、对话系统...
- 多版本并发控制MVCC和乐观锁OCC 是什么 区别
- Redis初识、设计思想与一些学习资源推荐
- Matlab中直方图的绘制histogram函数
- 翟菜花:资本退烧、开源节流时代,品质服务保障成携程终极利器
- android 阅读 翻页,极速PDF安卓版如何翻页、阅读模式修改等操作详解
- Re:从零开始的DS生活 图论学这一篇就够了
- nginx单点故障怎么破?
- ESP8266-01 MQTT固件烧录并连接阿里云服务器