當前位置:首頁 » 網頁前端 » 前端vm怎麼使用
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

前端vm怎麼使用

發布時間: 2023-04-26 07:10:54

⑴ vm和vh最大隻能設置100

只能設置100。vm和vh是前端開發中的兩個動態單位,是相對於網頁視口的單位,1vm,1vh和百分比不同的是,vm和vh永遠都是以視口作為參考,vm和vh最大隻能設置100。

⑵ Web前端新手應該知道的CSS長度單位

今天小編要跟大家分享的文章是關於Web前端新手應該知道的CSS長度單位!眾所周知CSS技術我們雖然很熟悉,在使用的過程卻很容易被困住,這讓我們在新問題出現的時候變得很不利。隨著web繼續不斷地發展,對於新技術新解決方案的要求也會不斷增長。

因此,作為網頁設計師和前端開肆攔發人員,我們別無選擇,必須熟悉我們手上的工具,做到知己知彼,這樣才能百戰不殆。為了幫助大家更好的工作小編今天為大家分享一些css的長度單位,希望能夠對小夥伴們有所幫助。


1、rem


我們首先介紹下和我們熟悉的很相似的貨。em
被定義為相對於當前對象內文本的字體大小。炒個栗子,如果你給body小哥設置了font-size字體大小,那麼body小哥的任何子元素的1em就是等於body設置的font-size。





Test

⑶ 前端如何實現視覺設計稿

在這篇文章中將和大家探討一下關於前端在移動端開發如何去實現視覺設計稿。探討過後,在大家的實際工作中或許能幫助解決一些問題。

一般設計稿是 640px 或者 750px (現在最流行),但是 iPhone 5 不是 320px 寬嗎,iPhone 6 不是 375px 寬嗎?
這里需要理解一下基礎概念: 設備像素 (device pixel), CSS 像素 (css pixel)以及 設備像素比 (device pixel ratio)。

垂直手機屏幕下,使用 <meta name="viewport" content="width=device-width"/> ,iPhone 5 屏幕物理像素 640 像素,獨立像素還是 320 像素,因此, window.devicePixelRatio 等於 2。

比如 iPhone 5,6 使用的是 Retina 視網膜屏幕(2 倍屏),6 Plus 是 3 倍屏,使用 2px × 2px 的 device pixel 代表 1px × 1px 的 css pixel,所以設備像素數為 640 × 1136px (5), 750 × 1134 (6),而 CSS 邏輯像素數為 320 x 568px (5), 375 × 667 (6);5,6 的 window.devicePixelRatio=2,6 Plus 為 3。

H5 適配:rem 方案
rem:是 CSS3 新增的一個相對單位,相對於 html 標簽的 font-size 的大小為基礎的。而 font-size 的大小可以動態根據手機屏幕寬度document.documentElement.clientWidth 來設置,從而達到自適應屏幕的目的。

我這里找了一下 小米 , 網易 , 拉勾網 , 手淘 以及糯米,大同小異。

設計稿是 720px 的,即 5 英寸屏幕的安卓手機(720 x 1280px)。
對於頁面縮放和橫豎屏事件進行監聽,改變 html 根元素字體 clientWidth/720/100 。
如圖是這樣計算的 375/(720/100) = 52.0833

iPhone 6 : 375/7.5=50 , 則知道設計稿應該是基於 iPhone 6 來的,所以它的設計稿豎直放時的橫向解析度為 750px,為了計算方便,取一個 100px 的 font-size 為參照,那麼 body 元素的寬度就可以設置為 width: 7.5rem ,於是 html 的 font-size=deviceWidth / 7.5 。布局時,設計圖標注的尺寸除以 100 得到 css 中的尺寸。並且布局中的 font-size 也可用 rem 單位。

設置html根元素字體為 65.5% ,對應px單位則為 10.48px ,則列表裡時間信息字體設置為 1rem = 10.48px ,chrome在 -webkit-text-size-adjust: 100%; 情況下小於 12px 的一律顯示為 12px 。

拉勾網頁面列表部分是 px 為單位,字體是 rem ,底部bar是使用 百分百 來控制寬高間距。

之前網上討論的比較多的是

