前端項(xiàng)目常用方法總結(jié)

1. 下載一個(gè)excel文檔

同時(shí)適用于word,ppt等瀏覽器不會(huì)默認(rèn)執(zhí)行預(yù)覽的文檔,也可以用于下載后端接口返回的流數(shù)據(jù)消返,見(jiàn)3

//下載一個(gè)鏈接 
function download(link, name) {
    if(!name){
            name=link.slice(link.lastIndexOf('/') + 1)
    }
    let eleLink = document.createElement('a')
    eleLink.download = name
    eleLink.style.display = 'none'
    eleLink.href = link
    document.body.appendChild(eleLink)
    eleLink.click()
    document.body.removeChild(eleLink)
}
//下載excel
download('http://111.229.14.189/file/1.xlsx')
復(fù)制代碼

2. 在瀏覽器中自定義下載一些內(nèi)容

場(chǎng)景:我想下載一些DOM內(nèi)容粒督,我想下載一個(gè)JSON文件

/**
 * 瀏覽器下載靜態(tài)文件
 * @param {String} name 文件名
 * @param {String} content 文件內(nèi)容
 */
function downloadFile(name, content) {
    if (typeof name == 'undefined') {
        throw new Error('The first parameter name is a must')
    }
    if (typeof content == 'undefined') {
        throw new Error('The second parameter content is a must')
    }
    if (!(content instanceof Blob)) {
        content = new Blob([content])
    }
    const link = URL.createObjectURL(content)
    download(link, name)
}
//下載一個(gè)鏈接
function download(link, name) {
    if (!name) {//如果沒(méi)有提供名字决瞳,從給的Link中截取最后一坨
        name =  link.slice(link.lastIndexOf('/') + 1)
    }
    let eleLink = document.createElement('a')
    eleLink.download = name
    eleLink.style.display = 'none'
    eleLink.href = link
    document.body.appendChild(eleLink)
    eleLink.click()
    document.body.removeChild(eleLink)
}
復(fù)制代碼

使用方式:

downloadFile('1.txt','lalalallalalla')
downloadFile('1.json',JSON.stringify({name:'hahahha'}))
復(fù)制代碼

3. 下載后端返回的流

數(shù)據(jù)是后端以接口的形式返回的,調(diào)用1中的download方法進(jìn)行下載

 download('http://111.229.14.189/gk-api/util/download?file=1.jpg')
 download('http://111.229.14.189/gk-api/util/download?file=1.mp4')

復(fù)制代碼

4. 提供一個(gè)圖片鏈接搂誉,點(diǎn)擊下載

圖片芦拿、pdf等文件支示,瀏覽器會(huì)默認(rèn)執(zhí)行預(yù)覽广辰,不能調(diào)用download方法進(jìn)行下載暇矫,需要先把圖片、pdf等文件轉(zhuǎn)成blob择吊,再調(diào)用download方法進(jìn)行下載李根,轉(zhuǎn)換的方式是使用axios請(qǐng)求對(duì)應(yīng)的鏈接


//可以用來(lái)下載瀏覽器會(huì)默認(rèn)預(yù)覽的文件類型,例如mp4,jpg等
import axios from 'axios'
//提供一個(gè)link几睛,完成文件下載房轿,link可以是  http://xxx.com/xxx.xls
function downloadByLink(link,fileName){
    axios.request({
        url: link,
        responseType: 'blob' //關(guān)鍵代碼,讓axios把響應(yīng)改成blob
    }).then(res => {
    const link=URL.createObjectURL(res.data)
        download(link, fileName)
    })

}
復(fù)制代碼

注意:會(huì)有同源策略的限制,需要配置轉(zhuǎn)發(fā)

6 防抖

在一定時(shí)間間隔內(nèi)冀续,多次調(diào)用一個(gè)方法琼讽,只會(huì)執(zhí)行一次.

這個(gè)方法的實(shí)現(xiàn)是從Lodash庫(kù)中copy的

/**
 *
 * @param {*} func 要進(jìn)行debouce的函數(shù)
 * @param {*} wait 等待時(shí)間,默認(rèn)500ms
 * @param {*} immediate 是否立即執(zhí)行
 */
export function debounce(func, wait=500, immediate=false) {
    var timeout
    return function() {
        var context = this
        var args = arguments

        if (timeout) clearTimeout(timeout)
        if (immediate) {
            // 如果已經(jīng)執(zhí)行過(guò),不再執(zhí)行
            var callNow = !timeout
            timeout = setTimeout(function() {
                timeout = null
            }, wait)
            if (callNow) func.apply(context, args)
        } else {
            timeout = setTimeout(function() {
                func.apply(context, args)
            }, wait)
        }
    }
}
復(fù)制代碼

使用方式:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <input id="input" />
        <script>
            function onInput() {
                console.log('1111')
            }
            const debounceOnInput = debounce(onInput)
            document
                .getElementById('input')
                .addEventListener('input', debounceOnInput) //在Input中輸入洪唐,多次調(diào)用只會(huì)在調(diào)用結(jié)束之后钻蹬,等待500ms觸發(fā)一次   
        </script>
    </body>
</html>

復(fù)制代碼

如果第三個(gè)參數(shù)immediate傳true,則會(huì)立即執(zhí)行一次調(diào)用凭需,后續(xù)的調(diào)用不會(huì)在執(zhí)行问欠,可以自己在代碼中試一下

7 節(jié)流

多次調(diào)用方法,按照一定的時(shí)間間隔執(zhí)行

