前端開(kāi)發(fā)小技巧

前端開(kāi)發(fā)小技巧(Vue、JS、CSS)

常用開(kāi)發(fā)小技巧

寫在前面

JavaScript 篇

1.格式化金錢

const ThousandNum = num => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");

const money = ThousandNum(20190214);

// money => "20,190,214"

2.取整

代替正數(shù)的 Math.floor()忿墅,代替負(fù)數(shù)的 Math.ceil()

const num1 = ~~ 1.69;

const num2 = 1.69 | 0;

const num3 = 1.69 >> 0;

// num1 num2 num3 => 1 1 1

3.轉(zhuǎn)數(shù)值

只對(duì) null 右遭、"" 吮蛹、false 轿偎、數(shù)值字符串 有效

const num1 = +null;

const num2 = +"";

const num3 = +false;

const num4 = +"169";

// num1 num2 num3 num4 => 0 0 0 169

4.精確小數(shù)

const RoundNum = (num, decimal) => Math.round(num * 10 ** decimal) / 10 ** decimal;

const num = RoundNum(1.69, 1);

// num => 1.7

5.取最小最大值

const arr = [0, 1, 2];

const min = Math.min(...arr);

const max = Math.max(...arr);

// min max => 0 2

6.判斷數(shù)據(jù)類型

function DataType(tgt, type) {

? ? const dataType = Object.prototype.toString.call(tgt).replace(/\[object (\w+)\]/, "$1").toLowerCase();

? ? return type ? dataType === type : dataType;

}

DataType("young"); // "string"

DataType(20190214); // "number"

DataType(true); // "boolean"

DataType([], "array"); // true

DataType({}, "array"); // false

7.是否為空對(duì)象

const obj = {};

const flag = DataType(obj, "object") && !Object.keys(obj).length;

// flag => true

8.克隆數(shù)組

const _arr = [0, 1, 2];

const arr = [..._arr];

// arr => [0, 1, 2]

9.合并數(shù)組

const arr1 = [0, 1, 2];

const arr2 = [3, 4, 5];

const arr = [...arr1, ...arr2];

// arr => [0, 1, 2, 3, 4, 5];

10.去重?cái)?shù)組

const arr = [...new Set([0, 1, 1, null, null])];

// arr => [0, 1, null]

11.截?cái)鄶?shù)組

const arr = [0, 1, 2];

arr.length = 2;

// arr => [0, 1]

12.交換賦值

let a = 0;

let b = 1;

[a, b] = [b, a];

// a b => 1 0

13.創(chuàng)建指定長(zhǎng)度且值相等的數(shù)組

const arr = new Array(3).fill(0);

// arr => [0, 0, 0]

14.克隆對(duì)象

const _obj = { a: 0, b: 1, c: 2 }; // 以下方法任選一種

const obj = { ..._obj };

const obj = JSON.parse(JSON.stringify(_obj));

// obj => { a: 0, b: 1, c: 2 }

15.合并對(duì)象

const obj1 = { a: 0, b: 1, c: 2 };

const obj2 = { c: 3, d: 4, e: 5 };

const obj = { ...obj1, ...obj2 };

// obj => { a: 0, b: 1, c: 3, d: 4, e: 5 }

16.創(chuàng)建純空對(duì)象

const obj = Object.create(null);

Object.prototype.a = 0;

// obj => {}

17.優(yōu)雅處理 Async/Await 參數(shù)

function AsyncTo(promise) {

? ? return promise.then(data => [null, data]).catch(err => [err]);

}

const [err, res] = await AsyncTo(Func());

Vue 篇

1.路由懶加載

import Vue from 'vue'

import Router from 'vue-router'

Vue.use(Router)

const router = new Router({

? routes: [

? ? {

? ? ? path: '/',

? ? ? component: () => import("xxx")

? ? }

]

})

2.頁(yè)面需要導(dǎo)入多個(gè)組件

原來(lái)的寫法

import titleCom from '@/components/home/titleCom'

import bannerCom from '@/components/home/bannerCom'

import cellCom from '@/components/home/cellCom'

components:{titleCom,bannerCom,cellCom}

利用 require.context 可以寫成

const path = require('path')

const files = require.context('@/components/home', false, /\.vue$/)

const modules = {}

files.keys().forEach(key => {

? const name = path.basename(key, '.vue')

? modules[name] = files(key).default || files(key)

})

