文章目录
JS学习笔记
一、 强制渲染
-
this.$set(this.selectForm[index],“isUse”,true);
-
this.$forceUpdate();
二、正则
(一) IP的JS正则
a. /^(((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))$/
—匹配192.168.10.156
b. /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
—匹配192.168.10.156
实例:
validateIP(rule, value, callback) {
if (!value) {
callback(new Error("请填写IP"));
} else {
const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
if (!reg.test(value)) {
callback(new Error("IP格式不正确"));
} else {
callback();
}
}
},
学习:ip和端口号的正则表达式
工具地址:https://regex101.com/
(二) Port的JS正则
端口号的地址是:1-65535
a. /^(\:([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{4}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))$/
—匹配:8080
b. ^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$
—匹配8080
c. ^([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{4}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$
—匹配8080
实例:
validatePort(rule, value, callback) {
if (!value) {
callback(new Error("请填写端口"));
} else {
const reg = /^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$/;
if (!reg.test(value)) {
callback(new Error("端口格式不正确"));
} else {
callback();
}
}
},
学习:ip和端口号的正则表达式
(三)域名
域名的验证字段:
^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$
^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$
^(?=^.{3,255}$)(http(s)?:\/\/)?(www\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\d+)*(\/\w+\.\w+)*$
域名以及ip同时验证
validateIP(rule, value, callback) {
if (value == '' || value == undefined || value == null) {
callback(new Error('IP/域名不能为空'));
} else {
const reg = /((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d)(\.((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d)){3}/;
const domain = /^(?=^.{3,255}$)(http(s)?:\/\/)?(www\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\d+)*(\/\w+\.\w+)*$/
if (reg.test(value) && value != '') {
console.log(222)
callback();
} else if (domain.test(value) && value != '') {
console.log(333)
callback();
} else {
console.log(444)
callback(new Error('请输入正确的IP/域名'));
}
}
},
(四)URL地址
适用于
var textArr = ['www.baidu.com','http://www.baidu.com','http://www.baidu.com/','https://www.baidu.com/a/b/c','https://www.baidu.com:8080/a/b?t=123','https://www.baidu.com:8080/a/b?t=123&c=王炸','https://www.baidu.com:8080?a=网&b=33','http://192.168.99.111:1212/a/b/c','112.22.12.2','a.b.c','localhost/cc/2/b/5','ftp://192.17.11.22:22/测试.tar','https://m.www.baidu.我爱你:8080?a=战三&b=333&c=666'];
leakUrl: [{required: validateUrl, message: ‘请填写漏洞地址’, trigger: ‘blur’}],
const checkURL = (url) => {
const strRegex = '^((https|http|ftp)://)?'//(https或http或ftp):// 可有可无
+ '(([\\w_!~*\'()\\.&=+$%-]+: )?[\\w_!~*\'()\\.&=+$%-]+@)?' //ftp的user@ 可有可无
+ '(([0-9]{1,3}\\.){3}[0-9]{1,3}' // IP形式的URL- 3位数字.3位数字.3位数字.3位数字
+ '|' // 允许IP和DOMAIN(域名)
+ '(localhost)|' //匹配localhost
+ '([\\w_!~*\'()-]+\\.)*' // 域名- 至少一个[英文或数字_!~*\'()-]加上.
+ '\\w+\\.' // 一级域名 -英文或数字 加上.
+ '[a-zA-Z]{1,6})' // 顶级域名- 1-6位英文
+ '(:[0-9]{1,5})?' // 端口- :80 ,1-5位数字
+ '((/?)|' // url无参数结尾 - 斜杆或这没有
+ '(/[\\w_!~*\'()\\.;?:@&=+$,%#-]+)+/?)$';//请求参数结尾- 英文或数字和[]内的各种字符
const strRegex1 = '^(?=^.{3,255}$)((http|https|ftp)?:\/\/)?(www\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\d+)*(\/)?(?:\/(.+)\/?$)?(\/\w+\.\w+)*([\?&]\w+=\w*|[\u4e00-\u9fa5]+)*$';
const re = new RegExp(strRegex, 'i');//i不区分大小写
//将url做uri转码后再匹配,解除请求参数中的中文和空字符影响
if (re.test(encodeURI(url))) {
return (true);
} else {
return (false);
}
}
(五)同时验证手机号码和固定电话号码(带区号或不带区号或带分机号)
^1\d{10}$|^(0\d{2,3}-?|\(0\d{2,3}\))?[1-9]\d{4,7}(-\d{1,8})?$
验证:
三、时间类型转换
//Fri Mar 18 2022 14:24:45 GMT+0800(中国标准时间)
//转
//YYYY-MM-DD HH:mm:ss
data.format('YYYY-MM-DD HH:mm:ss')
详情可了解:
js 各种时间格式的转换
四、Echarts页面自适应(VUE3)
这是系统文档写的自适应方法,但是我发现只有修改该页面代码后第一次访问该Echarts时才会自适应,之后刷新页面重新访问,Echarts就不能自适应了,会出现留白或者图表显示不全面问题。
window.onresize = () => {
console.log(123)
Echarts.resize()
}
经检查发现,后面访问Echarts时,数据不会改变,所以mounted函数不会再次运行,所以里面的自适应方法并不会呗调用,解决办法,可以在这个方法外面包一个监听方法,推荐使用下面第二个,第一个有可能还没执行完function函数,就监听完成了。
window.addEventListener('resize', function () {
window.onresize = () => {
console.log(123)
Echarts.resize()
}
})
或者
// 自适应大小
window.addEventListener('resize',
window.onresize = () => {
console.log('漏洞7日内趋势:监听屏幕变化')
Echarts.resize()
}
)
当页面有变化时,页面监听函数会执行,便会调用到自适应方法,问题完美解决!
感谢博主:JS监听页面宽度发生变化
五、子父组件传值
父组件接收子组件传值:
父组件:
<projectFome v-if="nums === 1" @getValue="getSonValue"/>
子组件:
emit("getValue", 3)
父组件向子组件传值:
父组件:
<template>
<div class="parent">
<Child message="Hello, I am parent!"></Child>
</div>
</template>
子组件:
<template>
<div class="child">
<p>子组件:{{ message }}</p>
</div>
</template>
<script>
export default {
name: 'Child',
props: ['message'], //引入父参
data () {
return {}
}
}
</script>
六、JS控制全屏
各浏览器为了用户体验,禁止js自动全屏,意味着需要用户与浏览器交互才能触发以下全屏API。
Html:
全屏按钮:
<!--全屏按钮-->
<div style="margin: 12px 0; text-align: right">
<span type="primary" @click="screen" class="full">
<fullscreen-outlined />
</span>
</div>
全屏容器:
<div id="content">
<a-row style="margin-left: -4%;margin-top:2%">
<a-col :span="5" class="other">
<a-input-search
placeholder="请输入要查询的组件信息名称"
enter-button="搜索"
@search="onSearch" v-model="ActData"
allowClear
/>
</a-col>
</a-row>
<areaChart :chart-data="ActivityData" v-model:val="ActData" ref="dialog"></areaChart>
</div>
JavaScript:
// 是否全屏
const fullscreen = ref(false)
const screen = () => {
//控制是否显示全屏
// let element = document.documentElement;
let element = document.getElementById('content')
if (fullscreen.value) {
// 退出全屏
if (document.exitFullscreen) {
document.exitFullscreen()
} else if (document.webkitCancelFullScreen) {
document.webkitCancelFullScreen()
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen()
} else if (document.msExitFullscreen) {
document.msExitFullscreen()
}
} else {
// 进入全屏
if (element.requestFullscreen) {
element.requestFullscreen()
} else if (element.webkitRequestFullScreen) {
element.webkitRequestFullScreen()
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen()
} else if (element.msRequestFullscreen) {
// IE11
element.msRequestFullscreen()
}
}
fullscreen.value = !fullscreen.value
}
容器中搜索框值:
const dialog = ref("")
const ActData = ref('') // 组件图表数据
const onSearch = (searchValue) => {
console.log(searchValue,'ActData')
ActData.value = searchValue
setTimeout(() => {
dialog.value.initChart()
}, 300)
}
七、小工具:base64转图片
参考:https://blog.51cto.com/u_14475876/2834925
注意:转义的时候需要去除多余的部分,一般前后端联调的时候,前面会有image;base64等信息,需要去掉
八、图片转Base64
方法一:
console.log(file)
const reader = new FileReader()
// 因为这两个组件的fils文件不一样所有一个判断
if (file.originFileObj) {
reader.readAsDataURL(file.originFileObj)
} else {
reader.readAsDataURL(file)
}
reader.addEventListener('load', () => {
// this.base64 = reader.result
console.log( reader.result)
})
方法二:
//读取文件的字符流
const reader = new FileReader();
// 将文件读取为 DataURL 以data:开头的字符串
reader.readAsDataURL(file);
reader.onload = e => {
// 读取到的图片base64 数据编码 将此编码字符串传给后台即可
const code = e.target.result;
console.log(code, 'code')
// this.formData.cover = code;
}
效果:
九、数字字符串转数字
1.Number()
不会改变数字大小,小数也可以进行转换
2. parseInt()
会改变数字大小,保留整数,后面数字四舍五入
3. xxx.toFixed(2)
保留两位小数,进行四舍五入
前端后续发展可了解方向:
业务逻辑、单页面、sdn、seo