這個(gè)方法的實(shí)現(xiàn)也是從Lodash庫(kù)中copy的

/**
 * 節(jié)流粒蜈,多次觸發(fā)顺献,間隔時(shí)間段執(zhí)行
 * @param {Function} func
 * @param {Int} wait
 * @param {Object} options
 */
export function throttle(func, wait=500, options) {
    //container.onmousemove = throttle(getUserAction, 1000);
    var timeout, context, args
    var previous = 0
    if (!options) options = {leading:false,trailing:true}

    var later = function() {
        previous = options.leading === false ? 0 : new Date().getTime()
        timeout = null
        func.apply(context, args)
        if (!timeout) context = args = null
    }

    var throttled = function() {
        var now = new Date().getTime()
        if (!previous && options.leading === false) previous = now
        var remaining = wait - (now - previous)
        context = this
        args = arguments
        if (remaining <= 0 || remaining > wait) {
            if (timeout) {
                clearTimeout(timeout)
                timeout = null
            }
            previous = now
            func.apply(context, args)
            if (!timeout) context = args = null
        } else if (!timeout && options.trailing !== false) {
            timeout = setTimeout(later, remaining)
        }
    }
    return throttled
}
復(fù)制代碼

第三個(gè)參數(shù)還有點(diǎn)復(fù)雜,options

  • leading枯怖,函數(shù)在每個(gè)等待時(shí)延的開(kāi)始被調(diào)用注整,默認(rèn)值為false
  • trailing,函數(shù)在每個(gè)等待時(shí)延的結(jié)束被調(diào)用度硝,默認(rèn)值是true

可以根據(jù)不同的值來(lái)設(shè)置不同的效果:

  • leading-false肿轨,trailing-true:默認(rèn)情況,即在延時(shí)結(jié)束后才會(huì)調(diào)用函數(shù)
  • leading-true蕊程,trailing-true:在延時(shí)開(kāi)始時(shí)就調(diào)用椒袍,延時(shí)結(jié)束后也會(huì)調(diào)用
  • leading-true, trailing-false:只在延時(shí)開(kāi)始時(shí)調(diào)用

例子:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <input id="input" />
        <script>
            function onInput() {
                console.log('1111')
            }
            const throttleOnInput = throttle(onInput)
            document
                .getElementById('input')
                .addEventListener('input', throttleOnInput) //在Input中輸入,每隔500ms執(zhí)行一次代碼
        </script> 
    </body>
</html>

復(fù)制代碼

8. cleanObject

去除對(duì)象中value為空(null,undefined,'')的屬性,舉個(gè)栗子:

let res=cleanObject({
    name:'',
    pageSize:10,
    page:1
})
console.log("res", res) //輸入{page:1,pageSize:10}   name為空字符串藻茂,屬性刪掉
復(fù)制代碼

使用場(chǎng)景是:后端列表查詢接口驹暑,某個(gè)字段前端不傳,后端就不根據(jù)那個(gè)字段篩選辨赐,例如name不傳的話优俘,就只根據(jù)pagepageSize篩選,但是前端查詢參數(shù)的時(shí)候(vue或者react)中掀序,往往會(huì)這樣定義


export default{
    data(){
        return {
            query:{
                name:'',
                pageSize:10,
                page:1
            }
        }
    }
}

const [query,setQuery]=useState({name:'',page:1,pageSize:10})
復(fù)制代碼

給后端發(fā)送數(shù)據(jù)的時(shí)候兼吓,要判斷某個(gè)屬性是不是空字符串,然后給后端拼參數(shù)森枪,這塊邏輯抽離出來(lái)就是cleanObject视搏,代碼實(shí)現(xiàn)如下

export const isFalsy = (value) => (value === 0 ? false : !value);

export const isVoid = (value) =>
  value === undefined || value === null || value === "";

export const cleanObject = (object) => {
  // Object.assign({}, object)
  if (!object) {
    return {};
  }
  const result = { ...object };
  Object.keys(result).forEach((key) => {
    const value = result[key];
    if (isVoid(value)) {
      delete result[key];
    }
  });
  return result;
};

復(fù)制代碼
let res=cleanObject({
    name:'',
    pageSize:10,
    page:1
})
console.log("res", res) //輸入{page:1,pageSize:10}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市县袱,隨后出現(xiàn)的幾起案子浑娜,更是在濱河造成了極大的恐慌,老刑警劉巖式散,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筋遭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)漓滔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)编饺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人响驴,你說(shuō)我怎么就攤上這事透且。” “怎么了豁鲤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵秽誊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我琳骡,道長(zhǎng)锅论,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任楣号,我火速辦了婚禮最易,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炫狱。我一直安慰自己藻懒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布毕荐。 她就那樣靜靜地躺著束析,像睡著了一般艳馒。 火紅的嫁衣襯著肌膚如雪憎亚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天弄慰,我揣著相機(jī)與錄音第美,去河邊找鬼。 笑死陆爽,一個(gè)胖子當(dāng)著我的面吹牛什往,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慌闭,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼别威,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了驴剔?” 一聲冷哼從身側(cè)響起省古,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丧失,沒(méi)想到半個(gè)月后豺妓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年琳拭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了训堆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡白嘁,死狀恐怖坑鱼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情权薯,我是刑警寧澤姑躲,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站盟蚣,受9級(jí)特大地震影響黍析,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屎开,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一埋虹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赏表,春花似錦叫搁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至档泽,卻和暖如春俊戳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馆匿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工抑胎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渐北。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓阿逃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赃蛛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恃锉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容