則 1em = 16px * 62.5% = 10px ,em 的初始值為 1em = 16px ,而為了方便計算, 換算一下 10 / 16 (16px 是 Chrome 瀏覽器默認字體大小)。缺點是進行任何元素設置,都有可能需要知道他父元素的大小,比較繁瑣低效。

(1)動態設置 viewport的scale

(2)動態計算 html 的 font-size

(3)布局的時候,各元素的 css 尺寸 = 設計稿標注尺寸/設計稿橫向解析度/10

設計稿是 750 的,所以 html 的 font-size 就是 75,如果某個元素是 150px的寬,換算成 rem 就是 150 / 75 = 2rem。

整個手淘設計師和前端開發的適配協作基本思路是:

手淘推出了一套移動端適配的方案—— Flexible 方案 。

總結來說:

設計稿是 750 的。

優點:簡單粗暴,所有 css 尺寸均為設計稿尺寸直接除 2,開發快速簡單;
缺點:可能出現一排放不下的情況,需要針對小屏幕如 5 及以下做單獨適配

vw 相對於視窗的寬度:視窗寬度是 100vw 。
如果視區寬度是 100vm, 則 1vm 是視區寬度的 1/100, 也就是 1%,類似於 width: 1%。
那 iPhone 6 來說, document.documentElement.clientWidth=375 , 則豆腐塊寬度為 375/100*30=112.5px

混合: rem px vw 百分百等單位混用

略,同上糯米WAP

這里假設設計稿 640px,則設置根元素 font-size 為 4.375vw,根據屏幕寬度自適應,在視窗寬度為 320px 的時候,正好是 14px (14 / 320 = 0.04375)。 達到頁面默認字體大小 14px 的目的(其他大小也 ok)。好了,現在頁面上所有以 rem 為單位的屬性值都會隨著屏幕的寬度變化而變化,達到自適應的目的。( 自適應不用 js 動態設置根元素大小 )

在移動端頁面開發中,視覺童鞋一般會用 750px(iPhone 6)來出設計稿,然後要求 FE 童鞋能夠做到頁面是自適應屏幕的,這種情況下就可以用 rem 或者 vm 等相對單位來做適配,愉快和視覺童鞋一起玩耍啦。

內容轉自: 大專欄

⑷ web前端開之網站搭建框架之vue詳解

網站搭建框架之vue

Vue是web前端快速搭建網站的框架之一。它與jQuery有所不同,是以數據驅動web界面(以操作數據改變頁面,而jQuery是以操作節點來改變頁面),同時,vue還實現了數據的雙向綁定,可及時響應用戶的輸入。最主要的是vue的寫法簡單,容易掌握,組件形式可以大大提高工作效率。

對於vue的使用可以分為兩種使用形式:1.引入vue.js文件,在js中將vue實例化;2.通過node安裝第三方包--vue,搭建腳手架,用腳手架將頁面分成幾個組件編寫,從而利用組件來搭建頁面。

引入vue.js的寫法

Vue分為V層(視圖層)和M層(數據層),一般都是由M層的數據來驅動V層的改變。而vue的常用指令數量不多且寫法簡單。常用的有v-html、v-text、v-show、v-if、v-else、v-for、v-bind:、v-model。v-html和v-text都是將數據寫進標簽內,但它們的不同之處在於v-text會將標簽當做文本內容寫入

,而v-html則會對標簽進行編譯,只顯示標簽內的內容。

至於v-show、v-if、v-else這三個指令都是通過布爾值的判斷來執行的,當布爾值為真時,設置了v-show、v-if指令的標簽會顯示出來,當布爾值為假時,標簽隱藏;而v-else與這兩個指令相反。除此之外,v-show和v-if、v-else之間也有差別,v-show是改變標簽的display屬性來使標簽顯示或隱藏;而v-if、v-else是通過添加或刪除節點,來顯示或隱藏標簽的。

V-for是vue的一種遍歷方法,這個方法極大的簡化了數組或對象的遍歷並顯示到頁面的步驟

而v-bind:是對html屬性或自定義屬性的數據驅動方式,格式為v-bind:href,可簡寫為:href。對於類(class)的操作是通過布爾值來判斷增加或者隱藏類,同時。類和樣式(style)所接受的數據類型為對象。