components:modules

API 說(shuō)明

實(shí)際上是 webpack 的方法,vue 工程一般基于 webpack,所以可以使用

require.context(directory,useSubdirectories,regExp) >

接收三個(gè)參數(shù):

directory:說(shuō)明需要檢索的目錄

useSubdirectories:是否檢索子目錄

regExp: 匹配文件的正則表達(dá)式,一般是文件名

3.動(dòng)態(tài)組件

做一個(gè) tab 切換時(shí)就會(huì)涉及到組件動(dòng)態(tài)加載

<component v-bind:is="currentTabComponent"></component>

但是這樣每次組件都會(huì)重新加載,會(huì)消耗大量性能,所以 <keep-alive> 就起到了作用

<keep-alive>

? <component v-bind:is="currentTabComponent"></component>

</keep-alive>

這樣切換效果沒(méi)有動(dòng)畫效果,這個(gè)也不用著急,可以利用內(nèi)置的 <transition>

<transition>

<keep-alive>

? <component v-bind:is="currentTabComponent"></component>

</keep-alive>

</transition>

4.mixins

有些組件有些重復(fù)的 js 邏輯,如校驗(yàn)手機(jī)驗(yàn)證碼,解析時(shí)間等,mixins 就可以實(shí)現(xiàn)這種混入

const mixin={

? ? created(){

? ? ? this.dealTime()

? ? },

? ? methods:{

? ? ? dealTime(){

? ? ? ? console.log('這是mixin的dealTime里面的方法');

? ? ? }

? }

}

export default{

? mixins:[mixin]

}

5.為路徑設(shè)置別名

在開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要引入各種文件,如圖片责语、CSS炮障、JS 等,為了避免寫很長(zhǎng)的相對(duì)路徑(../)坤候,我們可以為不同的目錄配置一個(gè)別名

// vue-cli 2.x 配置

// 在 webpack.base.config.js中的 resolve 配置項(xiàng)胁赢,在其 alias 中增加別名

resolve: {

? ? extensions: ['.js', '.vue', '.json'],

? ? alias: {

? ? ? 'vue$': 'vue/dist/vue.esm.js',

? ? ? '@': resolve('src'),

? ? }

? },

// vue-cli 3.x 配置

// 在根目錄下創(chuàng)建vue.config.js

var path = require('path')

function resolve (dir) {

? console.log(__dirname)

? return path.join(__dirname, dir)

}

module.exports = {

? chainWebpack: config => {

? ? config.resolve.alias

? ? ? .set(key, value) // key,value自行定義,比如.set('@@', resolve('src/components'))

? }

}

6.img 加載失敗

有些時(shí)候后臺(tái)返回圖片地址不一定能打開(kāi),所以這個(gè)時(shí)候應(yīng)該加一張默認(rèn)圖片

// page 代碼

<img :src="imgUrl" @error="handleError" alt="">

<script>

export default{

? data(){

? ? return{

? ? ? imgUrl:''

? ? }

? },

? methods:{

? ? handleError(e){

? ? ? e.target.src=reqiure('圖片路徑')

? ? }

? }

}

</script>

7.頁(yè)面統(tǒng)一判斷

在開(kāi)發(fā)中經(jīng)常會(huì)遇到權(quán)限判斷的問(wèn)題白筹,我們又不可能在每一個(gè)頁(yè)面的生命周期中去判斷一下智末,那樣太消耗時(shí)間了,處理方式:

router.beforeEach((to, from, next) => {

? myAccess.checkhaveAccess(to.path) === true ? next() : next('/forbid')

})

8.路由的項(xiàng)目啟動(dòng)頁(yè)和 404 頁(yè)面

404 頁(yè)面指的是: 當(dāng)進(jìn)入一個(gè)沒(méi)有 聲明/沒(méi)有匹配 的路由頁(yè)面時(shí)就會(huì)跳轉(zhuǎn)到 404 頁(yè)面

export default new Router({

? routes: [

? ? {

? ? ? path: '/', // 項(xiàng)目啟動(dòng)頁(yè)

? ? ? redirect:'/login'? // 重定向到下方聲明的路由

? ? },

? ? {

? ? ? path: '*', // 404 頁(yè)面

? ? ? component: () => import('./notfind')

? ? },

? ]

})

CSS 篇

1.使用 text-align-last 對(duì)齊兩端文本

