vue遇坑合辑

vue 遇坑
二次封装过程中,使用emit像父组件传值。但是出现了emit失效的问题
几经查验之后,发现,是因为emit的事件不可以是驼峰命名法 只能是全小写 改成了全小写之后,emit恢复正常。
ps:后续还出现其他问题。检查之后发现是触发了两次页码初始化,导致页码不变,所以对页码进行监控,一旦变化 就把页码赋值

事件绑定

在vue项目中 有可能会出现:同一个页面中会有多个echarts内容 并且 在echarts中 需要用户在缩放页面的时候图表同时也能随之缩放 那么就需要添加resize事件,
一般来说 会这样设置:
window.onresize = () = >{} 但是如果是多个事件 就会导致 后面的事件覆盖前面的事件
所以 就可以如下设置:
mounted (){
window.addEventListener('resize', () => this.weekCwTrend.resize(), false);
}
使用addEventListener绑定的事件 就不会被覆盖

element表单问题

在使用element的表单时,需要一次数据回显,在数据回显的时候,习惯性会吧当前行的数据直接赋值给表单,但是这样会出错,因为两个变量都是对象的形式,所以在赋值的时候就会出现把等号左边的地址 指向等号右边变量的内存地址上,即两者其实是指向同一个内存地址。那么 在修改表单上的内容的时候 也容易把原先的当前行的内容重新清空。
解决办法:
新变量名= JSON.parse(JSON.stringify(旧变量名));
转换一下 就不会产生这种情况。

校验debounce

在开发过程中 很有可能会出现 填入的内容需要进行后台验证,那么此时如果每输入一次就请求一次后台 不太现实。可以使用防抖函数 让用户在结束操作后的一定时间后才发送请求。

// 校验规则
var _this = this;
            if (!val) {
                this.numberLength = 0;
                return callback(new Error('请输入工号'));
            } else {
                this.debounce(
                    function() {
                        var reg = /^[a-zA-Z0-9]+$/;
                        if (reg.test(val)) {
                            var bytes = _this.wordlength(val, 20).bytesCount;
                            var index = _this.wordlength(val, 20).index;
                            if (bytes > 20) {
                                _this.addSingleForm.number = val.substring(0, index + 1);
                                _this.numberLength = 5;
                            } else {
                                _this.numberLength = bytes;
                            }
                        } else {
                            return callback(new Error('仅支持数字和大小写字母'));
                        }
                    },
                    700,
                    0
                )();
            }
            callback();

callback的作用是让用户去报错,如果没有错 验证通过就使用callback让报错信息隐藏,所以 可以让其在改显示错误信息的时候显示错误信息 不该显示错误信息的时候就把错误信息隐藏掉。
改成:

// 校验规则
var _this = this;
            if (!val) {
                this.numberLength = 0;
                callback(new Error('请输入工号'));
            } else {
                this.debounce(
                    function() {
                        var reg = /^[a-zA-Z0-9]+$/;
                        if (reg.test(val)) {
                            var bytes = _this.wordlength(val, 20).bytesCount;
                            var index = _this.wordlength(val, 20).index;
                            if (bytes > 20) {
                                _this.addSingleForm.number = val.substring(0, index + 1);
                                _this.numberLength = 5;
                            } else {
                                _this.numberLength = bytes;
                            }
                            let data = {};
                            data.personnelNumber = _this.addSingleForm.number;
                            checkPersonnelNumber(data).then(res => {
                                if (res.resCode == 1) {
                                    callback(new Error(res.resMsg));
                                } else {
                                    callback();
                                }
                            });
                        } else {
                            callback(new Error('仅支持数字和大小写字母'));
                        }
                    },
                    700,
                    0
                )();
            }

element 消息提示组件内容使用html
在开发过程中 很有可能会遇到,消息提示中 需要换行的情况,如下:

微信截图_20200813182451.png

但是 如果直接用以下方法是不成功的:

let msgArr=['消息1','消息2']  // 错误消息
this.$message({
   message: msgArr('<br >'),
   type: 'error'
});

