• 22年6月工作笔记整理(前端)



    6月份是一边做需求一边优化,业务也不是很繁忙,上线也轻松,总的来说还是不错。就是自己没心思学习和提升自己,反思一下,学如逆水行舟,不进则退。

    一、样式问题

    1.三角形的原理
    主要是通过border来控制的,当遇到要修改三角形颜色时,应该修改的是border的颜色。

    //画一个正三角形的css代码
    height:0px;  
    width:0px;  
    border-left:20px solid transparent;  
    border-right:20px solid transparent ;  
    border-bottom:20px solid #9E9E9E ;  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.max-width会覆盖width,就算加important也没用,min-优先级大于max-
    3.margin垂直居中的办法

    postion:absolute;
    top:0;bottom:0;left:0;
    width:200px;height:100px;margin:auto;
    
    • 1
    • 2
    • 3

    二、一些小tips

    1.对日期的处理,可以使用Day.js工具
    官网学习:https://dayjs.fenxianglu.cn/
    先安装:npm install dayjs --save
    使用:
    var dayjs = require(‘dayjs’)
    dayjs().各种方法

    2.关于封装组件的技巧
    $attrs 简化多层组件之间props传值;
    $listeners 简化多层组件之间事件传递;
    $Slots 更多拓展自定义组件传值,包括自定义html元素,及对象;
    props validator 增强组件传值稳健性,可自定义业务代码效验参数;
    $refs 对外提供API 增强组件灵活度和可控性;

    3.图片链接为http显示不出来,在index.html里加上

    <meta name="referrer" content="no-referrer">
    
    • 1

    4.利用注释来定义代码折叠的范围
    //#region
    //#endregion
    5.用setTimeout实现setTnterval

    newIntervel(){
    setTimeout(()=>{
    //调用方法
    this.newIntervel()
    },5000)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    三、表格的高亮需求

    需求:创建完后高亮新建的一条数据
    思路:通过创建完之后,拿到那一列的唯一标识,发送给列表,列表拿到之后,就遍历找到那列,使用表格的方法对其进行高亮。

    //页面间的通信采用bus
    使用this.$bus.$emit('方法名',值) 发送
    使用this.$bus.$on('方法名',()=>{}) 接收
    高亮那一列的方法:this.$refs.ref名.setCurrentRow(row)
    
    • 1
    • 2
    • 3
    • 4

    四、需要实现弹窗可以拖拽

    网上有现成的,只要按照方法加进去就可以
    先在src下创建一个directive文件夹,再创建一个el-drag-dialog文件夹下,放index.js和drag.js

    //index.js
    import drag from './drag'
    
    const install = function (Vue) {
      Vue.directive('el-drag-dialog', drag)
    }
    
    if (window.Vue) {
      window['el-drag-dialog'] = drag
      Vue.use(install); // eslint-disable-line
    }
    
    drag.install = install
    export default drag
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    //drag.js
    export default {
      bind(el, binding, vnode) {
        const dialogHeaderEl = el.querySelector('.el-dialog__header')
        const dragDom = el.querySelector('.el-dialog')
        dialogHeaderEl.style.cssText += ';cursor:move;'
        dragDom.style.cssText += ';top:0px;'
    
        // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
        const getStyle = (function () {
          if (window.document.currentStyle) {
            return (dom, attr) => dom.currentStyle[attr]
          } else {
            return (dom, attr) => getComputedStyle(dom, false)[attr]
          }
        })()
    
        dialogHeaderEl.onmousedown = e => {
          // 鼠标按下,计算当前元素距离可视区的距离
          const disX = e.clientX - dialogHeaderEl.offsetLeft
          const disY = e.clientY - dialogHeaderEl.offsetTop
    
          const dragDomWidth = dragDom.offsetWidth
          const dragDomHeight = dragDom.offsetHeight
    
          const screenWidth = document.body.clientWidth
          const screenHeight = document.body.clientHeight
    
          const minDragDomLeft = dragDom.offsetLeft
          const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
    
          const minDragDomTop = dragDom.offsetTop
          const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
    
          // 获取到的值带px 正则匹配替换
          let styL = getStyle(dragDom, 'left')
          let styT = getStyle(dragDom, 'top')
    
          if (styL.includes('%')) {
            styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100)
            styT = +document.body.clientHeight * (+styT.replace(/%/g, '') / 100)
          } else {
            styL = +styL.replace(/\px/g, '')
            styT = +styT.replace(/\px/g, '')
          }
    
          document.onmousemove = function (e) {
            // 通过事件委托,计算移动的距离
            let left = e.clientX - disX
            let top = e.clientY - disY
    
            // 边界处理
            if (-left > minDragDomLeft) {
              left = -minDragDomLeft
            } else if (left > maxDragDomLeft) {
              left = maxDragDomLeft
            }
    
            if (-top > minDragDomTop) {
              top = -minDragDomTop
            } else if (top > maxDragDomTop) {
              top = maxDragDomTop
            }
    
            // 移动当前元素
            dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
    
            // emit onDrag event
            vnode.child.$emit('dragDialog')
          }
    
          document.onmouseup = function (e) {
            console.log('e = ', e)
            document.onmousemove = null
            document.onmouseup = null
          }
        }
      }
    }
    
    
    • 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
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    使用:
    <i -dialog v-drag > </i -dialog>

    五、cookie、localStorage和sessionStorage的区别

    1.cookie的内容主要包括:名字name,值value,过期时间expires,路径path和域domain。路径和域一起构成cookie的作用范围。一般cookie储存在内存里,若设置了过期时间则储存在硬盘里,浏览器页面关闭也不会失效,直到设置的过期时间后才失效。若不设置cookie的过期时间,则有效期为浏览器窗口的会话期间,关闭浏览器窗口就失效。

    // 创建一个名称为name,对应值为value的cookie,由于没有设置失效时间,默认失效时间为该网站关闭时
    Cookies.set(name, value)
    
    // 创建一个有效时间为7天的cookie
    Cookies.set(name, value, { expires: 7 })
    
    // 创建一个带有路径的cookie
    Cookies.set(name, value, { path: '' })
    
    // 创建一个value为对象的cookie
    const obj = { name: 'ryan' }
    Cookies.set('user', obj)
    
    // 获取指定名称的cookie
    Cookies.get(name) // value
    
    // 获取value为对象的cookie
    const obj = { name: 'ryan' }
    Cookies.set('user', obj)
    JSON.parse(Cookies.get('user'))
    
    // 获取所有cookie
    Cookies.get()
    // 删除指定名称的cookie
    Cookies.remove(name) // value
    
    // 删除带有路径的cookie
    Cookies.set(name, value, { path: '' })
    Cookies.remove(name, { path: '' })
    
    
    • 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
    • 29
    • 30

    2.localStorage的生命周期是永久,除非手动去清除,否则永远都存在,他的储存大小是5MB,仅在客户端浏览器上储存,不参与服务器的通信。

     //设置localStorage保存到本地,第一个为变量名,第二个是值
          localStorage.setItem('Author', 'Jane')
          // 获取数据
          localStorage.getItem('Author')
          // 删除保存的数据
          localStorage.removeItem('Author')
          // 清除所有保存的数据
          localStorage.clear()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.sessionStorage顾名思义,是在当前会话下有效,引入了一个“浏览器窗口的概念”,sessionStorage是在同源的同窗口中,始终存在的数据,只要浏览器不关闭,即使是刷新或者进入同源的另一个页面,数据仍在。同时打开“独立”的窗口,即使是同一个页面,sessionStorage的对象也是不同的。关闭窗口后sessionStorage就会被销毁。

    // 设置sessionStorage保存到本地,第一个为变量名,第二个是值
          sessionStorage.setItem('sessionName', 'John')
          // 获取数据
          sessionStorage.getItem('sessionName')
          // 删除保存的数据
          sessionStorage.removeItem('sessionName')
          // 清除所有保存的数据
          sessionStorage.clear()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    【微信小程序入门到精通】— 项目准备
    Maven学习笔记
    React学习笔记
    【Redis】Redis常见面试题总结
    5.2 Redis面试题
    训练神经网络跑了好几天,训练神经网络需要多久
    VLAN 通信过程与特性
    Android四大组件之- Service的创建与应用
    stm32cubemx hal学习记录:PWR 低功耗睡眠模式
    KT148A语音芯片的组合播放详细说明 包含语音制作 压缩 下载 播放
  • 原文地址:https://blog.csdn.net/qinsangdilvzhi/article/details/125527861