2020.10-2021.01前端開發部分總結

2020.10-2021.01前端開發部分總結

1.減少http請求(使用緩存優化性能)

storageData(){
   
   
      let arr = [
        {
   
   name:'黃',age:20},
        {
   
   name:'劉',age:30}
      ]
      arr.push(Date.now());
      window.sessionStorage.setItem('str',JSON.stringify(arr))
    },
//請求接口的方法
getStorageData(){
   
   	
	//注意此處一定是獲取時間,索引不固定
      let time = JSON.parse(window.sessionStorage.getItem('str'))[2];
      if((Date.now() - time) > 1000*20){
   
   
        alert('12')
//利用時間來判斷是否每次調用返回相同固定資源的接口
      }
    }

2.element.ui中的el-upload傳遞索引

index是外部v-for循環時的索引;
:on-success的回調函數原本有三個形參數(response,file, fileList),使用箭頭函數傳遞索引

<el-upload
    v-show='!item.flag'
    :action="action"
    accept="image/png,image/jpg,image/jpeg"
    :on-success='(response,file, fileList) => {imgChange_post(response,file, fileList, index)}'>
    <el-button type="primary">點擊上傳封面圖</el-button>
</el-upload>

3.element.ui中的loading組件加載圈位置

//比如要始終將文字固定在屏幕正中間
//重新設置一個div即可 給個id方便獲取下面的子類元素
<div id="createId" v-loading='loading_create' element-loading-text="創建中,請稍等"></div>

