Vue开发技巧

标签: 无 分类: 未分类 创建时间:2023-01-13 06:22:57 更新时间:2023-10-20 11:23:26

1.跨域问题

使用vue进行前后台分离的开发,问题出现是这样的,后台使用spring+boot在电脑192.168.34.40:8080/xx电脑的tomcat中运行,开启跨域请求。前台使用vue+axios在192.168.34.41:9000上开发,前台要想获取后台的请求资源,按官网的方法,vuecli3以上,在package.json同一级下的vue.config.js配置文件中写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// vue.config.js
module.exports = {
devServer: {
port:9000,
proxy: {
'/api': {
target: 'http://192.168.34.40:8080/xx/',
//target: 'http://192.168.34.40:7000/',
ws: true,
logLevel:"debug",
changeOrigin: true
// pathRewrite:{
// '^/apis': ''
// }
},
'/user': {
target: 'http://192.168.34.40:8080/xx/',
//target: 'http://192.168.34.40:7000/',
ws: true,
logLevel:"debug",
changeOrigin: true
// ,pathRewrite:{
// '^/user': ''
// }
}
}
}
}

经过尝试,假如前后台都在同一台机器(40),只是端口不同,是没有问题的。对于不同的ip,不同的端口,就失效了。原因在于,后台设置cookie时,path路径为/xx,而经过vue代理的cookie,path=/,当前开发路径与后台设置的path不同,所以后台无法获取相应的cookie,解决方法为,为axios加入baseurl以及withCredentials:true。

1
2
3
4
5
6
7
axios({
url:'/user/login'
,baseURL: 'http://192.168.34.40:8080/xx/'
,withCredentials: true, // default
}).then(function (response) {
console.log(response);
})

这样就相当于告诉axios请求全部用全路径请求,后台设置path就会是全路径的path,下一次请求时也会将cookie带上,有点jsonp的味道。至于vue.config.js中的proxy就可以去掉了。
后台的spring boot跨域设置:实现WebMvcConfigurer接口,重写addCorsMappings方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 //跨域设置
@Override
//重写父类提供的跨域请求处理的接口
public void addCorsMappings(CorsRegistry registry) {
//添加映射路径
registry.addMapping("/**")
//放行哪些原始域
.allowedOrigins("*")
//是否发送Cookie信息
.allowCredentials(true)
//放行哪些原始域(请求方式)
.allowedMethods("GET","POST", "PUT", "DELETE")
//放行哪些原始域(头部信息)
.allowedHeaders("*");
//暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
//.exposedHeaders("Header1", "Header2");
}

2.监听window的resize事件

说是Vue监听window的resize事件,不如说是js直接监听window.onresize,因为vuejs也不是全能的,对于windows上的事件来说,也不能全部写一个语法糖,这里我们姑且直接使用windows.onresize事件进行处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mounted() {
//设置列表的高度自适应窗口
let resizeTimer = null
let $searchlist=this.$el.querySelector('.searchlist');
let body=document.querySelector('body');
window.onresize=() => {
if (resizeTimer) {
clearTimeout(resizeTimer)
}
let bodyStyle=window.getComputedStyle(body);
console.log(bodyStyle.height);
resizeTimer = setTimeout(() => {
$searchlist.style.maxHeight='';
}, 400);
}
}

需要说明的是:
1.关于resize事件触发的优化,针对scroll也是一样。为了避免用户随意改变窗口大小,致使resize事件不断的触发,需要添加一个延迟,如果在400毫秒之内,resize持续触发了,那么就直接将上一个事件处理程序抛弃掉重新设置事件监听,这样可以避免resize中的代码被重复执行。

1
2
3
4
5
6
7
8
9
10
var resizeTimer = null;
window.onresizie= function () {
if (resizeTimer) {
clearTimeout(resizeTimer)
}
resizeTimer = setTimeout(function(){
console.log("window resize");
}, 400);
}
);

2.在项目中 window.onresize只能挂载一次,在多个页面中同时挂载 window.onresize时,只有其中一个 window.onresize会起作用。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。