零碎知识8

66 阅读1分钟

请求获取二进制图片文件后的展示/下载/二维码解析

// api
export function inviteDownload(data) {
  return request({
    url: 'invite/download',
    method: 'get',
    responseType: 'blob',
    data
  })
}
--------------------
    getUrl() {
      return new Promise((resolve, reject) => {
        inviteDownload({
          codeUrl: this.imgUrl,
        })
          .then((data) => {
            const blob = new Blob([data], {
              type: 'image/png',
            })
            //tempUrl可以放在img标签里展示
            this.tempUrl = window.URL.createObjectURL(blob)
            resolve(true)
          })
          .catch(() => {
            reject(false)
          })
      })
    },
    async download() {
      this.tempUrl = ''
      let flag = await this.getUrl()
      if (flag) {
        let dom = document.createElement('a')
        dom.href = this.tempUrl
        dom.download = 'invite' + this.id
        dom.style.display = 'none'
        document.body.appendChild(dom)
        dom.click()
        // dom.parentNode.removeChild(dom)
        dom.remove()
        window.URL.revokeObjectURL(this.tempUrl)
        this.$message({
          type: 'success',
          message: '下载成功',
        })
      }
    },
    async copyLink() {
      this.tempUrl = ''
      let flag = await this.getUrl()
      if (flag) {
        var qr = new QrCode()
        qr.decodeFromImage(this.tempUrl).then((res) => {
          var cInput = document.createElement('input')
          cInput.value = res.data
          document.body.appendChild(cInput)
          cInput.select() // 选取文本框内容
          document.execCommand('copy')
          this.$message({
            type: 'success',
            message: '复制成功',
          })
          // 复制成功后再将构造的标签 移除
          document.body.removeChild(cInput)
          window.URL.revokeObjectURL(this.tempUrl)
        })
      }
    },
  },

canvas

  • ctx.beginPath() 清空子路径列表开始一个新路径
  • ctx.closePath() 从当前点到起始点绘制一条直线 来封闭图形//注意它的意义

input输入时禁止前面是空格

  • 注: 若input有 @change="inputFinal",则若按下按钮提交时,先发生change事件 再发生 click事件
--以vue3为例
<el-input :model-value="input"
           @input="inputEnv"
           placeholder="Please input" />
              
import { ref } from 'vue'
const input = ref('')
function inputEnv(e) {
  // 使input的字符串不能以空开头
  input.value = e.replace(/^\s+/, '')
}

//--点击提交按钮时,再删除字符串尾部空格
function confirm(){
 //input没值时发送不加该参数
  input.value && (sendParams.text= input.value.trim())
 //接口完成后再统一复原参数初值
}

if替代

  • 对于只需要判断一次的
 this.checked && this.addToStore(); //推荐
 条件A && 条件B && 满足条件后要执行的语句
 
 替换下面这个
 if(this.checked){
   this.addToStore()
 }
  • 对于接力式判断
a>0?func1():a<-10?func2():''

替换下面这个
      if(a>0){
        func1()
      }else if(a<-10){
        func2()
      }

concat

  • 拼接数组时,数组/参数列表 无所谓 全都能合到一块
[1,2,35,4].concat([5])
(5[1, 2, 35, 4, 5]
[1,2,35,4].concat(5)
(5[1, 2, 35, 4, 5]
[1,2,35,4].concat(5,6,7)
(7[1, 2, 35, 4, 5, 6, 7]
[1,2,35,4].concat([5,6,7])
(7[1, 2, 35, 4, 5, 6, 7]
[1,2,35,4].concat([5,6,7],[8,9,10])
(10[1, 2, 35, 4, 5, 6, 7, 8, 9, 10]

判断类型

  • Object.prototype.toString.call(arr)得到的类型准确 但是个返回的字符串是 [object 类型],可封装个方法
function testType(target) {
  let str = Object.prototype.toString.call(target)
  return str.replace(/\[object (\w+)\]/, '$1') //注意$1是个字符串才能分组替换
}

testType([])
'Array'

testType(12)
'Number'

阴影和模糊

  • box-shadow: 10px 11px 20px 4px #000;

image.png

  • filter: drop-shadow(17px 11px 4px #000);
    image.png

  • backdrop-filter: blur(9px); //backdrop-filter: saturate(60%) blur(4px);//调整饱和度 image.png

  • background-image: radial-gradient(transparent 1px,#c29e9e 1px);//filter的基础上 以圆心透明渐变构筑网阵(白色时更和谐) image.png

filter 作用于元素本身,backdrop-filter 作用于元素遮盖住的部分