2019年度前端知識點總結

来源:https://www.cnblogs.com/eightFlying/archive/2020/01/31/2019note.html
-Advertisement-
Play Games

本文旨在整理和記錄 2019年度 從事前端工作的過程中遇到的問題以及解決問題的思路。內容偏新手且敘述不深,整理的目的是為了方便以後快速查閱之前遇到過的問題。 ...


本文旨在整理和記錄 2019年度 從事前端工作的過程中遇到的問題以及解決問題的思路。內容偏新手且敘述不深,整理的目的是為了方便以後快速查閱之前遇到過的問題。

Vue或者React框架使用過程中的筆記

改變父組件標簽上屬性綁定值的方式

  • 方式一 普遍做法,通過在標簽上綁定一個事件,在子組件上調用$emit觸發該事件進而改變屬性值
  • 方式二 藉助.sync修飾符 這種方式無需再綁定事件
    • 父組件 :msg.sync = "msg"
    • 子組件 this.$emit('update:msg', '傳遞的值')
    • 不能接受表達式和字面量對象

v-model 幾個實用的修飾符

  • lazy 將雙向綁定的input事件變成change事件
  • trim 自動過濾首位空白字元
  • number 將輸入值轉為數值類型

插槽用法

  • <slot>後備內容</slot>
  • 具名插槽 用 v-slot:default 綁定,必須用在 <template> 上,如果只有default則可以用在其他標簽上
  • 作用域插槽(讓插槽內部訪問子組件數據)
    子組件:<slot :user="user"></slot>
    父組件:<template v-slot:default="slotProps"/> 通過 slotProps.user 獲取,
    也可以使用 ES6 解構語法 {user} / {user: 別名}
    

動態的綁定標簽特性

<a v-bind:[dataAttr]="url"></a>
...
data: {
    dataAttr: 'href'
}
問題描述解決方法
本地圖片無法正常顯示 使用 require('本地圖片路徑')
打包後的html頁面顯示空白 找到文件 config/index.js 修改 build 配置下的 assetsPublicPath 為相對路徑 './'
清除瀏覽器預設樣式 在項目引入 reset.css
vue中綁定鍵盤事件 @keydown.enter 註意綁到按鈕上無效
改變狀態值頁面無響應,頁面需下一幀才能得到變化 setTimeout(()=>{...}, 0) vue中還可以使用 this.$nextTick(()=>{...})
路由使用history模式無效 這種模式需要在服務端有響應的配置 用hash模式可在前端使用路由

ES6常用語法

Promise的基本用法

var p = new Promise((resolve, reject) => {
    //new 後立即執行的操作
    resolve() //非同步執行成功後要進行的操作,在then中進行
    reject()//非同步執行失敗後要進行的操作,在catch中進行
})
p.then().catch().finally()
Promise.all([p1, p2, p3]).then().catch() //全部拿到結果後再執行
Promise.race([p1, p2, p3]).then().catch() //有一個拿到結果就執行

export 與 export default

語法格式簡單描述
Array.includes() 檢測數組中是否包含指定項,返回布爾值
()=>{} 箭頭函數,註意它沒有自己的作用域
`xxx${var}` 模版字元串
new Set(array) ==> 使用[...array] 數組快速去重
Array.from(new Set(array)) 將Set變成普通數組
Object.keys().length 判斷對象是否為空

js技巧

對象拷貝

  • 深拷貝
    • JSON.parse(JSON.stringify(obj)) 對象包含可序列化值並且沒有迴圈引用時有效
  • 淺拷貝
    • {...obj}
    • Object.assign({}, obj) 拷貝的僅為對象的指針

對URI編碼和解碼

  • encodeURI()、decodeURI()
  • encodeURIComponent()、decodeURIComponent() 可對特殊字元如#,/,¥等起作用
  • 註意當使用瀏覽器地址傳參數時(如路由跳轉時),如果參數中有中文,需要使用 encodeURIComponent() 編碼,因為瀏覽器url會自動解碼一次所以需要編碼兩次才能生效:encodeURIComponent(encodeURIComponent(url))

toFixed 出現無限迴圈小數

  • Math.floor(xx * 100) / 100
  • xx.toString().match(/^\d+(?:\.\d{0, 2})?/)[0]

CSS技巧

flex流佈局

選擇器優先順序

文本內容超出容器顯示省略號

  • 單行文本
    #content{
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
    }
    
  • 多行文本(背景顏色設為transparent)
    #content{
        position: relative;
        overflow: hidden;
    }
    #content::after{
        content: '...';
        position: absolute;
        bottom: 0;
        right: 0;
    }
    