在線演示

<div class="bruce flex-ct-x">

? ? <ul class="justify-text">

? ? ? ? <li>賬號(hào)</li>

? ? ? ? <li>密碼</li>

? ? ? ? <li>電子郵件</li>

? ? ? ? <li>通訊地址</li>

? ? </ul>

</div>

.justify-text {

? ? li {

? ? ? ? margin-top: 5px;

? ? ? ? padding: 0 20px;

? ? ? ? width: 100px;

? ? ? ? height: 40px;

? ? ? ? background-color: #f66;

? ? ? ? line-height: 40px;

? ? ? ? text-align-last: justify;

? ? ? ? color: #fff;

? ? ? ? &:first-child {

? ? ? ? ? ? margin-top: 0;

? ? ? ? }

? ? }

}

2.使用 color 改變邊框顏色

border 沒(méi)有定義 border-color 時(shí)徒河,設(shè)置 color 后系馆,border-color 會(huì)被定義成 color

場(chǎng)景:邊框顏色與文字顏色相同

.elem {

? border: 1px solid;

? color: #f66;

}

3.黑白圖像

讓你的彩色照片顯示黑白照片

img.desaturate {

? ? filter: grayscale(100%);

? ? -webkit-filter: grayscale(100%);

? ? -moz-filter: grayscale(100%);

? ? -ms-filter: grayscale(100%);

? ? -o-filter: grayscale(100%);

}

4.將圖片作為背景

當(dāng)給頁(yè)面添加圖片時(shí),尤其需要圖片是響應(yīng)式的時(shí)候顽照,最好使用 background 屬性來(lái)引入圖片由蘑,而不是 <img> 標(biāo)簽

這看起來(lái)使用圖片會(huì)更復(fù)雜,但實(shí)際上它會(huì)使設(shè)置圖片的樣式變得更加容易代兵。有了 background-size, background-position 和其它的屬性尼酿,保持或改變圖片原始尺寸和寬高比會(huì)更方便

background 引入圖片的一個(gè)缺點(diǎn)是頁(yè)面的 Web 可訪問(wèn)性會(huì)受到輕微的影響,因?yàn)槠聊婚喿x器和搜索引擎無(wú)法正確地獲取到圖像植影。這個(gè)問(wèn)題可以通過(guò) CSS object-fit 屬性解決裳擎,到目前為止除了 IE 瀏覽器其他的瀏覽器都可以使用 object-fit。

<section>

? ? <p>Img element</p>

? ? <img src="https://tutorialzine.com/media/2016/08/bicycle.jpg" alt="bicycle">

</section>

<section>

? ? <p>Div with background image</p>

? ? <div></div>

</section>

img {

? ? width: 300px;

? ? height: 200px;

}

div {

? ? width: 300px;

? ? height: 200px;

? ? background: url('https://tutorialzine.com/media/2016/08/bicycle.jpg');

? ? background-position: center center;

? ? background-size: cover;

}

section{

? ? float: left;

? ? margin: 15px;

}

5.保持選擇器的低權(quán)重

css 的選擇器并不都是平等的思币。當(dāng)初學(xué)習(xí) CSS 時(shí)鹿响,我總是認(rèn)為選擇器會(huì)覆蓋它上面的所有內(nèi)容。然而谷饿,情況并非如此

<a href='#' id='blue-btn' class="active">按鈕</a>

a{

? ? color: #fff;

? ? padding: 15px;

}

a#blue-btn {

? ? background-color: blue;

}

a.active {

? ? background-color: red;

}

我們希望.active類中設(shè)置的樣式會(huì)生效使按鈕變?yōu)榧t色惶我。但是它并不會(huì)起作用,因?yàn)榘粹o在上面有一個(gè)ID選擇器博投,它同樣設(shè)置了background-color指孤,ID選擇器具有更高的權(quán)重,所以按鈕的顏色是藍(lán)色的

權(quán)重也會(huì)疊加贬堵,于是a#button.active的權(quán)重要比a#button的高。一開(kāi)始就使用高權(quán)重的選擇器會(huì)導(dǎo)致你在后面的維護(hù)中不斷的使用更高權(quán)重的選擇器

6.使用rem進(jìn)行全局大小調(diào)整结洼;使用em進(jìn)行局部大小調(diào)整