```css
#createId .el-loading-mask{
    position: fixed;
    width: 100%;
    height: 100%;
}

4.根據給定的數組給另一個對象數組進行排序

根據arr的順序來依次對應

const arr = [33,11,66,22,55];
let list = [{
   
   age: 55}, {
   
   age: 22}, {
   
   age: 11}, {
   
   age: 66}, {
   
   age: 33}];
list.sort((prev,next)=>{
   
   
    return arr.indexOf(prev.age) - arr.indexOf(next.age);
});
console.log(list); //[{age: 33}, {age: 11}, {age: 66}, {age: 22}, {age: 55}];

5.網頁title中插入給定的圖表等

在這裏插入圖片描述
比如改變前面的圖標,使用比特蟲見圖片轉字體圖標;然後再title緊隨其下加上即可

  <title>投資者關係</title>
  <link rel="shortcut icon" href="./images_/header/logo.ico"  type="image/x-icon"/> 

6.Object.assign()規範對象合併

/返回的是一個對象數組
const _list = res.list.map(item => {
   
   
  const str = item.name.replace(/(<\/?span.*?>)/gi, '|');
  return Object.assign({
   
   }, {
   
   
    time: item.time,
    content: str.split('|')
  })
})

7.小程序切換tab或者onshow時的回到頂部方法

在小程序onShow() 或者wx.switchTab()時調用returnTop方法,實現回到頂部

  // 一鍵回到頂部
  returnTop: function (e) {
   
   
    if (wx.pageScrollTo) {
   
   //判斷這個方法是否可用
      wx.pageScrollTo({
   
   
        scrollTop: 0
      })
    } else {
   
   
      wx.showModal({
   
   
        title: '提示',
        content: '當前微信版本過低,無法使用該功能,請升級到最新微信版本後重試。'
      })
    }
  },

8.分享一個連續解構賦值

對於對象連續調用屬性,如ev.currentTarget.dataset.id等,使用解構賦值 可以參考下一個點

//情況1
const {
   
    user_info: {
   
    xcx_user_id } } = app.globalData
//解構出e中的自定義屬性
//其中this.data.navigatorUr可以是properties中父組件傳遞過來的值
toDetail({
   
    currentTarget: {
   
    dataset: {
   
    id } } }) {
   
      //形參就是id
  wx.navigateTo({
   
   
    url: `${
     
     this.data.navigatorUrl}?id=${
     
     id}`
  })
}

9.小程序對比使用導航標籤和點擊事件跳轉

<view class="content-item small" bindtap="toStreamerRank" data-tab="2">
  <image src='/images/yonghu/home_phb_zhangfen.png' class="content-bg right"></image>
  <view class="content-lbl">漲粉榜</view>
</view>

<navigator class="content-item small" url="/pages/hotWords/hotWords" hover-class="navigator-hover">
  <image src='/images/zhubo/home_phb_yinlang.png'class="content-bg right"></image>
  <view class="content-lbl">抖音熱詞</view>
</navigator>
toStreamerRank({
   
    currentTarget: {
   
    dataset: {
   
    tab } } }) {
   
   
    app.globalData.currentTabForStreamer = tab;
    //導航不能跳轉到tabbar,switchTab可以
    wx.switchTab({
   
       
      url: `/pages/streamerRank/streamerRank`
    })
  },
}

10.獲取輸入框焦點索引,方便插入內容

ele 輸入框節點;
this.ruleForm.input 輸入框的值

let ele = document.querySelector('#groupNameRef');
let i =- 1;  
if(ele.selectionStart){
   
    //非IE瀏覽器
    i = ele.selectionStart;
}
let target = ev.target.nodeName==='A'?ev.target:ev.target.parentNode;
let index = target.dataset.index;
if(this.ruleForm.input.indexOf(index) === -1){
   
     //輸入框只能出現一次
    if(i === -1){
   
      //從頭部插入
        this.ruleForm.input = `<${
     
     index}>` + this.ruleForm.input;
    }else{
   
   
        this.ruleForm.input = this.ruleForm.input.slice(0,i) + `<${
     
     index}>` + this.ruleForm.input.slice(i);
    }
}

11.驗證輸入框字符(含中文處理)中文算2個字符

subTitle:[{
   
    required: true, message: '請輸入副標題', trigger: 'change' },
    {
   
   
        validator: (rule, value, callback) => {
   
   
            let nameLength = 0;
            for(let i = 0;i<value.length;i++){
   
   
                if(escape(value[i]).indexOf("%u")<0){
   
   //不是中文
                    nameLength += 1;
                }else{
   
     //中文
                    nameLength += 2;
                }
            }
            if (nameLength < 4) {
   
   
                callback(new Error('請至少輸入4個字符'))
            } else if (nameLength > 20){
   
   
                callback(new Error('請最多輸入20個字符'))
            }
        },
        trigger: 'change'
}],

12.看一段獲取手機驗證碼

bind(this):定時器中的this不是小程序對象,所以要改變this指向,原理很簡單

// 獲取驗證碼  也是調用了接口 參數:手機號和標記號
//https://xcx.duolalive.com/apixcx/wx_login.php 
//phone:177****6332;send_code: 1
  sendCode: function () {
   
   
    // 60秒後重新獲取驗證碼
    this.login(true);
    inter = setInterval(function () {
   
   
      this.setData({
   
   
        smsFlag: true,
        sendColor: '#cccccc',
        sendTime: this.data.snsMsgWait + 's後重發',
        snsMsgWait: this.data.snsMsgWait - 1
      });
      if (this.data.snsMsgWait < 0) {
   
   
      	if(inter){
   
   
      		clearInterval(inter)  //每次清理一下
      	}
        this.setData({
   
   
          sendTime: '獲取驗證碼',
          snsMsgWait: 60,
          smsFlag: false
        });
      }
    }.bind(this), 1000);     //注意定時器中的this
  },

13.element.ui上傳圖片視頻大小尺寸校驗

圖片尺寸
beforeUpload:返回false則終止上傳

beforeUpload(file) {
   
   
    const isJpg = /image\/(png|jpe?g|gif)$/.test(file.type);
    const isLt1M = file.size / 1024 / 1024 < 1;
    if (!isJpg) {
   
   
        this.$message.error('上傳圖片只能是 JPG/PNG 格式!');
    }
    if (!isLt1M) {
   
   
        this.$message.error('上傳圖片大小不能超過 1MB!');
    }
    const isSize = new Promise(function(resolve, reject){
   
   
        let width = 108;
        let height = 108;
        let _URL = window.URL || window.webkitURL;
        let img = new Image();
        img.onload = function(){
   
   
            let valid = img.width == width && img.height == height;
            valid ? resolve() : reject();
        }
        img.src = _URL.createObjectURL(file);
    }).then(()=>{
   
   
        return file;
    }, ()=>{
   
   
    this.$message.error('上傳圖片的尺寸建議爲108*108!');
        return Promise.reject()
    });
    return isJpg && isLt1M && isSize;
},

視頻尺寸

const self = this
const isLt100MB  = file.size / 1024 / 1024 < 100;
const isSize = new Promise(function(resolve, reject) {
   
   
    let _URL = window.URL || window.webkitURL;
    let videoElement = document.createElement('video')
    videoElement.addEventListener("loadedmetadata", function (_event) {
   
   
        let width = videoElement.videoWidth;
        let height = videoElement.videoHeight;
        let duration = videoElement.duration; // 視頻時長
        if(!isLt100MB) self.$message.error('上傳視頻大小不能超過100MB!');
        if(Math.ceil(duration) <= 4) self.$message.error('上傳視頻時長不能少於4S!');
        let valid = width/height === 9/16 && width >= 720 && height >= 1280;
        valid ? resolve() : reject();
    });
    videoElement.src = _URL.createObjectURL(file)
}).then(() => {
   
   
    return file;
},() => {
   
   
    self.$message.error('上傳視頻尺寸寬高比爲9:16,分辨率大於720*1280');
    return Promise.reject()
});
return isSize;

14.async/await結合數組循環

async getPostImageId(arr){
   
   
    await arr.forEach(async item=>{
   
   
        let params = {
   
   
            backAcctId:this.backAcctId,
            videoId:item.id,
            source:this.source || ''
        };
        const {
   
   data:res} = await axios.post(
        	//接口名
            '/adminjson/ERP_GetSuggestVideo',
            //參數
            params
        );
        if(res.body.status === 'SUCCESS'){
   
   
            //處理成功的方法
        }
    })
},

15.Object.defineProperty()用法(vue框架雙向數據綁定核心之一)

let user = {
   
   
    name:'張三'
}
Object.defineProperty(user,'age',{
   
   
    value:20,
    writable:true,  //可修改
    enumerable:true,  //可枚舉
    configurable:true  //可重新定義特性,包括value,writable,enumerable,configurable等
})
Object.defineProperty(user,'age',{
   
   
    value:20,
    writable:true,  //可修改
    configurable:false
})
user.age = 30
console.log(Object.keys(user));
console.log(user);

let height = 170;
//get和set方法不可與value同時使用,get和set方法即是vue框架的數據綁定的核心
Object.defineProperty(user,'height',{
   
   
    // value:190,    報錯
    get:function(){
   
   
        console.log('get方法被調用');
        return height;
    },
    set:function(newVal){
   
   
        console.log('set方法被調用');
        height = newVal;
    }
})
console.log(user.height);  //調用了get方法
user.height = 180;  //調用了set方法
console.log(user.height);

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章