一、css
1、毛玻璃
https://ithelp.ithome.com.tw/articles/
2、绑定class
方式一内联
:class="item.itemType==5 ? 'company-info' : 'company-infos' 绑定多个calss: :class ="[index == 0?'':'op-bg2',index == 2? 'mini-grey':'op-bg']" 简化 <div v-bind:class="[{ active: isActive }, errorClass]"></div> active为类名 依赖于isActive真值
讯享网
方式二 -对象
讯享网<div v-bind:class="classObject"></div> data: { classObject: { active: true, 'text-danger': false } }
方式三 计算属性
<div v-bind:class="classObject"></div> data: { isActive: true, error: null }, computed: { classObject: function () { return { active: this.isActive && !this.error, 'text-danger': this.error && this.error.type === 'fatal' } } }
3、导航栏滚动分离
讯享网ul.left-nav { position: fixed; left: 0; top: 0; bottom: 0; overflow-x: hidden; }
4.隐藏div滚动条
/deep/.department .ivu-col-span-4 .ivu-card-body::-webkit-scrollbar{ display: none !important; } // 火狐隐藏滚动条
5.对象样式
讯享网:value-style="subItem.nums == 0 ?{ 'padding-right': '40rpx' }:''"
6.下拉框 --页面可移动
overfow:hidden
7.字体在标签内平均分布
讯享网display: inline-block; width: calc(100% - 26rpx); text-align-last: justify;
8.pc端下拉框层级问题
transfer属性
9、渐变边框 border-radius无效问题
讯享网利用矩形裁剪 clip-path: inset(0 round 10px);
二、ui框架🕳
uview坑🕳
1.swiper
问题:宽度三栏都定死,无法动态改变uview的值
解决方案:
①给swiper绑定高度样式
<swiper :current=“swiperCurrent” :style=“height:calc( i t e m H e i g h t ∗ {itemHeight}* itemHeight∗{length}*1rpx)” @change=“change” @transition=“transition” @animationfinish="animationfinish">
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dEZexCVy-83)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
②在change事件里面重新计算高度
讯享网
③
<i:style="{'color':isBling?'red':'white'}" @click=""></i>
2.flex布局文本溢出不换行问题
word-wrap:break-word;
word-break:break-all; //work
仲系唔得就用white-space: normal;
3、form校验日期问题
校验时加上 type:‘date’
4、表格内容为空替换为“-”且加上tooltip
讯享网 // 定义统一方法 function handleData (h, params){
return h('Tooltip', {
props: {
placement: 'top' } }, [ params?params:'--', h('span', {
slot: 'content', //slot属性 style: {
whiteSpace: 'normal', wordBreak: 'break-all', width:'100%' } }, params?params:'--')] ) } // 使用 render: (h, {
row:{
certLevelName}}) => {
return handleData(h,certLevelName) },
饿了么坑🕳
单选or多选失效
<!-- <el-checkbox v-for="(item, index) in handleList" :key="index" v-model="resultObj.codeList" :label="item.jgczid" >{
{ item.actionNote }}</el-checkbox > --> <el-checkbox-group v-model="codeList" > <el-checkbox v-for="item in handleList" :label="item.actionCode" :key="item.actionCode">{
{item.actionNote}}</el-checkbox> </el-checkbox-group>
未发现乜原因,可能系格式化代码问题
vantui坑🕳
时间选择器
讯享网 <van-datetime-picker wx:if="{
{showTime}}" type="date" placeholder="xx日前消除隐患" value="{
{ currentDate }}" min-date="{
{ minDate }}" formatter="{
{ formatter }}" data-index="{
{index}}" data-type="cleanDanger" bind:confirm="changeAdd" bind:cancel="close" v-model="currentDate" custom-class='currentDate' :min-date="minDate1" :formatter="formatter" // 无用 bind:input="onInput" />
onInput(e){
this.setData({
currentDate:e.detail, }); console.log("时间控件",e) }, timeFormat(_time) {
// 时间格式化 2019-09-08 let time = new Date(_time) let year = time.getFullYear(); let month = time.getMonth() + 1; let day = time.getDate(); return year + '-' + month + '-' + day },
三、js
1.Object.entries() 获取键值对
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-swx0YPc4-84)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
2.处理枚举值
3.字符串数组转对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-agn33OnP-84)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
item.rommateInfo = eval(‘(’+item.rommateInfo+‘)’);
4.解构赋值
讯享网}).then(({data: {list}}) => { list.map(item => { // 改id (item.id == id) && (this.docUrl = item.url) })
5.object.assign() 展开运算符替换object.assign()
1、数组 = Object.assign({title:title},records) 2、展开运算符 var obj1 = { foo: 'bar', x: 42 }; var obj2 = { foo: 'baz', y: 13 }; var clonedObj = { ...obj1 }; // 克隆后的对象: { foo: "bar", x: 42 } var mergedObj = { ...obj1, ...obj2 }; // 合并后的对象: { foo: "baz", x: 42, y: 13 }
6.获取数组某几个值
讯享网1、根据索引值 ①不改变原数组--slice ②改变原数组--splice // slice()方法 const sliceArr = arr.slice(-5) console.log('sliceArr ',sliceArr) // 得到[34,0,56,12,2] // slice(start,end)表示从下标start开始到下标end(不包括end)进行截取,得到的是一个新数组,不改变原数组。当start为负值时表示从倒数第几个元素开始往后截取,不填end的话就表示从倒数第几个元素开始截取,一直截取到数组末尾元素。 // splice()方法 const spliceArr = arr.splice(-5,5) console.log('spliceArr',spliceArr) // 得到[34,0,56,12,2] // splice()方法有三个参数,分别表示从哪个下标开始,删几个,新元素。可以实现增加,删除,替换数组元素的功能。arr.splice(-5,5)表示从倒数第五个元素开始,删五个元素。巧妙的是该方法的返回值是删除的元素集合。同时该方法改变了原数组。原数组变成了除了删除的元素剩下的元素集合。
7、filter用法
https://zhuanlan.zhihu.com/p/
function remove(arr, item) { return arr.filter(val => val != item); }
8、删除数组包含xx数据的某项
讯享网this.imgList.splice(imgList.indexOf(file), 1);
9、身份证等信息脱敏处理
{
{basicInfo.idcardNo.replace(basicInfo.idcardNo.substr(14, 17), '')}}
10、计算字符串长度&&按次数拼接字符串
讯享网 getByteLen(val) { var str = ''; for (var i = 0; i < val.length -1; i++) { str += "*" } return str; },
11、获取当前年月日
// 获取当前日期 getNowFormatDate() { let _this = this var date = new Date(); var month = date.getMonth() + 1; var strDate = date.getDate(); // 这里就要拿时分秒,不然会有卡顿情况 var hh = date.getHours(); var mm = date.getMinutes(); var ss = date.getSeconds(); if(hh < 10) { hh = '0' + hh } if(mm < 10) { mm = '0' + mm } if(ss < 10) { ss = '0' + ss } let str = month + '月' + strDate + '日' let dateStr = hh + ':' + mm + ':' + ss this.setData({ date: str, time: dateStr }) },
12、去掉字符串后几个值
讯享网str.substring(0, str.length - 6);
13.获取url参数
方法一、 const params = new URLSearchParams(location.search.replace(/\?/ig, "")); // location.search = "?name=young&sex=male" params.has("young"); // true params.get("sex"); // "male" 方法二、 // 获取url的某个值 getUrlkey(url) { var params = {}; var urls = url.split("?"); var arr = urls[1].split("&"); for (var i = 0, l = arr.length; i < l; i++) { var a = arr[i].split("="); params[a[0]] = a[1]; } console.log('5_结果:', params) return params; },
14、获取对象键值对
讯享网for (const [key, value] of Object.entries(object1)) { console.log(`${key}: ${value}`) console.log(key) } 2、数组转对象键值对 怎么取怎么赋值 logoEnums[value] = title
15、toString与toLocaleString的区别
1、a.toString()"1234" a.toLocaleString() "1,234" 2、var sd=new Date() sd.toLocaleString() "2017/2/15 上午11:21:31"
16、解构赋值配合rest使用
讯享网({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}); console.log(a); // 10 console.log(b); // 20 console.log(rest); // {c: 30, d: 40}
17、修改对象或数组的键名
var key = 'abc' ; var obj = {
key : '值' }; // 复制原来的值 obj[key] = obj[ 'key' ]; // 删除原来的键 delete obj[ 'key' ];
18、换行
讯享网\r\n ---字符串拼接换行
19、关于for循环总返回最后一个值问题
https://es6.ruanyifeng.com/#docs/let
解决方法:将var改为let 因为var 的原因,遍历时候每次都会重写变量 i 的地址 作用域问题 上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改变,而循环内被赋给数组a的函数内部的console.log(i),里面的i指向的就是全局的i。也就是说,所有数组a的成员里面的i,指向的都是同一个i,导致运行时输出的是最后一轮的i的值,也就是 10。 如果使用let,声明的变量仅在块级作用域内有效,最后输出的是 6。
20、js-cookie的使用
讯享网let v = JSON.parse(Cookies.get("userInfo")); Cookies.set("userInfo", JSON.stringify(res.result), {
expires: 7 });
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4fWywXGf-85)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
退出的时候清除cookie
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oAcPTY49-85)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
21、判断android、ios终端
var u = navigator.userAgent; var isAndroid = u.indexOf("Android") > -1 || u.indexOf("Adr") > -1; //android终端 var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 if (isAndroid) {
this.phoneReszie(); }
22、数组去重
讯享网const arr = [...new Set([0, 1, 1, null, null])]; // 更简单的es66666 this.value3 = Array.from(new Set(this.value3))
23、比较时间大小
// 直接用new Date() changeTime(current,start,end){
let startDate = new Date(current) let endDate = new Date(start) if (startDate && endDate) {
if (startDate > endDate) {
if (type == "startDate") {
this.$message({
duration: 3000, showClose: true, message: "开始时间不能大于结束时间", type: "warning", }); this.params[current] = ""; } } } },
24、获取当前日期前一周时间
讯享网getDay(day){
var today = new Date(); var targetday_milliseconds=today.getTime() + 1000*60*60*24*day; today.setTime(targetday_milliseconds); //注意,这行是关键代码 var tYear = today.getFullYear(); var tMonth = today.getMonth(); var tDate = today.getDate(); tMonth = this.doHandleMonth(tMonth + 1); tDate = this.doHandleMonth(tDate); return tYear+"-"+tMonth+"-"+tDate; } doHandleMonth(month){
var m = month; if(month.toString().length == 1){
m = "0" + month; } return m; }
25、获取元素距离顶部高度
doc.getBoundingClientRect().top //元素距离顶部高度
25、点样只获取第二个参数
讯享网当然是用arguments[index]
25、reduce的使用
1)只获取每项的某个元素
let arr = numbers.reduce((total, currentValue)=> [...total,currentValue.name],[])
26、JSON字符串格式化展示
将字符串转成sjon对象再处理
讯享网JSON.stringify(JSON.parse(data), null, "\t")
27、默认参数
将字符串转成sjon对象再处理
const search = (arr, low=0,high=arr.length-1) => {
return high; }
27、替代递归处理树形化一维数组
由于递归性能耗费巨大巨大,用一次遍历替代!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XWVEl1q1-86)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\52.png)]
讯享网var arr = [ {
id: 1, name: '父级部门1', pid: 0}, {
id: 9, name: '父级部门2', pid: 0}, {
id: 2, name: '子级部门1', pid: 1}, {
id: 3, name: '子级部门2', pid: 9}, {
id: 4, name: '孙级部门', pid: 3}, {
id: 5, name: '部门5', pid: 4}, ] function toArr(arr) {
const resList = []; // 结果 const map = {
}; // 映射 for(const item of arr){
let {
id, pid} = item; map[id] = {
...item, map[id]?.children || []} if(pid == 0){
resList.push(map[id]) }else {
map[pid] = map[pid] || {
children:[]} map[pid].children.push(map[id]) } } return resList }
四、uniapp
1、两个页面来回跳转,跳转太深导致难以返回上一级页面
使用uni.redirectTo()代替uni.navigateTo使得所跳转的页面唔入栈
https://uniapp.dcloud.io/api/router?id=navigateback
2.uniapp 路由传对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bc29Xbmt-87)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
五、git指令
1.手多多创建左分支点算啊?
①先git branch -a 查看所有分支
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GAOVMhfC-87)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
②再删除分支啦 git push origin --delete 分支名 记得唔要remotes同orign波,唔系会报错
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mtmUDZie-88)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
2.克隆左项目之后点样切换分支啊?
git checkout -b dev-01- origin/dev-01-
3、合并分支了咋?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tStq3QK4-88)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
1、按 i 2、随便输入几个字 3、esc 4、shift + : 5、输入 wq 回车
讯享网小乌龟合并分支代码 https://blog.csdn.net/huangerbian/article/details/?ops_request_misc=&request_id=&biz_id=102&utm_term=svn%E5%90%88%E5%B9%B6%E4%BB%A3%E7%A0%81&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-.142^v63^control,201^v3^control_1,213^v2^t3_control2&spm=1018.2226.3001.4187
六、不要不要用jquery!!
1、监听input change事件并且获取value
$("#searchInput").bind("input propertychange", function() { var inputValue = document.getElementById('searchInput').value console.log("改变了",inputValue) });
2、时间戳转换
https://blog.csdn.net/_/article/details/?ops_request_misc=%25257B%request%25255Fid%%25253A%%%25252C%scm%%25253A%713.…%%25257D&request_id=91&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-1-.first_rank_v2_pc_rank_v29&utm_term=js%E6%97%A5%E6%9C%9F%E8%BD%AC%E6%8D%A2%E6%97%B6%E9%97%B4%E6%88%B3
`
讯享网function timestampToTime(timestamp) { var date = new Date(timestamp * 1000);//时间戳为10位需*1000,时间戳为13位的话不需乘1000 var Y = date.getFullYear() + '-'; var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; var D = date.getDate() + ' '; var h = date.getHours() + ':'; var m = date.getMinutes() + ':'; var s = date.getSeconds(); return Y + M + D + h + m + s; } // 注:时间戳转时间(ios手机NaN) function getTime(nS) { var date=new Date(parseInt(nS)* 1000); var year=date.getFullYear(); var mon = date.getMonth()+1; var day = date.getDate(); var hours = date.getHours(); var minu = date.getMinutes(); var sec = date.getSeconds(); return year+'/'+mon+'/'+day+' '+hours+':'+minu+':'+sec; }
var date = new Date('2014-04-23 18:55:49:123'); // 有三种方式获取 var time1 = date.getTime(); var time2 = date.valueOf(); var time3 = Date.parse(date); console.log(time1);//23 console.log(time2);//23 console.log(time3);//00
七、vue
1、vuex噶使用(pc篇)
1、先系index.js
讯享网 state: { // 状态 isdepartmentChoose:false, username:''|| localStorage.getItem('username'), departmentId:''|| localStorage.getItem('departmentId'), isTop:''|| localStorage.getItem('isTop'), oldDepartmentId:'', homeDepartmentId:'', }, mutations: { // 改变方法 handleUsername: (state, username) => { state.username = username localStorage.setItem('username', username) }, handleDepartmentId: (state, departmentId) => { state.departmentId = departmentId localStorage.setItem('departmentId', departmentId) }, handleIsTop: (state, isTop) => { state.isTop = isTop localStorage.setItem('isTop', isTop) } }, getters : { username: (state) => state.username, departmentId: (state) => state.departmentId, isTop: (state) => state.isTop },
2.要用噶页面
赋值 this.$store.commit("handleUsername",this.select);
讯享网取值 this.isTop = this.$store.state.isTop
2、watch噶使用 --vue 强制组件重新渲染
https://blog.csdn.net/zyx/article/details/
方法一、
<template> <third-comp v-if="reFresh"/> </template> <script> export default{
data(){
return {
reFresh:true, menuTree:[] } }, watch:{
menuTree(){
this.reFresh= false this.$nextTick(()=>{
this.reFresh = true }) } } } </script>
方法二、 好用过vif
讯享网<template> <third-comp :key="menuKey"/> </template> <script> export default{
data(){
return {
menuKey:1 } }, watch:{
menuTree(){
++this.menuKey } } } </script>
2.1watch监听对象里的值变化
‘对象.对象’
2.2 watch的val是浅拷贝!!
修改监听的值要深拷贝一下!不然会死循环
You may have an infinite update loop in watcher with expression "equipList"
3、计算属性computed
点解要用computed唔用方法?
计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
watch与computed对比?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V1uNV7eU-89)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P4WIFnuA-90)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
4、Vue引入外部js变量和方法
.sync的用法
https://blog.csdn.net/liushijun_/article/details/
讯享网//父组件将name传给子组件并使用.sync修饰符。 <Footers :name.sync="name"> </Footers> //子组件触发事件 mounted () { console.log(this.$emit('update:name',)); }
5、Vue父子组件子组件直接改变父组件props属性值

https://blog.csdn.net/yangwqi/article/details/?ops_request_misc=%257B%2522request%255Fid%2522%253A%%2522%252C%2522scm%2522%253A%3..pc%255Fall.%2522%257D&request_id=82&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-2-.first_rank_v2_pc_rank_v29&utm_term=Avoid+mutating+a+prop+directly+since+the+value+will+be+overwritten+whenever+the+parent+component+re-renders.+Instead%2C+use+a+data+or+computed+property+based+on+the+prop%27s+value.+Prop+being+mutated%3A+%22sa
// 避免直接更改props属性值 子组件中找一个中间变量传值 // 避免直接修改props activeTopTemp: this.topActive,
6、只更新一次数据 v-once && 只触发一次点击事件
讯享网<span v-once>这个将不会改变: {
{ msg }}</span> <a v-on:click.once="doThis"></a>
7、filter的使用
{
{ addFileForm.visiRange | filterPerson }} filters: { filterPerson(value) { if (value == 1) { return "全部可见"; } else if (value == 2) { return "按人员可见"; } else if (value == 3) { return "按线路可见"; } else if (value == 4) { return "按铁路单位可见"; } }, },
8、webpackChunkName注释
讯享网webpackChunkName 是为预加载的文件取别名,作用就是webpack在打包的时候,对异步引入的库代码(lodash)进行代码分割时(需要配置webpack的SplitChunkPlugin插件),为分割后的代码块取得名字 import异步加载的写法实现页面模块lazy loading懒加载(Vue中的路由异步加载): Vue中运用import的懒加载语句以及webpack的魔法注释,在项目进行webpack打包的时候,对不同模块进行代码分割,在首屏加载时,用到哪个模块再加载哪个模块,实现懒加载进行页面的优化
9、命令
1、vue不是XX命令:npm i -g @vue/cli 2、卸载node:where node 找到node位置直接删掉 3、安装node:node官网找到历史版本,msi的直接安装
10、关于移动端适配使用rem问题
讯享网1、vue不是XX命令:npm i -g @vue/cli 2、卸载node:where node 找到node位置直接删掉 3、安装node:node官网找到历史版本,msi的直接安装
11、class的使用
class linkObj{ constructor(name,text,type){ if(text=='解职' || text== '岸基人员' || type == 3){ this.source = name; this.target = center.name; }else { this.source = center.name; this.target = name; } this.label = {show:true} } getObj(){ return this; } } let obj = new linkObj(name,text,type);
12、动态使用assesst图片
讯享网require(`@/assets/fullview/ship/chuanjianlei.svg`),
13、自定义表头
// 获取头部 selectHeader(e) {
// 弄两个数组 let keyArr = [] let NameKeyArr = [] // 循环表头 this.checkList.forEach((item) => {
let key = item.split('-')[0] let name = item.split('-')[1] keyArr.push(key) if(name == '船舶类型') {
NameKeyArr.unshift({
minWidth: '200', prop: key, label: name }) }else {
NameKeyArr.push({
minWidth: '200', prop: key, label: name }) } }) // 给最后一列表头加东西 NameKeyArr.push({
button: true, label: '操作', group: [{
name: '管理', type: 'primary', plain: true, onClick: (row, index) => {
// 箭头函数写法的 this 代表 Vue 实例 console.log("管理阿") console.log(row) this.goToShipDetail(row.tgcShipInfoId) // this.$router.push({path:'/manage9/page/index',query: {shipIds:row.TGC_SHIP_INFO_ID}}) } }] }) // 设置表头 if(NameKeyArr.length) {
this.tableHeader = NameKeyArr }else {
//船舶名称(中文) this.tableHeader = [ {
prop: 'shipName', label: '船名', width: 200, }, {
prop: 'shipId', label: '船舶识别号', width: 200, }, {
prop: 'shipType', label: '船舶类型', width: 200, }, {
prop: 'lastReportTm', label: '最近进出港报告时间', width: 200, }, {
prop: 'lastSupervisionTm', label: '最近现场监督检查时间', width: 200, }, {
prop: 'lastControlTm', label: '最近船舶安全检查记录时间', width: 200, }, {
prop: 'riskAttribute', label: '船舶风险属性', width: 200, render: (row, index) => {
return row.riskAttribute } }, {
prop: 'flagState', label: '标记状态', width: 200, render: (row, index) => {
return row.flagState } }, {
button: true, label: '操作', fixed: 'right', group: [{
name: '管理', type: 'primary', plain: true, onClick: (row, index) => {
// 箭头函数写法的 this 代表 Vue 实例 console.log("管理阿") console.log(row) this.goToShipDetail(row.tgcShipInfoId) // this.$router.push({path:'/manage9/page/index',query: {shipIds:row.TGC_SHIP_INFO_ID}}) } }] }] } let checkedCount = this.checkList.length; this.checkAll = checkedCount == this.allHeaderArr.length; this.isIndeterminate = checkedCount > 0 && checkedCount < this.allHeaderArr.length; this.showTableSet = false this.listData() },
14、this.$confirm取消异步 async await
讯享网if(this.pagination.total > 500 && await this.$confirm('当前导出数据过多有可能造成导出失败,是否继续?', '提示', { distinguishCancelAndClose: true, type: 'warning', confirmButtonText: '保存', cancelButtonText: '取消' }).catch(() => {}) !== 'confirm') { return }
15、同一个页面使用相同的组件,组件里面使用节流Throttle,导致两个组件的值相同了,改了其中一个值,另一个组件的值也修改了。
const throttle = (fn, delay) => {
var delay = delay || 200; var timer; return function () {
var th = this; var args = arguments; if (timer) {
clearTimeout(timer); } timer = setTimeout(function () {
timer = null; fn.apply(th, args); }, delay); }; } methods:{
changeContentInput:throttle((e) => {
console.log(e); _this.getAnalyticFormula(e); },500), }
八、小程序 的崩溃历程
1、父子组件传值 && 子组件调用父组件方法
- 父组件
讯享网
<common-dialog show="{ {show}}" confirm="{ {confirm}}" cancel="{ {cancel}}" bind:confirm="confirm" bind:cancel="cancel"> </common-dialog> - 子组件
html <van-button type="info" custom-class="confirm" bind:tap="confirm">{ {confirm}}</van-button> <van-button type="info" custom-class="cancel" bind:tap="cancel">{ {cancel}}</van-button> css confirm(){ let _confirm = {confirm:true} this.setData({show:false}) this.triggerEvent('confirm',_confirm) },
2、父组件调用子组件方法
- 父组件
讯享网
1、引用 <infoBox orderId="{ {id}}" id="infoBox" bind:getTransOrderInfo="getTransOrderInfo"></infoBox> 2、方法 // 调用子组件方法 getTransOrderInfo() { var infoBox = this.selectComponent("#infoBox") console.log(infoBox.data) //子组件的数据 infoBox.getTransOrderInfo() //子组件的方法 }, - 子组件
getTransOrderInfo() { }
3、微信小程序:使用普通链接二维码跳转到小程序,解析二维码携带参数(微信扫普通普通链接二维码和小程序里扫二维码解析参数方法)
https://blog.csdn.net/yuyu0yuyu/article/details/
4、微信小程序打开PDF
后端要转成https – 要配置ngnix
若要在小程序内置环境打开,加上type:pdf 🌾
[‘upReportArr[’ + index + ‘].protectRegion’]:e.detail
5、微信小程序filters
https://blog.csdn.net/laishaojiang/article/details/
6、wx.navigatorBack返回上一页携带参数
讯享网 var pages = getCurrentPages(); var currPage = pages[pages.length - 1]; //当前页面 var prevPage = pages[pages.length - 2]; //上一个页面 //直接调用上一个页面对象的setData()方法,把数据存到上一个页面中去 prevPage.setData({ data:data }); wx.navigateBack({ delta: 1 })
7、微信小程序跳转页面携带对象
页面一: const details = encodeURIComponent(JSON.stringify(this.data.ArticleList[index])); wx.navigateTo({ url: `../article-detail/article-detail?details=${details}` }); 页面二: const details = JSON.parse(decodeURIComponent(options.details));
8、组件样式隔离,无法使用公用样式问题
讯享网json文件添加公用样式 "styleIsolation": "shared"
8、onshow获取options
// 获取当前小程序的页面栈 let pages = getCurrentPages(); // 数组中索引最大的页面--当前页面 let currentPage = pages[pages.length-1]; // 打印出当前页面中的 options console.log(currentPage.options)
9、vant-dialog before-close用法 (深坑)
讯享网XHTML <van-dialog use-slot class="dialog-box" show="{
{ showDialog }}" show-cancel-button confirmButtonText="确定" before-close="{
{ beforeClose }}" > JS(写在data里面) beforeClose(action) { console.log(action,222); return new Promise((resolve) => { setTimeout(() => { if (action === 'confirm') { resolve(true); } else { // 拦截取消操作 resolve(false); } }, 1000); }) }
10、微信小程序echarts层级覆盖其他组件
force-use-old-canvas=“false”(这个更坑) 无办法的,只能控制显示隐藏然后重新刷新 以下介绍一下echarts的使用方法: index.wxml <view class="canvas-box" hidden="{
{showSelect}}"> <ec-canvas id="clock-dom-chart" canvas-id="clock-chart" ec="{
{ clockChart }}"></ec-canvas> </view> index.js clockChart:{
lazyLoad: true } let ecComponent = this.selectComponent('#clock-dom-chart'); ecComponent.init((canvas, width, height, dpr) => {
// 获取组件的 canvas、width、height 后的回调函数 // 在这里初始化图表 const chart = echarts.init(canvas, null, {
width: width, height: height, devicePixelRatio: dpr // new }); //调用设定EChart报表状态的函数,并且把从后端拿到的数据传过去 chart.setOption(option); // 注意这里一定要返回 chart 实例,否则会影响事件处理等 return chart; });
11、微信小程序动态修改style
讯享网style="height:{
{100 / typeList.length}}%"
12、微信小程序下载文件预览啥的
// 预览文件 url 文件路径 function previewFile(url,type) {
console.log(url,type); let tempArr = type.split('.') let fileType = tempArr[tempArr.length - 1] let fileTypeArr = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf'] let imgTypeArr = ['jpg', 'png', 'jpeg', 'gif'] wx.downloadFile({
url: url, success: function (res) {
wx.hideLoading() const filePath = res.tempFilePath if (fileTypeArr.indexOf(fileType) !== -1) {
wx.openDocument({
filePath: filePath, fileType: type, success: function (res) {
console.log('打开成功',res); }, fail: (err) => {
console.log('打开失败',err); } }) } else if (imgTypeArr.indexOf(fileType) !== -1){
wx.previewMedia({
sources: [{
url:res.tempFilePath || url}], url: res.tempFilePath || url, // 当前预览资源的url链接 success: function (res) {
console.log('打开成功',res); }, fail: (err) => {
console.log('打开失败',err); } }) } } }) }
13、微信小程序调用没有ssl证书的https(如 https:// 192.19.21.xx)
讯享网1、让后端配置http,体验版发布后打开开发调试模式即刻使用 2、由于PC版微信没有开发者模式无法使用http,可以选择下载一个手机模拟器安装微信使用
九、ES6&ES8
1、promise.all与promise.race
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled

promise.all 并行执行多个异步操作,并且在一个回调中处理所有的返回数据
promise.race 排序进行,谁先执行的快,以谁为基准执行then
promise.allsettled:不管resolve还是reject,不用catch统一返回
Promise.all([runAsync1(), runAsync2(), runAsync3()]).then((results)=>{ console.log(results); }); Promise.allSettled(promises). then((results) => results.forEach((result) => console.log(result.status)));
2、async&await
异步函数同步执行
3、always
promise请求结束
4、处理async/await
讯享网function AsyncTo(promise) { return promise.then(data => [null, data]).catch(err => [err]); } const [err, res] = await AsyncTo(Func());
十、typora
1、文档之间跳转
https://blog.csdn.net/_/article/details/?ops_request_misc=%257B%2522request%255Fid%2522%253A%%2522%252C%2522scm%2522%253A%3.…%2522%257D&request_id=46&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-.first_rank_v2_pc_rank_v29&utm_term=typora%E6%96%87%E4%BB%B6%E9%97%B4%E8%B7%B3%E8%BD%AC
十一、JSSDK的坑
jweixin-1.2.0.js里面的执行方式不适合直接webpack。我看到的报错是cannot read title of undefined,不知道你们是不是这个问题。
这个问题的原因是,里面在执行this.document.title的时候出的问题,这个js期望实在浏览器全局作用域下执行(this指向window),但是webpack之后,是在一个function作用域下执行,因此this.document为undefined。
因此有几种方式修改:
改源码,将jweixin-1.2.0.js中第一个this改为window
在html中使用script引入
webpack有个script-loader可以让模块文件在global环境下执行,可以试试看
十二、node报错大全
十三、webpack
vue.config.js配置https://webpack.docschina.org/configuration/
1、关于环境变量
https://www.jianshu.com/p/f4638f5df1c7
2、缩小打包体积
① 🚚 vue.config.js productionSourceMap设置为false
productionSourceMap:true 每个打包后的js文件都会有一个对应的map文件 不加密源码
map文件的作用:项目打包后,代码都是经过压缩加密的,如果运行时报错,输出的错误信息无法准确得知是哪里的代码报错。 有了map就可以像未加密的代码一样,准确的输出是哪一行哪一列有错。
3、图片打包优化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DWyQS10r-90)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
4、打包Html资源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-54HuszQm-91)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
5、压缩css大小
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ELCa99Ut-92)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
6、
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-prQusaQh-92)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
6、压缩html、js代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2OeA6QqH-92)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
7、webpack打包性能优化 - HMR
开启热模块替换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4CGY0Y6G-93)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P9f2okbF-93)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\image-.png)]
十四、dom-to-image兼容ios
问题:多个div转换成图片,拼接在一起生成一张截图
原方案:将每个div都生成图片,但ios大部分机型会出现背景图黑屏,最后一张无法渲染出来的情况。目前没研究出来什么问题,猜测是渲染机制问题?
尝试解决一:网上说利用toSvg能解决问题,但测试过多张图片生成的时候,网页能出现生成的图片,但页面无法展示(有可能是图片层级太低,被覆盖了),且svg图片无法实现长按保存。
尝试解决二:重复渲染多张图片,每张图片此时可以出来,但是最后生成的时候,偶尔会导致黑屏的情况,有可能是代码里面没有处理好渲染的顺序。
尝试解决三:新写一个div,先将当前的四个div拼接在一起,直接生成拼接好的div。(这样有点蠢,但是他work了)。注意:此处不能用svg(会黑屏)。但是还有部分顽强的部分机型,第一次背景图会黑屏,第二次才正常!那就模拟用户多触发一下生成图片,终于work了!但是这样会慢一点且猥琐,但是目前没测试出更好的方法了QAQ。。。
十五、H5背景音乐兼容ios(微信浏览器) 自动播放
步骤一
讯享网npm jweixin
步骤二
var innerAudioContext = uni.createInnerAudioContext(); // 获取audio对象 jweixin.config({
});// 不做任何签名验证都可以 jweixin.ready(function(){
WeixinJSBridge.invoke('getNetworkType', {
}, function(e){
innerAudioContext.play(); }) })
十五、H5背景音乐兼容ios(微信浏览器) 自动播放
后端返回xls文件流怎么处理
讯享网 // 获取后端返回文件名 response.headers.get('content-disposition') const content = res; const blob = new Blob([content]); const fileName = "疫苗接种情况明细.xls"; if ("download" in document.createElement("a")) { // 非IE下载 const elink = document.createElement("a"); elink.download = fileName; elink.style.display = "none"; elink.href = URL.createObjectURL(blob); document.body.appendChild(elink); elink.click(); URL.revokeObjectURL(elink.href); // 释放URL 对象 document.body.removeChild(elink); } else { // IE10+下载 navigator.msSaveBlob(blob, fileName); }
十六、element-ui上传组件坑
1、accept属性无效问题
传闻中input的这个accept属性是可以的,但是不知道为什么不生效
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr
2、上传组件修改了file-list的数据然后报错cannot rear ‘status’ if undefined
在每次对file-List做删除操作后都刷新下页面this.$forceUpdate()
十七、element-ui输入框限制只输入数字
https://blog.csdn.net/ymumi/article/details/?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2.pc_relevant_default&utm_relevant_index=4
十八、element-ui表单输入不更新问题
讯享网监听表单变化,然后validate一下
问题收录
一、vue的keep-alive对iframe页面不能缓存? 思路:创建一个组件,并且不销毁 只能缓存当前vnode节点上的内容 iframe不属于当前vnode节点 二、vue keep-alive缓存 缓存相同的路由,但传参不一样? https://blog.csdn.net/lllomh/article/details/ 三、element-ui的form组件 1、关于部分输入框 无法输入或选中 原因:没给初始值 2、校验不生效 可能是没给prop
十八、vue组件清除缓存
https://www.jianshu.com/p/8cedd68d30ad
十九、app切换至后台提示
利用h5plus的前台切换至后台事件https://www.html5plus.org/doc/zh_cn/events.html#plus.Events.%22pause%22
讯享网// #ifdef APP-PLUS // 监听设备网络状态变化事件 plus.globalEvent.addEventListener('pause', function(){
showAlert() }); // #endif function showAlert(){
plus.nativeUI.toast("温馨提示:海事一网通管已切换至后台"); }
二十、app端使用SQLITE实现离线缓存
参考https://blog.csdn.net/weixin_/article/details/?ops_request_misc=%257B%2522request%255Fid%2522%253A%086339%2522%252C%2522scm%2522%253A%3.…%2522%257D&request_id=39&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-.142
uni-app App 端内置 HTML5+ (opens new window)引擎,让 js 可以直接调用丰富的原生能力。
https://uniapp.dcloud.io/tutorial/use-html5plus.html
而H5+是支持SQLITE的,用法见https://www.html5plus.org/doc/zh_cn/sqlite.html
二十一、APP人脸识别 nvue
二十二、小程序适配刘海屏
二十三、导入文件流格式 -format
利用upLoad组件 action方法调用接口 需要白名单
二十四、eventBus的使用
讯享网//1、先在main.js上挂载 Vue.prototype.$bus = new Vue()//事件总线,主要用于非父子组件间的通信 //2、emit this.$bus.$emit('getAccdList',{
records:result.records,total:result.total}) //3、on this.$bus.$on('getGovLoading',(res) => {
this.loading = res }) //4、销毁 this.$bus.$off()
二十五、vue-redirect指令的使用
//1、先在main.js上挂载 Vue.prototype.$bus = new Vue()//事件总线,主要用于非父子组件间的通信 //2、emit this.$bus.$emit('getAccdList',{
records:result.records,total:result.total}) //3、on this.$bus.$on('getGovLoading',(res) => {
this.loading = res }) //4、销毁 this.$bus.$off()
二十六、nvm的使用
在git上下载nvm.setup 然后傻瓜操作
nvm use
讯享网切换node版本 乱码问题:切换至C:\Windows\system32 找到cmd.exe 用管理员身份打开。
二十六、低代码生成curd
1、增删改查配置页面 2、所需要的接口、所需要的的路由 有接口返回,在对应的文件中调用接口获取并返回 3、接口将所有配置页面的显示的字段全部返回为一个json,前端解析生成js文件 4、前端由路由去区分显示哪些内容
二十七、nginx配置
花生壳配置步骤:https://service.oray.com/question/15507.html
讯享网配合花生壳使用步骤: 1、端口配置,首先需要查看本地端口是否被占用: 1)查看被占用端口对应的PID,输入命令:netstat -ano | findstr 端口,回车,记录最后一位数字,即 pid 2)继续输入tasklist | findstr PID,回车,查看是哪个进程或者程序占用了端口 2、配置nginx.conf文件 3、先将nginx的相关进程kill掉,然后再双击执行nginx.exe 4、成功执行后,配置的端口server_name拼接能正确访问
nginx配置失效解决步骤:
1、先看本地127.0.0.1:端口,能否访问成功 2、看任务管理器中是否有nginx进程,双击打开之后还没有的话执行命令nginx.exe -t看什么问题 3、修改了nginx.conf重启nginx不生效的话,将nginx进程删掉然后多打开几次确保彻底清掉
讯享网nginx.conf修改
server{
listen 8090;
server_name xxx.com(localhost啥的也可以);
// 访问配置
location /admin {
root /user/admin.com
index index.html
try_files $url(找文件) $url/(找地址) /admin/index.html -- history配置 不然返回直接会跳转404
}
location /3683/ {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass https://192.168.16.212:3683/;
}
location /3688/ {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass https://192.168.16.212:3688/;
}
}
二十八、阻止用户退出浏览器全屏bug
全屏状态下,浏览器禁止监听F11和ESC事件
解决思路:
1、引入screenfull插件 import screenfull from ‘screenfull’
2、监听fullscreenchange事件
3、禁用F11、ESC事件
4、写一个全屏按钮让用户点击
document.addEventListener("fullscreenchange", function (e) {
data.isFullscreen = !data.isFullscreen if (document.fullscreenElement) {
data.isFullscreen = true } else {
if( data.isPassScreen == false ) {
data.fullScreenDialog.show = true screenfull.toggle() }else {
data.isFullscreen = false data.isPassScreen = false document.exitFullscreen() } } }) methods.screenFull() window.onkeydown = function (event) {
if (event.keyCode === 122 || event.keyCode === 27) {
event.preventDefault() } }
二十九、搭建vue3项目
1、vue create 项目名
2、手动添加vue.config.js文件,配置如下
https://cli.vuejs.org/zh/guide/webpack.html#%E5%AE%A1%E6%9F%A5%E9%A1%B9%E7%9B%AE%E7%9A%84-webpack-%E9%85%8D%E7%BD%AE
3、配置package.json
4、配置路由
5、配置pinia npm install pinia@next
性能优化
1、数据过多的长列表可以用这两个优化性能(不在可视区域的不渲染)
https://juejin.cn/post/
讯享网location /3683/ { proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass https://192.168.16.212:3683/; } location /3688/ { proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass https://192.168.16.212:3688/; }
}
# 二十八、阻止用户退出浏览器全屏bug 全屏状态下,浏览器禁止监听F11和ESC事件 解决思路: 1、引入screenfull插件 import screenfull from 'screenfull' 2、监听fullscreenchange事件 3、禁用F11、ESC事件 4、写一个全屏按钮让用户点击 ```js document.addEventListener("fullscreenchange", function (e) { data.isFullscreen = !data.isFullscreen if (document.fullscreenElement) { data.isFullscreen = true } else { if( data.isPassScreen == false ) { data.fullScreenDialog.show = true screenfull.toggle() }else { data.isFullscreen = false data.isPassScreen = false document.exitFullscreen() } } }) methods.screenFull() window.onkeydown = function (event) { if (event.keyCode === 122 || event.keyCode === 27) { event.preventDefault() } }
二十九、搭建vue3项目
1、vue create 项目名
2、手动添加vue.config.js文件,配置如下
https://cli.vuejs.org/zh/guide/webpack.html#%E5%AE%A1%E6%9F%A5%E9%A1%B9%E7%9B%AE%E7%9A%84-webpack-%E9%85%8D%E7%BD%AE
3、配置package.json
4、配置路由
5、配置pinia npm install pinia@next
性能优化
1、数据过多的长列表可以用这两个优化性能(不在可视区域的不渲染)
https://juejin.cn/post/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-woRv5xr2-93)(C:\Users\DuckZ\AppData\Roaming\Typora\typora-user-images\20.png)]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/127935.html