消除img標簽中的圖片為空時的邊框

img[src=""], img:not([src]){
    opacity: 0;
}

製作一個表頭固定 表體滾動的表格(需設置高、寬)

  • thead, tr 設置 display: table; table-layout: fixed;
  • tbody 設置 display: block; overflow-y: scroll;

子元素設置浮動後父元素設置 height: auto 無效

.parent::after{
    content: "";
    display: table;
    clear: both;
}

BFC(塊格式化上下文)

  • 參考這篇文章 什麼是BFC?看這一篇就夠了
  • 上面這個例子(子元素設置浮動後父元素設置 height: auto 無效)就是創造了BFC
  • 如何創建BFC
    • float的值不是none
    • position的值不是static或者relative
    • display的值是inline-block、table-cell、flex、table-caption或者inline-flex
    • overflow的值不是visible

設置圖片寬高為相對百分比的情況下讓寬高相等

.parent{
    position: relative;
    height: 0;
    padding-bottom: 100%;
}
.child{
    width: 100%;
    height: 100%;
    position: absolute;
}

設置圖片的填充方式和位置

  • object-fit: fill/cover.contain/scale-down 參考
  • object-position: 值或者方向詞 參考

在less/scss中使用calc()無效

//less中加上~轉譯符號
height: calc(~"100vh-200px")
//scss中使用插值#{}
height: calc(100% - #{$var})
樣式格式簡單描述
text-decoration: line-through 定義穿過文本的一條線
text-align-last: justify 讓文字兩端對齊
resize: none 禁止textarea拉伸
font-size: 0 讓 input 的 cursor: pointer 樣式生效
touch-action: none 禁用瀏覽器觸摸交互
pointer-events: none 讓元素永遠不能成為滑鼠事件的target

常用庫問題集錦

ElementUI

問題描述解決方法
圖標無法正常顯示 在 build/utils.js 文件中的 ExtractTextPlugin 插件中加入 publicPath: '../../'

AntDesign

問題描述解決方法
日期選擇框中的年月日是英文 import {ConfigProvider} from 'antd' => import 'moment/locale/zh-cn => import zhCN from 'antd/es/locale/zh_CN' => <ConfigProvider locale={zhCN}>...</ConfigProvider>
Table組件中含有表單控制項時無法正常使用狀態state Table的column屬性不要定義在狀態中,直接用const接收

Echarts

問題描述解決方法
使用內置的百度地圖不顯示 需要引入 import 'echarts/extension/bmap/bmap'

Axios

  • 利用 qs 庫序列化請求參數
qs.stringify({ids: [1, 2, 3]}, { indices: false })
 //形式: ids=1&ids=2&id=3
qs.stringify({ids: [1, 2, 3]}, {arrayFormat: 'indices'})
 //形式: ids[0]=1&aids1]=2&ids[2]=3
qs.stringify({ids: [1, 2, 3]}, {arrayFormat: 'brackets'})
 //形式:ids[]=1&ids[]=2&ids[]=3
qs.stringify({ids: [1, 2, 3]}, {arrayFormat: 'repeat'}) 
//形式: ids=1&ids=2&id=3
  • 參考封裝:
import axios from 'axios'
import qs from 'qs'
import {message} from 'antd'

axios.defaults.baseURL = 'http://XXX/'

axios.defaults.withCredentials = true //設置為true 可以讓請求帶上cookie中的值,用於獲取登錄狀態的SESSION

axios.interceptors.request.use(function (config) {
    // 判斷請求的類型
    // 如果是post請求就把預設參數拼到data裡面
    // 如果是get請求就拼到params裡面
    if (config.method === 'post' || config.method === 'put') {
        let data = qs.parse(config.data)
        config.params = {
            ...config.params
        }
        config.data = qs.stringify({
            ...data
        }, {
            arrayFormat: 'brackets'
        })
    }
    return config
}, function (error) {
    return Promise.reject(error)
})

axios.interceptors.response.use((res) => {
    //對響應數據做些事
    // if (res.config.method === 'get') {
    //     return res
    // }
    if (res.data.code === '0000') {
        // if (res.config.method === 'post') {
            return res.data.data
        // }
    } else if (res.data.statusCode === 304) {
        window.location.href = '/#/login'
    } else {
        return Promise.reject(res.data.message)
    }
}, (error) => {
    return Promise.reject('請求異常')
})

function request(params){
    return new Promise((resolve, reject) => {
        axios({
            url: params.url || '',
            method: params.method || 'post',
            params: params.params || {},
            data: params.data || {},
            headers: {
                'Content-Type': params.contentType || 'application/x-www-form-urlencoded'
            },
            paramsSerializer: function (param) {
                return qs.stringify(param, {
                    arrayFormat: 'repeat'
                })
            },
        }).then(res => {
            resolve(res)
        }).catch(err => {
            console.log(err)
            message.error(err || '出問題')
            reject(err)
        })
    })
}

export default request

操作DOM

  • DOM.getBoundingClientRect().bottom 獲取DOM元素相對於可視頁面底部的距離
  • 註意:元素的 offsetTop、offsetLeft 的值是根據css定位來的,預設是相對 body,出現 relative 會改變這種行為,利用 offsetParent 可查看父元素
  • DOMid.scrollTop = DOMid.scrollHeight 可以讓元素滾動到最底部
  • 一個高度自適應內容且高度有最大值的的textarea
<textarea rows="1" className="input-msg" value={currentContent} type="text" onChange={(e) => setCurrentContent(e.target.value)} onInput={autoTextAreaHeight} onBlur={handleBlur}></textarea>

const autoTextAreaHeight = (e) => {
    if (e.target.scrollHeight <= 90) {
        e.target.style.height = 'auto'
        e.target.style.height = e.target.scrollHeight + "px"
    }
}
const handleBlur = () => {
    //解決IOS失焦事件先於click事件導致click事件無效
    setTimeout(() => {
        window.scroll(0, 0)
    }, 0)
}
//css
// resize: none;

web端與移動端的相容性

問題描述解決方法
IOS/Safari XXXX-XX-XX 日期無效 不支持這種 - 的格式,利用正則替換日期字元串 replace(/\-/g, "/")
火狐瀏覽器在文件域中無法發起ajax請求請求json文件 首先在瀏覽器地址欄中輸入 about:config 然後找到 security.fileuri.strict_origin_policy 置為 false
IOS/Safari 使用 transform 時,z-index 無效 需要在祖先元素上加上 overflow: hidden;
瀏覽器預設字體不一樣導致空格顯示的長度不一樣 設置樣式 font-family: Times New Roman
IE 報錯 Promise 未定義 安裝 babel-polyfill 然後在 main.js 中引入
手機上H5的網路圖片不顯示 403 Forbidden 在入口頁面加上<meta name="referrer" content="no-referrer" />

其他

  • localStorage 只能存儲字元串,存儲數組對象需要用JSON轉換
  • momentJS 配置成中文 moment.locale('zh-cn', xxx) xxx是中文配置
  • ['a']=='a' 為true
  • typeof([]) = 'object'
  • 跳過ESlint檢測
/*eslint-disable*/
...
/*eslint-enable*/

結束語

暫時就這麼點了,有什麼遺漏的以後再補充。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • " 返回《C 併發編程》" "1. 線程池的由來" "1.1. 線程池出現前" "1.2. 線程池的誕生" "1.3. CLR線程池工作過程" "2. 線程池解決的問題" "2.1. 非同步調用方法" "2.2. 按時間間隔調用方法" "3. 當單個內核對象接收到信號通知時調用方法" "3.1. 註冊 ...
  • EF對數據做什麼樣的操作,是根據EF的上下文實體狀態決定,實體狀態有以下5種狀態,下麵我們就分別看下這5種狀態 數據準備,我們看到學生表裡有20000名學生記錄,最後1位學生的學生編號為0000020000 1、Detached--實體跟上下文壓根沒關係 我們看到我新創建了名學生,學號為000002 ...
  • 很多時候,我們在IDE中編寫Flink代碼,我們希望能夠查看到Web UI,從而來瞭解Flink程式的運行情況。按照以下步驟操作即可,親測有效。1、添加Maven依賴<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink- ...
  • 先上代碼:public class WordCountKeyedState { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvi ...
  • 在Flink中的每個函數和運算符都是有狀態的。在處理過程中可以用狀態來存儲數據,這樣可以利用狀態來構建複雜操作。為了讓狀態容錯,Flink需要設置checkpoint狀態。Flink程式是通過checkpoint來保證容錯,通過checkpoint機制,Flink可恢復作業的狀態和計算位置。chec ...
  • 本篇我們將使用Java語言來實現Flink的單詞統計。代碼開發環境準備導入Flink 1.9 pom依賴<dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId ...
  • Error:No such property: GradleVersion for class: JetGradlePlugin 錯誤原因:IDE 版本(GradlePlugin)和 Gradle 版本不匹配導致這個錯誤。 GradlePlugin 版本和 AndroidStudio 版本一致,與 ...
  • position: static; 靜態定位 / 常規定位 / 自然定位 忽略top/right/bottom/left/z-index的影響,使元素回到自然流中 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <titl ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...