V-model指令的作用是將數據進行雙向綁定,僅限於輸入類型標簽。當用戶在頁面輸入時,數據層的數據會跟著改變。這是VM模式。由v驅動m。

除了這些普通的指令之外,還有事件指令v-on:,可簡寫為@+事件名,例如:@click,並將執行函數寫到vue的methods中

通過腳手架來寫項目的話,可用通過寫組件,再將組件引入(注冊)到另一個vue文件里拼接在一起,從而構建出一個頁面。

(組件書寫格式)

(組件整合)

(注冊路由)

路由是通過vue-router來實現的,在注冊路由的時候要將router實例化。不同的路由跳轉不同的頁面,這是搭建單頁面應用的優勢。

而父組件與子組件之間的通訊可以通過props將父組件的信息傳遞給子組件,改變子組件的內容,這樣子組件的復用就不會有障礙了,而子組件傳遞信息給父組件或者其他組件的通訊則需vuex。

通過引入vuex並實例化一個Vuex.Store作為一個公共平台,將數據進行傳輸。通過vue的computed方法接收數據,通過methods方法改變數據。而這個公用平台可以實現組件與組件之間的信息傳遞,從而實現組件之間的交互。

通過一個星期的實戰,深深的體會到了vue的優勢,在構建移動端這方面的效率很高。但在搭建的過程中,還是少不了與jQuery結合,畢竟每個工具都有其優點,擇其優而用是明智的選擇。

⑸ vue項目中常用到哦,不看看嗎

現在沒用過vue框架,都不好意思說自己是干前端呢,當然這句話並不是說干前端非得會vue,只是想說明他的火爆程度,現在連小程序都推出了mpvue,你確定你還不趕緊了解了解vue嗎,我這篇文章的內容都是些很基礎的vue知識,後續會補上

解析 : 

-  beforecreate :可以在這加個loading事件 

- created  :在這結束loading,還做一些初始化,實現函數自執行 

- mounted  : 在這發起後端請求,拿回數據,配合路由鉤子做一些事情 

- * beforeDestory * : 你確認刪除XX嗎? destoryed :當前組件已被刪除,清空相關內容

其中key為對象裡面的鍵,value為對象裡面的值,其本意就是動態改變原來已經固定的值值,就需要使用vue.set(『想要改變的對象』,』要渲染的鍵『,』要渲染的值『)

解析  

遍歷後{{parent.name}}的已經固定了,這時候點擊編輯按鈕,改變裡面的值,雖然後台數據已經發生了改變,但那時頁面渲染的效果並不會發生改變,這時候要想改變頁面上的值,就需要使用vue.set(『想要改變的對象』,』要渲染的鍵『,』要渲染的值『), 

在空的數組中不能使用push傳入數據,所以應當使用vm.$set給數組添加

    ** 使用v-bind動態給元素綁定

這樣可以在遍歷的時候給不同的元素動態綁定不同id

在下次dom更新循結束之後延遲回調,在修改數據之後立即使用這個方法,獲取更新後的dom

在vue中獲取當前點擊的元素對象,在點擊的方法里 傳 入$event,然後在methods方法裡面接受傳過來的值,具體如 下

這個指令保持在元素上直到關聯實例結束編譯 /,可隱藏為編譯的標簽直到實例准備完畢

computer也是一個對象,類似於methods,在裡面也可以定義很多方法。計算屬性的結果會被緩存,寫法如下:

前一兄弟元素必須有v-if 或v-else-if

前一兄弟必須有v-if或v-else-if

vue包含一組觀察數組的變異方法,所以它們也會出發視圖更新

由於javascript的限制,Vue不能檢測一下變動的數組

對於已經創建實例,vue不能動態添加根級別的響應式屬性,但是可以使用Vue.set( object, key, value )方法嵌套對象添加響應式屬性

props可以是數組或對象,用於接收來父組件的數據,或者使用對象作為替代

1.axios.post('url', {data} )

.axios發送跨域請求

  var headers ={

'headers':{

'Content-Type':' application/x-www-from-urlencoded'

  }

  }

axios.$http.post('url', {data},設置請求頭)

axios發送post請求時傳過去的數據格式不是formate格式。從而獲取不到後台傳過來的數據