在設(shè)置根目錄的基本字體大小后黎做,例如html字體大小:15px松忍;蒸殿,可以將包含元素的字體大小設(shè)置為rem

article {? ?

? ? font-size: 1.25rem;?

}? ?

aside {? ?

? ? font-size: .9rem;?

}

將文本元素的字體大小設(shè)置為em

h2 {? ?

? ? font-size: 2em;?

}? ?

p {? ?

? ? font-size: 1em;?

}

參考鏈接

靈活運(yùn)用 JS 開(kāi)發(fā)技巧

靈活運(yùn)用 CSS 開(kāi)發(fā)技巧

我在 vue 開(kāi)發(fā)中的小技巧

如何提升你的CSS技能,掌握這20個(gè)css技巧即可[完整版]

web進(jìn)階知識(shí)

相關(guān)推薦

vue: 防止按鈕重復(fù)點(diǎn)擊

閱讀 966

兩年經(jīng)驗(yàn)面試阿里前端開(kāi)發(fā)崗,已拿offer宏所,這些知識(shí)點(diǎn)該放出來(lái)了

閱讀 5309

CSS外邊距塌陷問(wèn)題

閱讀 95

ajax 工作原理

閱讀 43

給公司面試了100多個(gè)前端酥艳,心態(tài)差點(diǎn)給爺整崩了

閱讀 3409

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市爬骤,隨后出現(xiàn)的幾起案子充石,更是在濱河造成了極大的恐慌,老刑警劉巖霞玄,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骤铃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡坷剧,警方通過(guò)查閱死者的電腦和手機(jī)惰爬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惫企,“玉大人撕瞧,你說(shuō)我怎么就攤上這事∧” “怎么了丛版?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沪么。 經(jīng)常有香客問(wèn)我硼婿,道長(zhǎng),這世上最難降的妖魔是什么禽车? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任寇漫,我火速辦了婚禮,結(jié)果婚禮上殉摔,老公的妹妹穿的比我還像新娘州胳。我一直安慰自己,他們只是感情好逸月,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布栓撞。 她就那樣靜靜地躺著,像睡著了一般碗硬。 火紅的嫁衣襯著肌膚如雪瓤湘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天恩尾,我揣著相機(jī)與錄音弛说,去河邊找鬼。 笑死翰意,一個(gè)胖子當(dāng)著我的面吹牛木人,可吹牛的內(nèi)容都是我干的信柿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼醒第,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渔嚷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起稠曼,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤形病,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蒲列,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窒朋,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蝗岖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侥猩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抵赢,死狀恐怖欺劳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铅鲤,我是刑警寧澤划提,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站邢享,受9級(jí)特大地震影響鹏往,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骇塘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一伊履、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧款违,春花似錦唐瀑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至赠尾,卻和暖如春力穗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背气嫁。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工当窗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杉编。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓超全,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親邓馒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘶朱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 2018web前端最新面試題總結(jié) 一、Html/Css基礎(chǔ)模塊 基礎(chǔ)部分 什么是HTML光酣?答:? HTML并不是...
    duans_閱讀 4,665評(píng)論 3 27
  • 常用開(kāi)發(fā)小技巧 寫在前面 JavaScript 篇 1.格式化金錢 2.取整 代替正數(shù)的 Math.floor()...
    alanwhy閱讀 4,000評(píng)論 1 75
  • 一、企業(yè)項(xiàng)目開(kāi)發(fā)流程 產(chǎn)品提需求 交互設(shè)計(jì)出原型設(shè)計(jì) 視覺(jué)設(shè)計(jì)出UI設(shè)計(jì)圖 前端開(kāi)發(fā)出頁(yè)面模板 server端存取...
    Eric_V閱讀 1,738評(píng)論 0 3
  • 前端開(kāi)發(fā)規(guī)范 規(guī)范目的 命名規(guī)范 結(jié)構(gòu)化規(guī)范 注釋規(guī)范 編碼規(guī)范 CSS 規(guī)范 規(guī)范目的 為提高團(tuán)隊(duì)協(xié)作效率 便于...
    妹妹十六閱讀 170評(píng)論 0 0
  • jquery介紹 jQuery是目前使用最廣泛的javascript函數(shù)庫(kù) 據(jù)統(tǒng)計(jì)唱遭,全世界排名前100萬(wàn)的網(wǎng)站戳寸,有...
    就是這么帥_567e閱讀 1,090評(píng)論 0 0