前端实用编码小技巧

851 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

恒定宽高比(css)

一般用于数据渲染之前的占位内容,实现宽高自适应,高度恒为宽度的70%,如果你想要一半一半,padding-top为50%即可。

    width:100% ;
    height:0;
    padding-top:70%;

效果如图

image.png

补齐指定位数

格式化时间的时候一般会用到,使用ES6的padStart和padEnd。

padStart(targetLength,string):头部补全

padEnd(targetLength,string):尾部补全

不足会补0

    '12'.padStart(4, '11')  //1112
    '12'.padEnd(4, '11')  //1211

    '12'.padStart(4, '1')  //0112
    '12'.padEnd(4, '1')  //1210

转数字、转整数、转时间戳

你可能经常用+来将字符串转数字,它还可以转时间戳,这次不用new Date().getTime()

转数字

    //+运算符
    let num = +'10.7'  //10.7
    let num2= +'-10' //-10
    
    //*运算符 
    let num = '10' * 1    //10
    let num2 = '10.7' * 1 //10.7

转整数

    // ~~   ~是按位取反
    let num = ~~'10.7' // 10 
    let num2 = ~~'-10' //-10

转时间戳

    +new Date()      // 1634006099827

清空数组

有些情况下不使用arr=[]。原因是如下 arr=[]创建一个新的数组,并将对它的引用分配了给用到的变量。其他引用不受影响,但仍指向原始数组,有内存泄漏的风险,而arr.length=0修改了原数组,其他变量访问到的成了修改后的。

   let arr=[1,2,4]
   let arr1=arr
   
   //arr=[]情况
   arr=[]
   console.log(arr) //[]
   console.log(arr1) //[1,2,4] 
   //arr.length=0
   console.log(arr) //[]
   console.log(arr1) //[] 

去除数组中的无效值

有时候因为一些异常,导致收集数据的数组内容不正确,此时就需要对数组的值进行处理。

//使用filter
let arr = [1, 2, 3, undefined,null, '', ];
arr = arr.filter(item=>item);
console.log(arr)  [1,2,3]

求幂运算符

使用来自于ES7的**

    Math.pow(2, 3) //8
    2 ** 3  //8

Vue中data数据的二次初始化

有时候我们需要再完成一些操作后对data中的数据重新初始化。

//初始化data中的所有数据
Object.assign(this.$data, this.$options.data());

//初始化data中的指定数据,比如form
Object.assign(this.$data, this.$options.data().form);

刷新当前页面(Vue为例)

最近遇到一个问题,静态路由维护的js(asyncRouter.js)中有一个菜单需要根据用户的code值是否显示,在登陆成功后我把它存在了session中,并在静态js中去访问,但是这个静态js一开始就加载了,导致无法获取登陆后的,于是需要成功之后再刷新一下页面。

    //asyncRouter.js
    import {getSession} from '@/utils/storage'
    let code=getSession('vuex')&&getSession('vuex').user.code
    const asyncRoutes = [
        {
        path: '/system',
        component: Layout,
        showRoot: true,
        show:code=='xxxx',
        redirect: '/system/log',
        meta: {
          title: '系统管理',
          icon: 'setting',
          roles: ['admin', 'basic']
        }
    ]

解决办法这里推荐两种,第一种会有明显的闪烁,第二种效果好一点,

Vue自带路由

    //在需要刷新的地方添加以下代码
    this.$router.go(0)

provide/inject

 // App.vue根组件中使用provide提供一个reload方法
<template>
    <div id="app">
    	<router-view v-if="isActive"></router-view>
    </div>
</template>
<script>
    export default {
        name: 'App',
        provide () {                                                 
            return {
                reload: this.reload                                              
            }
        },
        data() {
            return{
                isActive: true                   
            }
        },
        methods: {
            reload () {
                this.isActive = false;       
                this.$nextTick(()=> {
                    this.isActive = true;       
                }) 
            }
        },
    }
</script>

  
   //需要刷新页面的组件使用inject注入
   export default {
    inject:['reload'],                    
    data () {
        return {
        }
    },
    //在需要刷新的地方调用
    this.reload()

短路运算

非常实用的运算符,起到保护的作用,经常用来防止页面报错。

逻辑与(&&):如果左边为true,返回右边;如果左边false,返回左边。

逻辑或(||):如果左边为true,返回左边;如果左边false,返回右边。

&&和||的逻辑是转换成布尔值判断成立与否

// 逻辑与
let a = 1 && 6;
console.log(a); //输出6
let a = 0 && 6;
console.log(a); //输出0

//逻辑或
let a = 0 || 6; //输出6
let a = 1 || 6; //输出1

一些特殊情况 &&左边是null/undefined/NaN ,结果就是null/undefined/NaN,同理||两边同时都是这几个特殊值时,返回结果同上。

本文持续更新中。。。