解決辦法:在頁面中引入qs模塊

import qs from'qs';

axios.interceptors.request.use((config)=>){

config.date=qs.stringify(config.data);

returnconfig;

}

私有過濾器是將過濾器中的方法直接綁定到當前Vue實例上面,所以只能在當前託管區域中使用

全局過濾器相當於是將過濾器中的方法綁定到Vue構造函數的原型中,可以保證每一個Vue實例的託管區域都可以使用

vm在很多時候,頁面還未載入出來,不能使用vm,這時我們有兩種解決方法 

訪問在線試聽

如果項目數據過多的話,直接管理是非常不方便的,這時候就應該採用vuex,Vuex是一個專門為Vue.js應用程序開發的狀態管理模式,它採用集中式存儲管理應用所有的組件的狀態

mui中的區域滾動組件,有個默認阻止冒泡事件,這時候在vue中使用click事件就會無法觸發,具體做法是把click事件改為tap事件,只有區域滾動事件click事件才無法生效

vue中的get傳參

axios.get(url,{params:{'aa':hello,'bb':''}})

我把圖片的id都放入數組,讓然後傳給你,你再傳給我過濾後的圖片信息,然後你讓我通過自己創建的數組裡面的id來對你傳過來的圖片信息進行處理,可是我自己創建的數組會隨著不同按鈕而發生改變,

const arr1=[12,23,45,12,45];

const arr2=[12:'你好',23:'是嗎',45:'算了']

for(let i arr1){

vm.$set(arr2,i,arr2[arr2[i]]);

}     

這樣得到的arr2 =[12:'你好',23:'是嗎',45:'算了',12:'你好',45:'算了']

var a=[1,2,3,4,5,6,];

var b=a.filter((value,index)=>{

value:當前數組對應的值

index:當前值對應的索引

returnindex!=2;

})

在vue中

import Vue from 『vue』 //es6寫法 

import App from 『./App』

父子組件的通信:emit 

非父子組件之間的通信:event bus 

復雜情況:vuex

⑹ 整理涵蓋很全很廣的前端知識點

HTML、CSS相關

html5新特性、語義化

瀏覽器渲染機制、重繪、重排

網頁生成過程:

重排(也稱迴流): 當 DOM 的變化影響了元素的幾何信息( DOM 對象的位置和尺寸大小),瀏覽器需要重新計算元素的幾何屬性,將其安放在界面中的正確位置,這個過程叫做重排。 觸發:

重繪: 當一個元素的外觀發生改變,但沒有改變布局,重新把元素外觀繪制出來的過程,叫做重繪。 觸發:

重排優化建議:

transform 不重繪,不迴流 是因為 transform 屬於合成屬性,對合成屬性進行 transition/animate 動畫時,將會創建一個合成層。這使得動畫元素在一個獨立的層中進行渲染。當元素的內容沒有發生改變,就沒有必要進行重繪。瀏覽器會通過重新復合來創建動畫幀。

css盒子模型

所有 HTML 元素可以看作盒子,在CSS中, "box model" 這一術語是用來設計和布局時使用。 CSS 盒模型本質上是一個盒子,封裝周圍的 HTML 元素,它包括:邊距,邊框,填充,和實際內容。 盒模型允許我們在其它元素和周圍元素邊框之間的空間放置元素。

css樣式優先順序

!important>style>id>class

什麼是BFC?BFC的布局規則是什麼?如何創建BFC?BFC應用?

BFC 是 Block Formatting Context 的縮寫,即塊格式化上下文。 BFC 是CSS布局的一個概念,是一個環境,裡面的元素不會影響外面的元素。 布局規則:Box是CSS布局的對象和基本單位,頁面是由若干個Box組成的。元素的類型和display屬性,決定了這個Box的類型。不同類型的Box會參與不同的 Formatting Context 。 創建:浮動元素 display:inline-block position:absolute 應用: 1.分屬於不同的 BFC 時,可以防止 margin 重疊 2.清除內部浮動 3.自適應多欄布局

DOM、BOM對象