如果是以上方法想要展示出错误消息换行的话 是失败的。
换个思维:如果能把所有的消息包在一个块级标签里再输出那么就能成功的换行了。
如下:

   let msgArr = [];
   let length = 0;
   var h = this.$createElement;
   msgArr.push(
      h( 'p', 
          { style: { color: 'red' }}, 
          this.getPeriod(this.addGradeForm.gradeList[index].schoolperiod) + '学段' +this.addGradeForm.gradeList[index].gradeName + '添加失败,原因:' + item.resMsg.split(';')[0]));
   this.$message({
    message: h('div', null, msgArr),
    type: 'error'
   });

使用渲染函数 把错误消息包在标签里面 这样就可以成功将消息换行输出了!

文件选择

文件选择器在非ie浏览器 或者版本过低的情况下 会出现 在页面加载完成之后 无法自动点击触发调用文件选择器,是因为版本级别高的浏览器把非用户触发文件选择器的事件拦截了。文件选择器只能通过用户点击触发。

在选择文件的时候会出现以下情况:
1.两次选择同一个文件,但是在第二次的时候,不会触发@change事件;
解决方法:

//html代码
<input type="file" id="uoloadImgs" ref="referenceUpload" style="display: none" accept="image/png, image/jpeg, image/gif, image/jpg" @change="uploadImg($event)">

//js代码
uploadImg(){
  //在做完一系列的操作之后把该input的value值清空
  this.$refs.referenceUpload.value = null;
}

在使用element的隐藏组件 el-scrollbar时,出现过一种情况:
el-scrollbar的父元素的高度是不固定的,只有一个最大高度(max-height),但是el-scrollbar设置了高度为100%,就会出现滚动条失效的情况,在这种情况下,要解决这个问题,可以用一下方法:

.el-scrollbar{
  height" 100%;
  max-height: 310px;
}
.el-scrollbar__wrap{
  max-height: 310px;
}

可以给el-scrollbar设置样式:height:100%;max-height:310px(父元素的最大高度);同时

在element中使用el-scrollbar 需要注意:
1.el-scrollbar的父元素要有一个高度,max-height也就可以;
2.el-scrollbar的父元素不能有 overflow: hidden;会导致滚动条无法滚动 //不一定。。。。

axios传值问题

在使用axios和后台对接接口的时候,会出现content-type是application/x-www-form-urlencoded的时候,传输的数据格式不对,那么就可以对数据的格式进行转换,转换之后,后台就能顺利获取数据了!

两种方式:
方法一(在vue中适用,在其他jq的项目中 也使用)
如果是在vue中使用,那么就要在vue的拦截器里先把data的格式转换了,再传到后台去。

function (data) {
         let ret = ''
         for (let it in data) {
            ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
         }
         ret = ret.substring(0, ret.lastIndexOf('&'));
         return ret
      }

方法二(使用插件,使用之前记得安装或引入)

config.data = qs.stringify(config.data) // 转为formdata数据格式

备注
如果后台需要传入list类型的数据,即id[]: 1 id[]:2 这种格式的数据的话可以用以下方法:

config.transformRequest= [
                function (data) {
                    //有需要把数组以list类型转换发送到后台的,需要把数据进行转换
                    return qs.stringify(data, { arrayFormat: 'brackets' })
                }
            ]

以下是和传输数组数据到后台的qs配置相关内容:

qs.stringify({ids: [1, 2, 3]}, {arrayFormat: ‘indices‘})
//形式: ids[0]=1&aids[1]=2&ids[2]=3 @RequestParam无法接收
qs.stringify({ids: [1, 2, 3]}, {arrayFormat: ‘brackets‘})
//形式:ids[]=1&ids[]=2&ids[]=3 要加[]
qs.stringify({ids: [1, 2, 3]}, {arrayFormat: ‘repeat‘})
//形式: ids=1&ids=2&ids=3 不能加[]

如果需要传输文件到后台的话 content-type必须修改成multipart/form-data,但是数据格式可以不需要进行转换,可以直接传输到后台

config.headers['Content-Type'] = 'multipart/form-data';
 config.transformRequest= [
                    function (data) {
                        return data
                    }
                ]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355