BOM(Browser Object Model) 是指瀏覽器對象模型,可以對瀏覽器窗口進行訪問和操作。使用 BOM,開發者可以移動窗口、改變狀態欄中的文本以及執行其他與頁面內容不直接相關的動作。 使 JavaScript 有能力與瀏覽器"對話"。 DOM (Document Object Model) 是指文檔對象模型,通過它,可以訪問 HTML 文檔的所有元素。 DOM 是 W3C (萬維網聯盟)的標准。 DOM 定義了訪問 HTML 和 XML 文檔的標准: "W3C 文檔對象模型(DOM)是中立於平台和語言的介面,它允許程序和腳本動態地訪問和更新文檔的內容、結構和樣式。" W3C DOM 標准被分為 3 個不同的部分:

什麼是 XML DOM ? XML DOM 定義了所有 XML 元素的對象和屬性,以及訪問它們的方法。 什麼是 HTML DOM? HTML DOM 定義了所有 HTML 元素的對象和屬性,以及訪問它們的方法。

JS相關

js數據類型、typeof、instanceof、類型轉換

閉包(高頻)

閉包是指有權訪問另一個函數作用域中的變數的函數 ——《JavaScript高級程序設計》

當函數可以記住並訪問所在的詞法作用域時,就產生了閉包,

即使函數是在當前詞法作用域之外執行 ——《你不知道的JavaScript》

原型、原型鏈(高頻)

原型: 對象中固有的 __proto__ 屬性,該屬性指向對象的 prototype 原型屬性。

原型鏈: 當我們訪問一個對象的屬性時,如果這個對象內部不存在這個屬性,那麼它就會去它的原型對象里找這個屬性,這個原型對象又會有自己的原型,於是就這樣一直找下去,也就是原型鏈的概念。原型鏈的盡頭一般來說都是 Object.prototype 所以這就是我們新建的對象為什麼能夠使用 toString() 等方法的原因。

特點: JavaScript 對象是通過引用來傳遞的,我們創建的每個新對象實體中並沒有一份屬於自己的原型副本。當我們修改原型時,與之相關的對象也會繼承這一改變。

this指向、new關鍵字

this 對象是是執行上下文中的一個屬性,它指向最後一次調用這個方法的對象,在全局函數中, this 等於 window ,而當函數被作為某個對象調用時,this等於那個對象。 在實際開發中, this 的指向可以通過四種調用模式來判斷。

new

作用域、作用域鏈、變數提升

繼承(含es6)、多種繼承方式

(1)第一種是以 原型鏈的方式來實現繼承 ,但是這種實現方式存在的缺點是,在包含有引用類型的數據時,會被所有的實例對象所共享,容易造成修改的混亂。還有就是在創建子類型的時候不能向超類型傳遞參數。

(2)第二種方式是使用 借用構造函數 的方式,這種方式是通過在子類型的函數中調用超類型的構造函數來實現的,這一種方法解決了不能向超類型傳遞參數的缺點,但是它存在的一個問題就是無法實現函數方法的復用,並且超類型原型定義的方法子類型也沒有辦法訪問到。

(3)第三種方式是 組合繼承 ,組合繼承是將原型鏈和借用構造函數組合起來使用的一種方式。通過借用構造函數的方式來實現類型的屬性的繼承,通過將子類型的原型設置為超類型的實例來實現方法的繼承。這種方式解決了上面的兩種模式單獨使用時的問題,但是由於我們是以超類型的實例來作為子類型的原型,所以調用了兩次超類的構造函數,造成了子類型的原型中多了很多不必要的屬性。

(4)第四種方式是 原型式繼承 ,原型式繼承的主要思路就是基於已有的對象來創建新的對象,實現的原理是,向函數中傳入一個對象,然後返回一個以這個對象為原型的對象。這種繼承的思路主要不是為了實現創造一種新的類型,只是對某個對象實現一種簡單繼承,ES5 中定義的 Object.create() 方法就是原型式繼承的實現。缺點與原型鏈方式相同。

(5)第五種方式是 寄生式繼承 ,寄生式繼承的思路是創建一個用於封裝繼承過程的函數,通過傳入一個對象,然後復制一個對象的副本,然後對象進行擴展,最後返回這個對象。這個擴展的過程就可以理解是一種繼承。這種繼承的優點就是對一個簡單對象實現繼承,如果這個對象不是我們的自定義類型時。缺點是沒有辦法實現函數的復用。

(6)第六種方式是 寄生式組合繼承 ,組合繼承的缺點就是使用超類型的實例做為子類型的原型,導致添加了不必要的原型屬性。寄生式組合繼承的方式是使用超類型的原型的副本來作為子類型的原型,這樣就避免了創建不必要的屬性。

EventLoop

JS 是單線程的,為了防止一個函數執行時間過長阻塞後面的代碼,所以會先將同步代碼壓入執行棧中,依次執行,將非同步代碼推入非同步隊列,非同步隊列又分為宏任務隊列和微任務隊列,因為宏任務隊列的執行時間較長,所以微任務隊列要優先於宏任務隊列。微任務隊列的代表就是, Promise.then , MutationObserver ,宏任務的話就是 setImmediate setTimeout setInterval

原生ajax

ajax 是一種非同步通信的方法,從服務端獲取數據,達到局部刷新頁面的效果。 過程:

事件冒泡、捕獲(委託)

event.stopPropagation() 或者 ie下的方法 event.cancelBubble = true; //阻止事件冒泡

ES6

Vue

簡述MVVM

MVVM 是 Model-View-ViewModel 縮寫,也就是把 MVC 中的 Controller 演變成 ViewModel。Model 層代表數據模型, View 代表UI組件, ViewModel 是 View 和 Model 層的橋梁,數據會綁定到 viewModel 層並自動將數據渲染到頁面中,視圖變化的時候會通知 viewModel 層更新數據。

談談對vue生命周期的理解?

每個 Vue 實例在創建時都會經過一系列的初始化過程, vue 的生命周期鉤子,就是說在達到某一階段或條件時去觸發的函數,目的就是為了完成一些動作或者事件

computed與watch

watch 屬性監聽 是一個對象,鍵是需要觀察的屬性,值是對應回調函數,主要用來監聽某些特定數據的變化,從而進行某些具體的業務邏輯操作,監聽屬性的變化,需要在數據變化時執行非同步或開銷較大的操作時使用

computed 計算屬性 屬性的結果會被緩存,當 computed 中的函數所依賴的屬性沒有發生改變的時候,那麼調用當前函數的時候結果會從緩存中讀取。除非依賴的響應式屬性變化時才會重新計算,主要當做屬性來使用 computed 中的函數必須用 return 返回最終的結果 computed 更高效,優先使用

使用場景 computed :當一個屬性受多個屬性影響的時候使用,例:購物車商品結算功能 watch :當一條數據影響多條數據的時候使用,例:搜索數據

v-for中key的作用

vue組件的通信方式

父子組件通信

父->子 props ,子->父 $on、$emit` 獲取父子組件實例 parent、 parent 、children Ref 獲取實例的方式調用組件的屬性或者方法 Provide、inject` 官方不推薦使用,但是寫組件庫時很常用

兄弟組件通信

Event Bus 實現跨組件通信 Vue.prototype.$bus = new Vue() Vuex

跨級組件通信

$attrs、$listeners Provide、inject

常用指令

雙向綁定實現原理

當一個 Vue 實例創建時,Vue會遍歷data選項的屬性,用 Object.defineProperty 將它們轉為 getter/setter並且在內部追蹤相關依賴,在屬性被訪問和修改時通知變化。每個組件實例都有相應的 watcher 程序實例,它會在組件渲染的過程中把屬性記錄為依賴,之後當依賴項的 setter 被調用時,會通知 watcher重新計算,從而致使它關聯的組件得以更新。

v-model的實現以及它的實現原理嗎?

nextTick的實現

vnode的理解,compiler和patch的過程

new Vue後整個的流程

思考:為什麼先注入再提供呢??

答:1、首先來自祖輩的數據要和當前實例的data,等判重,相結合,所以注入數據的initInjections一定要在 InitState 的上面。2. 從上面注入進來的東西在當前組件中轉了一下又提供給後代了,所以注入數據也一定要在上面。

vm.[Math Processing Error]mount(vm.mount(vm.options.el) :掛載實例。

keep-alive的實現

作用:實現組件緩存

鉤子函數:

原理: Vue.js 內部將 DOM 節點抽象成了一個個的 VNode 節點, keep-alive 組件的緩存也是基於 VNode 節點的而不是直接存儲 DOM 結構。它將滿足條件 (pruneCache與pruneCache) 的組件在 cache 對象中緩存起來,在需要重新渲染的時候再將 vnode 節點從 cache 對象中取出並渲染。

配置屬性:

include 字元串或正則表達式。只有名稱匹配的組件會被緩存

exclude 字元串或正則表達式。任何名稱匹配的組件都不會被緩存

max 數字、最多可以緩存多少組件實例

vuex、vue-router實現原理

vuex 是一個專門為vue.js應用程序開發的狀態管理庫。 核心概念:

你怎麼理解Vue中的diff演算法?

在js中,渲染真實 DOM 的開銷是非常大的, 比如我們修改了某個數據,如果直接渲染到真實 DOM , 會引起整個 dom 樹的重繪和重排。那麼有沒有可能實現只更新我們修改的那一小塊dom而不要更新整個 dom 呢?此時我們就需要先根據真實 dom 生成虛擬 dom , 當虛擬 dom 某個節點的數據改變後會生成有一個新的 Vnode , 然後新的 Vnode 和舊的 Vnode 作比較,發現有不一樣的地方就直接修改在真實DOM上,然後使舊的 Vnode 的值為新的 Vnode 。

diff 的過程就是調用 patch 函數,比較新舊節點,一邊比較一邊給真實的 DOM 打補丁。在採取 diff 演算法比較新舊節點的時候,比較只會在同層級進行。 在 patch 方法中,首先進行樹級別的比較 new Vnode 不存在就刪除 old Vnode old Vnode 不存在就增加新的 Vnode 都存在就執行diff更新 當確定需要執行diff演算法時,比較兩個 Vnode ,包括三種類型操作:屬性更新,文本更新,子節點更新 新老節點均有子節點,則對子節點進行 diff 操作,調用 updatechidren 如果老節點沒有子節點而新節點有子節點,先清空老節點的文本內容,然後為其新增子節點 如果新節點沒有子節點,而老節點有子節點的時候,則移除該節點的所有子節點 老新老節點都沒有子節點的時候,進行文本的替換

updateChildren 將 Vnode 的子節點Vch和oldVnode的子節點oldCh提取出來。 oldCh和vCh 各有兩個頭尾的變數 StartIdx和EndIdx ,它們的2個變數相互比較,一共有4種比較方式。如果4種比較都沒匹配,如果設置了 key ,就會用 key 進行比較,在比較的過程中,變數會往中間靠,一旦 StartIdx>EndIdx 表明 oldCh和vCh 至少有一個已經遍歷完了,就會結束比較。

你都做過哪些Vue的性能優化?

你知道Vue3有哪些新特性嗎?它們會帶來什麼影響?

更小巧、更快速 支持自定義渲染器 支持搖樹優化:一種在打包時去除無用代碼的優化手段 支持Fragments和跨組件渲染

模板語法99%保持不變 原生支持基於class的組件,並且無需藉助任何編譯及各種stage階段的特性 在設計時也考慮TypeScript的類型推斷特性 重寫虛擬DOM 可以期待更多的編譯時提示來減少運行時的開銷 優化插槽生成 可以單獨渲染父組件和子組件 靜態樹提升 降低渲染成本 基於Proxy的觀察者機制 節省內存開銷

檢測機制 更加全面、精準、高效,更具可調試式的響應跟蹤

實現雙向綁定 Proxy 與 Object.defineProperty 相比優劣如何?

React

1、react中key的作用,有key沒key有什麼區別,比較同一層級節點什麼意思?

2、你對虛擬dom和diff演算法的理解,實現render函數

虛擬DOM 本質上是 JavaScript 對象,是對 真實DOM 的抽象表現。 狀態變更時,記錄新樹和舊樹的差異 最後把差異更新到真正的 dom 中 render函數:

3、React組件之間通信方式?

Context 提供了一個無需為每層組件手動添加 props ,就能在組件樹間進行數據傳遞的方法.如果你只是想避免層層傳遞一些屬性,組件組合( component composition )有時候是一個比 context 更好的解決方案。 5. 組件組合缺點:會使高層組件變得復雜

4、如何解析jsx

5、生命周期都有哪幾種,分別是在什麼階段做哪些事情?為什麼要廢棄一些生命周期?

componentWillMount、componentWillReceiveProps、componentWillUpdate在16版本被廢棄,在17版本將被刪除,需要使用UNSAVE_前綴使用,目的是向下兼容。

6、關於react的優化方法

使用return null而不是CSS的display:none來控制節點的顯示隱藏。保證同一時間頁面的DOM節點盡可能的少。

不要使用數組下標作為key 利用 shouldComponentUpdate 和 PureComponent 避免過多 render function ; render 裡面盡量減少新建變數和bind函數,傳遞參數是盡量減少傳遞參數的數量。 盡量將 props 和 state 扁平化,只傳遞 component 需要的 props (傳得太多,或者層次傳得太深,都會加重 shouldComponentUpdate 裡面的數據比較負擔),慎將 component 當作 props 傳入

使用 babel-plugin-import 優化業務組件的引入,實現按需載入 使用 SplitChunksPlugin 拆分公共代碼 使用動態 import ,懶載入 React 組件

7、綁定this的幾種方式

8、對fiber的理解

9、setState是同步還是非同步的

10、Rex、React-Rex

Rex的實現流程

用戶頁面行為觸發一個 Action ,然後 Store 調用 Recer ,並且傳入兩個參數:當前 State 和收到的 Action 。 Recer 會返回新的 State 。每當 state 更新之後, view 會根據 state 觸發重新渲染。

React-Rex:

Provider :從最外部封裝了整個應用,並向 connect 模塊傳遞 store 。 Connect :

11、對高階組件的理解

高階組件是參數為組件,返回值為新組件的函數。 HOC 是純函數,沒有副作用。 HOC 在 React 的第三方庫中很常見,例如 Rex 的 connect 組件。

高階組件的作用:

12、可以用哪些方式創建 React 組件?

React.createClass()、ES6 class 和無狀態函數

13、 React 元素與組件的區別?

組件是由元素構成的。元素數據結構是普通對象,而組件數據結構是類或純函數。

Vue與React對比?

數據流:

react 主張函數式編程,所以推崇純組件,數據不可變,單向數據流,

vue 的思想是響應式的,也就是基於是數據可變的,通過對每一個屬性建立Watcher來監聽,當屬性變化的時候,響應式的更新對應的虛擬dom。

監聽數據變化實現原理

組件通信的區別:jsx和.vue模板。

性能優化

vuex 和 rex 之間的區別?

從實現原理上來說,最大的區別是兩點:

Rex 使用的是不可變數據,而 Vuex 的數據是可變的。 Rex 每次都是用新的 state 替換舊的 state ,而 Vuex 是直接修改

Rex 在檢測數據變化的時候,是通過 diff 的方式比較差異的,而 Vuex 其實和Vue的原理一樣,是通過 getter/setter 來比較的(如果看 Vuex 源碼會知道,其實他內部直接創建一個 Vue 實例用來跟蹤數據變化)

瀏覽器從輸入url到渲染頁面,發生了什麼?

網路安全、HTTP協議

TCP UDP 區別

Http和Https區別(高頻)

GET和POST區別(高頻)

理解xss,csrf,ddos攻擊原理以及避免方式

XSS ( Cross-Site Scripting , 跨站腳本攻擊 )是一種代碼注入攻擊。攻擊者在目標網站上注入惡意代碼,當被攻擊者登陸網站時就會執行這些惡意代碼,這些腳本可以讀取 cookie,session tokens ,或者其它敏感的網站信息,對用戶進行釣魚欺詐,甚至發起蠕蟲攻擊等。

CSRF ( Cross-site request forgery ) 跨站請求偽造 :攻擊者誘導受害者進入第三方網站,在第三方網站中,向被攻擊網站發送跨站請求。利用受害者在被攻擊網站已經獲取的注冊憑證,繞過後台的用戶驗證,達到冒充用戶對被攻擊的網站執行某項操作的目的。

XSS避免方式:

CSRF 避免方式:

DDoS 又叫分布式拒絕服務,全稱 Distributed Denial of Service ,其原理就是利用大量的請求造成資源過載,導致服務不可用。