title: 仔顯示圖片的時候,滑鼠以上可以顯示一些資訊,一般爲建議、提示型別
alt : 當網速不佳,或者因其他原因圖片載入不出來,代替圖片解釋的資訊
有區別,但區別不明顯,瀏覽器顯示不出來。
section:定義文件中的一個章節
nav:定義只包含導航鏈接的章節
header:定義頁面或章節的頭部。它經常包含 logo、頁面標題和導航性的目錄。
footer:定義頁面或章節的尾部。它經常包含版權資訊、法律資訊鏈接和反饋建議用的地址。
aside:定義和頁面內容關聯度較低的內容——如果被刪除,剩下的內容仍然很合理。
a. 去掉或者丟失樣式的時候能夠讓頁面呈現出清晰的結構
b. 有利於SEO:和搜尋引擎建立良好溝通,有助於爬蟲抓取更多的有效資訊:爬蟲依賴於標籤來確定上下文和各個關鍵字的權重;
c. 方便其他裝置解析(如螢幕閱讀器、盲人閱讀器、移動裝置)以意義的方式來渲染網頁;
d. 便於團隊開發和維護,語意化更具可讀性,遵循W3C標準的團隊都遵循這個標準,可以減少差異化。
a. HTML5 現在已經不是 SGML 的子集,主要是關於影象,位置,儲存,多工等功能的增加。
b. 拖拽釋放(Drag and drop) API
c. 語意化更好的內容標籤(header,nav,footer,aside,article,section)
d. 音訊、視訊API(audio,video)
e. 畫布(Canvas) API
f. 地理(Geolocation) API
g. 本地離線儲存 localStorage 長期儲存數據,瀏覽器關閉後數據不丟失
h. sessionStorage 的數據在頁面對談結束時會被清除
i. 表單控制元件,calendar、date、time、email、url、search
j. 新的技術webworker, websocket等
移除的元素:
a. 純表現的元素:basefont,big,center, s,strike,tt,u;
b. 對可用性產生負面影響的元素:frame,frameset,noframes;
答:
cookies:伺服器和用戶端都可以存取,大小隻有4KB左右,有有效期,過期後將會刪除;
localStorage:將數據儲存在原生的硬體裝置,沒有時間限制,關閉瀏覽器也不會丟失。永久保cun
sessionStorage:將數據儲存在session物件中,關閉瀏覽器後數據也隨之銷燬。臨時儲存。
答:
它們之間的共同點:都是儲存在瀏覽器端,且是同源的。
它們之間的區別:
答:
get方式和post方式提交數據的區別:
1) 大小不同,get方式傳輸的數據量較小,而post可以傳輸大量的數據。
2) 安全程度不同,get方式傳輸數據能夠被別人輕易的看到數據內容,所以安全程度較低,
而post則可以很好的隱藏。
3) 速度不同,post方式速度較慢,而get方式速度較快。
4) 在伺服器上的作用不同,get是從伺服器上獲取數據,而post是向伺服器上傳送數據。
在實際開發中的應用:
1)在重要數據進行傳輸數據的時候,用post的方式進行提交數據。
2)在做數據查詢的時候,用get的方式進行提交數據。
3)在做增加、刪除和修改數據的時候,用post的方式進行提交數據。
答:
塊級元素:div、p、h1-h6、ol、ul、table、form
行內元素:span、a、img、input、select、small
空元素:沒有內容的元素、 br、 hr
答:
1)src用於替換當前元素;href用於在當前文件和參照資源之間確立聯繫。
2)src是source的縮寫,指向外部資源的位置,指向的內容將會嵌入到文
檔中當前標籤所在位置。
3)href是Hypertext Reference的縮寫,指向網路資源所在位置,建立和
當前元素(錨點)或當前文件(鏈接)之間的鏈接。
常見的佈局方式:固定佈局、流式佈局、彈性佈局、浮動佈局、定位佈局、margin和padding
a. 新增額外標籤,例如
<div style="clear:both"></div>
b. 父元素設定 overflow:hidden auto;
c. 父元素也設定浮動
a. link屬於HTML標籤,而@import是CSS提供的,且只能載入 CSS
b. 頁面被載入時,link會同時被載入,而@import參照的CSS會等到頁面被載入完再載入
link方式的樣式的權重 高於@import的權重
相同:
a. 改變行內元素的呈現方式,display被置爲block
b. 讓元素脫離普通流,不佔據空間
c. 預設會覆蓋到非定位元素上
區別:
absolute的」根元素「是可以設定的,而fixed的」根元素「固定爲瀏覽器視窗。
當你卷動網頁,fixed元素與瀏覽器視窗之間的距離是不變的。
absolute:生成絕對定位的元素,相對於 static 定位以外的第一個祖先元素進行定位
fixed:生成絕對定位的元素,相對於瀏覽器視窗進行定位。 (IE6不支援)
relative:生成相對定位的元素,相對於其在普通流中的位置進行定位
static:預設值。沒有定位,元素出現在正常的流中
CSS3實現圓角(border-radius),陰影(box-shadow),對文字加特效(text-shadow),線性漸變(gradient),變形(transform)
如果使用import方法對CSS進行匯入,會導致某些頁面在Windows下的IE出現一些奇怪的現象:
以無樣式顯示頁面內容的瞬間閃爍,這種現象稱之爲文件樣式短暫失效(Flash of Unstyled Content),
簡稱爲FOUC。
原理:當樣式表晚於結構性html載入,當載入到此樣式表時,頁面將停止之前的渲染。
此樣式表被下載和解析後,將重新渲染頁面,也就出現了短暫的花屏現象。
解決方法:
使用LINK標籤將樣式表放在文件HEAD中。
BFC, 可以理解爲他是運用一些渲染規則的塊渲染區域,他是css世界中的結界,爲何說是結界,
因爲在觸發了BFC 特性的容器下元素和容器外部元素完全隔離,子元素的佈局不會影響外部元素,
反之亦然
BFC 元素有如下一些特徵:
BFC 的塊不會和浮動塊重疊
計算BFC 元素的高度時,會包括浮動元素
在一個BFC下的塊 margin 會發生重疊 ,不在同一個則不會
BFC元素是一個獨立的容器,使得裏面的元素和外部元素隔離開,互不影響
觸發BFC:
float的值不爲 none
overflow 的值爲 auto ,scroll 和 hidden
display 的值爲 table-cell , table-caption 和 inline-block
position 設定爲 absolute 和 fixed
除此之外, html 元素本身預設就是一個 BFC 元素
有兩種, IE盒子模型、W3C盒子模型;
盒模型: 內容(content)、填充(padding)、邊界(margin)、 邊框(border);
區 別: IE的content部分把 border 和 padding計算了進去;
px 是絕對單位
em 相對單位,基於父節點字型大小
rem 會繼承父級元素的字型大小
使用 rem 爲元素設定字型大小時,仍然是相對大小,但相對的只是HTML 跟元素
重繪:當渲染樹中的元素外觀(如:顏色)發生改變,不影響佈局時,產生重繪
迴流:當渲染樹中的元素的佈局(如:尺寸、位置、隱藏/狀態狀態)發生改變時,產生重繪迴流
- Promise 就是一個物件,用來表示並傳遞非同步操作的最終結果
- Promise 最主要的互動方式:將回撥函數傳入 then 方法來獲得最終結果或出錯原因
- Promise 程式碼書寫上的表現:以「鏈式呼叫」代替回撥函數層層巢狀(回撥地獄)
宏任務(macro-task):整體程式碼script、setTimeOut、setInterval
微任務(mincro-task):promise.then、promise.nextTick(node)
什麼是跨域? 爲什麼瀏覽器要使用同源策略? 你有集中方式可以解決跨域問題?
1.因爲瀏覽器處與安全考慮,有同源策略,也就是說,如果協定,域名或者埠號
有一個不同就是跨域,ajax 請求會失敗
2.那麼是處於什麼安全考慮纔會引入這種機制 機製呢,其實主要是用來防止,CSRF 攻擊的, 簡單點說 CSRF 攻擊是利用使用者的登入狀態發起惡意請求
3. 也就是沒有同源策略的條件下,A網站可以被任意其他來源的Ajax存取到內容,如果你當前A 網站還存在登錄態, 那麼對方可以通過Ajax獲得你的任何資訊,當然跨域並不能完全阻止CSRF
怎麼解決跨域問題?
JSONP:(只限於get請求)
script可以把請求內容當做字串讀取,解析成js程式碼
src:不受同源策略的影響,只要返回的js程式碼正確就可以了
CORS :
CORS 需要瀏覽器和後端同時支援,IE 8 和 9 需要通過 XDomainRequest
來實現。
後端設定(伺服器端) Access-Control-Allow-Origin
nginx代理跨域
call 和 apply 都是爲了解決改變 this指向,作用都是相同的,只是傳參的方式不同。
除了第一個參數外, call 可以接收一個參數列表 , apply只接受一個參數陣列
bind: 只想改變this的指向,但是不呼叫函數,
call和 apply 呼叫。 這兩種,呼叫方法可以改變this的指向。僅本次呼叫第一個參數是改變後的this指向
共同點:用於瀏覽器端儲存的快取數據;
不同點:
(1)、儲存內容是否發送到伺服器端:當設定了Cookie後,數據會發送到伺服器端,造成一定的寬頻浪費;
web storage,會將數據儲存到本地,不會造成寬頻浪費;
(2)、數據儲存大小不同:Cookie數據不能超過4K,適用於對談標識;web storage數據儲存可以達到5M;
(3)、數據儲存的有效期限不同:cookie只在設定了Cookid過期時間之前一直有效,即使關閉視窗或者瀏覽器;
sessionStorage,僅在關閉瀏覽器之前有效;localStorage,數據儲存永久有效;
(4)、作用域不同:cookie和localStorage是在同源同視窗中都是共用的;sessionStorage不在不同的瀏覽器視窗中共用,即使是同一個頁面;
CSRF、XSS 攻擊原理、防禦措施
攻擊原理:
防禦措施:
Token驗證
Referer 驗證(簡單易行,但 referer 可能被改變)
隱藏令牌(跟 Token驗證差不多,把令牌存到 header 中)
XSS(cross-site scripting)跨域指令碼攻擊:
攻擊原理: 往 Web 頁面裡插入惡意Script程式碼
防禦措施: HTML:對以下這些字元進行跳脫:
每個範例物件( object )都有一個私有屬性(稱之爲 proto )指向它的建構函式的原型物件(prototype )。該原型物件也有一個自己的原型物件( proto ) ,層層向上直到一個物件的原型物件爲 null。根據定義,null 沒有原型,並作爲這個原型鏈中的最後一個環節 (原型鏈)
1. 用戶端輸入使用者名稱和密碼
2. 伺服器端來驗證這個使用者名稱和密碼 如果是正確的 會簽發一個token 再把這個 token 返回給用戶端
3. 用戶端把這個token 儲存起來
4. 用戶端每次像伺服器端請求資源的時候需要帶着伺服器端簽發的 token
5. 伺服器端 然後做比較 如果是驗證成功 ,就會返回用戶端請求的數據
1. 將 json 物件轉化爲 json 字串,在判斷該字串是否爲 {}
2. for in 回圈判斷
3. ES6 的 Object.keys() 方法,返回值也是物件中屬性名組成的數
cdn 加速器
路由懶載入
v-if 和 v-show 的選擇使用
圖片懶載入
非同步元件
第三方庫按需引入
瀏覽器快取
特點:
由於ES5的object.definedProperty()這個方法不相容 IE8,所以我們的vue的相容性也是不相容 IE8 及以下版本
MVVM分爲Model、View、ViewModel三者。
Model 代表數據模型,數據和業務邏輯都在Model層中定義;
!!!需要注意的是,當我們啓用 history 模式的時候,由於我們的專案是一個單頁面應用,所以在路由跳轉的時候,就會出現存取不到靜態資源而出現 404 的情況,這時候就需要伺服器端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態資源,則應該返回同一個 index.html 頁面
v-model:一般用在表達輸入,很輕鬆的實現表單控制元件和數據的雙向系結
v-html:更新元素的innerHTML
v-show與v-if:條件渲染,注意二者區別
v-on:click:可以簡寫爲@click,@系結一個事件。如果事件觸發了,就可以指定事件的處理常式
v-for:基於源數據多次渲染元素或模板
v-bind:當表達式的值改變時,將其產生的連帶影響,響應式地作用於DOM語法
v-bind:title=」msg」簡寫:title="msg"
v-model:一般用在表達輸入,很輕鬆的實現表單控制元件和數據的雙向系結
v-html:更新元素的innerHTML
v-show與v-if:條件渲染,注意二者區別
v-on:click:可以簡寫爲@click,@系結一個事件。如果事件觸發了,就可以指定事件的處理常式
v-for:基於源數據多次渲染元素或模板
v-bind:當表達式的值改變時,將其產生的連帶影響,響應式地作用於DOM語法
v-bind:title=」msg」簡寫:title="msg"
虛擬dom與diff運算:
diff運算:
減少Dom操作 提高元件複用性
diff運算:新的虛擬dom與舊的虛擬dom對比,找出**最小差異**,發送給真實的dom進行更新
beforeCreate
: vue範例的掛載元素el和數據物件data都爲undefined,還未初始化。created
: vue範例的數據物件data有了,el還沒有beforeMount
: vue範例的$el和data都初始化了,但還是掛載之前爲虛擬的dom節點,data.message還未替換。mounted
: vue範例掛載完成,data.message成功渲染。beforeUpdate
: 數據更新前呼叫Update
: 數據更新後呼叫beforeDestroy
:適合移除事件、定時器等等,否則可能會引起記憶體泄露的問題。destroyed
: 進行一系列的銷燬操作,如果有子元件的話,也會遞回銷燬子元件,所有子元件都銷燬完畢後纔會執行第一次頁面載入會觸發哪幾個勾點?
簡單描述每個週期具體適合哪些場景?
父元件向子元件通訊
子元件通過 props 屬性,系結父元件數據,實現雙方通訊
子元件向父元件通訊
將父元件的事件在子元件中通過 $emit 觸發
非父子元件、兄弟元件之間的數據傳遞
路由的概念就是, 能夠通過不同的請求地址來響應不同的頁面或數據
檢視: router-view 路由坑 路由匹配到的元件將渲染在這裏
導航: router-link 路由跳轉 相當於a標籤 沒有a標籤的#號 而且還自帶樣式 .router-link-active 還有起到跳轉作用
1. v-if 是真正的條件渲染, 預設條件爲false時元素不渲染,
預設條件爲true時元素渲染 條件變爲false時元素會銷燬,
條件變爲true時元素會重新建立。
而 v-show 只是簡單的去控制元素的css的display屬性。
2. v-show 有更高的初始渲染開銷(因爲不管預設條件爲真還是假,都會渲染出來)
v-if 有更高的切換開銷(切換時做銷燬與重建的操作) 如果需要頻繁切換顯示
隱藏使用v-show更好,其餘情況使用v-if就好。
3. v-if 有 v-else v-else-if 去配套使用。
v-show 沒有,它是孤零零的一個人
4. v-if 能配合 template 元素使用,而 v-show 不能。
優點:
良好的互動體驗
良好的前後端工作分離模式
減輕伺服器壓力
缺點:
SEO難度較高
前進、後退管理
初次載入耗時多
keep-alive 是 Vue 內建的一個元件,可以使被包含的元件保留狀態,或避免重新渲染
keep-alive
元件包裹需要儲存的元件。keep-alive
元件來說,它擁有兩個獨有的生命週期勾點函數,分別爲 activated
和 deactivated
。用 keep-alive
包裹的元件在切換時不會進行銷燬,而是快取到記憶體中並執行 deactivated
勾點函數,命中快取渲染後會執行 actived
勾點函數。數據驅動 元件系統
1.url 地址表現不同,hash模式有#號,history模式沒有
2.實現原理不同
3. 相容不同 :
1.hash模式都可以相容
2.histyory 模式只能相容到IE10及以上
3.history 模式會出現404 找不到頁面這種問題,需要後端設定相關的處理才行,而hash 模式沒有這個問題
4.history 模式時,重定向會有些問題 ,需要頁面的名字叫index.html才行
使用程式碼分割 實現程式碼分割 讓元件按需載入 優化專案 效能
使用 key
shouldconmpoentUpdate
元件儘可能的進行拆分
傳參優化
多元件優化
相同點:
1、 數據驅動頁面,提供響應式的檢視元件
2、 都有 virtual DOM 元件化的開發, 通過props參數進行父子之間元件傳遞數據,都實現了 webComponents 規範
3、 數據流動單向,都支援伺服器端的渲染 SSR
4、 都有支援native的方法, react 有 react native vue有 wexx
不同點:
1. 數據系結: Vue實現了雙向的數據系結,react 數據流動是單向的
2. 數據渲染: 大規模的數據渲染, react更快
3. 使用場景: React 配合Redux 架構適合大規模多人共同作業複雜專案,Vue 適合小快 的專案
4. 開發分格, react推薦做法 jsx+ inline style 把html和css都寫在js了 , vue是採用 webpack +vue-loader 單檔案元件格式 html,js,css同一個檔案
1. 宣告式設計 - React採用宣告範式,可以輕鬆描述應用
2. 高效 - React 通過對Dom的模擬(虛擬Dom),最大限度減少與Dom的互動
3. 靈活 - React 可以與一直的庫或框架很好的配合
4. JSX - JSX 是 JavaScript 的語法擴充套件
5. 元件 - 通過React構建元件,使得程式碼更加容易得到複用,能夠很好的應用在大專案的開發中
6. 單項響應的數據流 - React 實現了單項響應的數據流,從而減少了重複程式碼,這也是它爲什麼比傳統的系結更簡單。
1. 程式碼簡潔,開發快速
2. 接近自然語言,易於理解
3. 更方便的程式碼管理
4. 易於"併發程式設計「
5. 程式碼的熱升級
componentWillMount :render之前最後一次修改狀態的機會
render : 只能存取this.props和 this.state,不允許修改狀態和Dom 輸出
componentDidMount :成功render並渲染完成真實Dom之後觸發,可以修改DOM
componentWillReceiveProps :父元件修改屬性觸發
shouldComponentUpdate :返回false會阻止render呼叫
componentWillUpdate :不能修改屬性和狀態
render : 只能存取this.props和 this.state,不允許修改狀態和Dom 輸出
componentDidUpdate : 可以修改DOM
componentWillUnmount :在刪除這個元件前進行清理操作
問題:
解決:
getDerivedStateFromProps
第一次的初始化元件以及後續的更新過程中(包括自身狀態更新以及父傳子) ,返回一個物件作爲新的state,返回null則說明不需要在這裏更新state
static getDerivedStateFromProps(nextProps){
if(nextProps.value!==undefined){
return{
current:nextProps.value
}
}
return null
}
getSnapshotBeforeUpdate
取代了 componetWillUpdate ,觸發時間爲update發生的時候,在render之後dom渲染之前返回一個值,作爲componentDidUpdate的第三個參數
shouldComponentUpdate
PureComponent
real Dom
1. 更新緩慢
2. 可以直接更新 HTML
3. 如果元素更新,則建立新DOM
4. DOM 操作代價很高
5. 消耗的記憶體較多
Virtual DOM
1. 更新更快
2. 無法直接更新 HTML
3. 如果元素更新,則更新JSX
4. DOM 操作非常簡單
5. 很少的記憶體消耗
React 是一個用於構建用戶介面的 JAVASCRIPT 庫。
React主要用於構建UI,很多人認爲 React 是 MVC 中的 V(檢視)。
React 起源於 Facebook 的內部專案,用來架設 Instagram 的網站,並於 2013 年 5 月開源。
React 擁有較高的效能,程式碼邏輯非常簡單,越來越多的人已開始關注和使用它。
React 的一些主要特點是:
它提高了應用的效能
可以方便地在用戶端和伺服器端使用
由於JSX ,程式碼的可讀性很好
使用 React,編寫UI 測試用例變得非常容易
高階函數就是一個純js且沒有副作用的函數。
高階元件是一個純函數,也是容器元件.是參數爲元件,返回值爲新元件的函數.
高階元件就是一個函數,且該函數接受一個元件作爲參數,並返回一個新的元件的函數。
高階函數就是一個純js且沒有副作用的函數。
高階元件是一個純函數,也是容器元件.是參數爲元件,返回值爲新元件的函數.
高階元件就是一個函數,且該函數接受一個元件作爲參數,並返回一個新的元件的函數。
高階函數 : 一個函數內部返回一個新的函數,內部採用閉包的寫法
var add = x => {
return y => {
return x+y
}
}
高階元件:(HOC) Higher-Order-Component
高階元件本質上就是一個函數,內部可以接收一個元件,然後返回新的元件。
例如: React.memo() connect()
父子通訊
兄弟元件通訊:
對於這種情況可以通過共同的父元件來管理狀態和事件函數,比如說其中一個兄弟元件呼叫父元件傳遞過來的事件函數修改父元件中的狀態,然後父元件將狀態給另一個兄弟元件
跨多層次元件通訊:
如果你使用16.3 以上版本的話,對於這種情況可以使用 Context API
任意元件:
這種方式可以通過Redux 或者 Event Bus 解決,另外如果你不怕麻煩的話,可以使用這種方式解決上述所有的通訊情況
ES5元件 React.createElement()
類元件 class User extends React.Component {}
無狀態元件 function User(props) {}
高階元件 function Hoc(Child) { }
Hocks 元件
jsx = javascript xml 語法糖
jsx 變數、物件
jsx 不是強制的,但jsx讓程式碼更具可讀性
jsx 可以巢狀
jsx 中可以使用表達式,使用方法用 單大括號進行包裹
jsx 語法更接近javascript 而不是html
React 元件的生命週期有三個不同的階段:
1.初始化階段
componentWillMount: rende之前最後一次修改狀態的機會
render: 只能存取 this.props和 this.state,不允許修改狀態和DOM 輸出
componentDidMount: 成功render並渲染完成真實DOM 之後觸發
可以修改DOM
2.執行中階段
componentWillReceiveProps: 父元件修改屬性觸發
shouldComponentUpdata: 返回 false 會阻止render呼叫
componentWillUpdate: 不能修改屬性和狀態
render: 只能存取this.props 和this.state , 不允許修改態和DOM 輸出
componentDidUpdate: :可以修改DOM
3.銷燬階段
componentWillUnmount: 再刪除元件之前進行清理操作,比如計時器和事件監聽器
一些最重要的生命週期方法是:
componentWillMount
建立範例前
render 渲染數據
componentDidMount
建立範例完成
componentWillUpdate
更新前
componentDidUpdate
更新完成 這個每次都會重新請求 不會判斷如果是一樣的就不更新
shouldcomponentUpdate(nextProps,nextState)
nextProps新的值 nextState老的值 這個可以判斷是否更新 預設是true更新 就會一直更新 不應該更新就返回false 這裏就是要判斷應不應該更新 如果更新之後的值和之前的值是一樣的話 就返回 false 不讓他更新了
componentWillReceiveProps(nextProps) nextProps
更改之後的值 這個生命週期 是在 父元件屬性發生改變纔會觸發
componentWillunmount
銷燬就會觸發這個
新增生命週期:==========================
初始化: getDeriveStateFromProps(nextProps,nextState
) nextState老數據 nextProps更新之後的數據 使用的時候要加 static getDerivedStateFromProps(nextProps,nextState)
更新: getDeriveStateFromProps(nextProps,nextState)
nextState老數據 nextProps更新之後的數據 這個生命週期只要是父元件呼叫 setState 就會走整個的更新階段,
getDeriveStateFromProps 這個生命週期 相當於兩個作用 一個是初始化的時候一個更新就的時候就是父元件屬性發生屬性發生改變就會觸發這裏
更新:getSnapshotBeforeUpdate
這個就是更新之前會觸發的 ,但是的話就是先會執行render渲染 然後立馬執行 getSnapshotBeforeUpdate 然後這個必須有返回值 這個返回值可以在更新完成那個生命週期的第三個參數接收到
這個相當於有個快照的感覺,就是一渲染立馬會記錄那個狀態,這個是渲染在更新,會記錄那個瞬間的值
其值由state控制的輸入表單元素稱爲「受控元件」。
其值由真實DOM控制的輸入表單元素稱爲「非受控元件」。
原則:
不會改變參數
相同的輸入一定產生相同的輸出
非同步的
首先 setState 的呼叫並不會馬上引起。 state 的改變,並且如果你一次呼叫了多個,
setState ,那麼結果可能並不如你期待的一樣
可以傳第二個參數
父元件通過 props 傳遞給子元件
子-父 通過 自定義事件
兄弟元件通訊 context
任意元件 redux event Bus
我們應該將 AJAX 請求放到 componentDidMount 函數中執行,主要原因有下:
當呼叫 setState 時,React會做的第一件事情是將傳遞給 setState 的物件合併到元件的當前狀態。這將啓動一個稱爲和解(reconciliation)的過程。和解(reconciliation)的最終目標是以最有效的方式,根據這個新的狀態來更新UI。 爲此,React將構建一個新的 React 元素樹(您可以將其視爲 UI 的物件表示)。
一旦有了這個樹,爲了弄清 UI 如何響應新的狀態而改變,React 會將這個新樹與上一個元素樹相比較( diff )。
通過這樣做, React 將會知道發生的確切變化,並且通過了解發生什麼變化,只需在絕對必要的情況下進行更新即可最小化 UI 的佔用空間。
createElement 函數式JSX 編譯之後使用的建立
React Element 的函數 , 而cloneElement 則是用於複製某個元素並傳入新的Props
redux-logger : 提供日誌輸出
redux-thunk : 處理非同步操作
redux-promise : 處理非同步操作,actionCreator的返回值是 promise
1. web 應用是一個狀態機, 檢視與狀態是 -- 對應的
2. 所有的狀態,儲存在一個物件裏面(唯一數據源)
是一個應用數據流框架,集中式管理
**怎麼用:**view呼叫 store 的 dispath 接收 action 傳入 store ,reducer 進行 state 操作, view 通過 store 提供的 getState 獲取最新的數據
缺點: state必須由父元件傳過來,子元件相關數據更新,父元件會強制渲染
1.一個元件所需要的數據,必須由父元件傳過來, 而不能像 flux 中直接從 store取
2.當一個元件相關數據更新時,即使父元件不需要用到這個元件,父元件還是會重新 render,
可能會有效率影響,或者需要些複雜的 shouldComponentUpdate 進行判斷
唯一數據源:
整個應用的state都被儲存到一個狀態樹裏面,並且這個狀態樹,只存在於唯一的store中
state 保持只讀狀態:
state是隻讀的,唯一改變state的方法就是觸發action,action是一個用於描述以發生時間的普通物件
數據改變只能通過純函數來執行:
使用純函數來執行修改,爲了描述action如何改變state的,你需要編寫reducers
Redux 由以下元件組成:
**store:用來儲存數據**
**reducer:真正的來管理數據**
**actionCreators:建立action,交由reducer處理**
**view: 用來使用數據,在這裏,一般用react元件來充當**
1.很多非父子通訊需要管理
2.快取後端數據,減少重複的後端請求,減輕伺服器壓力,提高使用者體驗
減少Dom操作 提高元件複用性
安裝 : $ cnpm install react-redux -S
核心元件:
**Provider 提供者 屬性上通過store將數據派給容器元件**
**connect 用於連線容器元件與UI元件**
`connect() 返回一個函數,函數參數接收UI元件,返回容器元件`
connect(mapStateToProps,mapDispatchToProps)(ui元件)
容器元件內部幫你做了 store.subscribe() 的方法訂閱
狀態變化 ==> 容器元件監聽狀態改變了 ==> 通過屬性的方式傳給UI元件
把`store.getState()`的狀態轉化爲展示元件的`props`使用
虛擬dom相當於在js和真實dom中間加了一個快取,利用dom diff演算法避免了沒有必要的dom操作,從而提高效能:
具體實現步驟如下:
用 JavaScript 物件結構表示 DOM 樹的結構;然後用這個樹構建一個真正的 DOM 樹,插到文件當中
當狀態變更的時候,重新構造一棵新的物件樹。然後用新的樹和舊的樹進行比較,記錄兩棵樹差異
把2所記錄的差異應用到步驟1所構建的真正的DOM樹上,檢視就更新
把樹形結構按照層級分解,只比較同級元素。
給列表結構的每個單元新增唯一的key屬性,方便比較。
React 只會匹配相同 class 的 component(這裏面的class指的是元件的名字)
合併操作,呼叫 component 的 setState 方法的時候, React 將其標記爲 - dirty.到每一個事件回圈結束, React 檢查所有標記 dirty的 component重新繪製.
選擇性子樹渲染。開發人員可以重寫shouldComponentUpdate提高diff的效能
Flux 的最大特點,就是數據的"單向流動"。
Flux 是一種強制單向數據流的架構模式。它控制派生數據,並使用具有所有數據許可權的中心 store 實現多個元件之間的通訊。整個應用中的數據更新必須只能在此處進行。 Flux 爲應用提供穩定性並減少執行時的錯誤。
使用者存取 View
View發出使用者的 Action
Dispatcher 收到Action,要求 Store 進行相應的更新
Store 更新後,發出一個"change"事件
View 收到"change"事件後,更新頁面
hooks 他是一組函數api
解決問題: 類元件 (無狀態元件)
hooks 讓類元件可以擁有 state, 生命週期等特性
先簡要概述瀏覽器渲染的步驟:
1.處理HTML標記並構建DOM樹
2.處理CSS標記並構建CSSOM樹
3.將DOM與CSSOM合併成一個渲染樹
4.根據渲染樹來佈局,計算每個節點的佈局資訊
5.將各個節點繪製到螢幕上
響應式設計與自適應設計的區別:
1、檔案合併(目的是減少http請求)
2、檔案壓縮(目的是直接減少檔案下載的體積)
3、使用cdn託管資源
4、使用快取
5、gizp壓縮你的js和css檔案
6、meta標籤優化(title,description,keywords)、heading標籤的優化、alt優化
7、反向鏈接,網站外鏈接優化
web標準簡單來說可以分爲結構、表現和行爲。其中結構主要是有HTML標籤組成。或許通俗點說,在頁面body裏面我們寫入的標籤都是爲了頁面的結構。表現即指css樣式表,通過css可以是頁面的結構標籤更具美感。行爲是指頁面和使用者具有一定的互動,同時頁面結構或者表現發生變化,主要是有js組成。
web標準一般是將該三部分獨立分開,使其更具有模組化。但一般產生行爲時,就會有結構或者表現的變化,也使這三者的界限並不那麼清晰。
W3C對web標準提出了規範化的要求,也就是在實際程式設計中的一些程式碼規範:
1.對於結構要求:(標籤規範可以提高搜尋引擎對頁面的抓取效率,對SEO很有幫助)
2.對於css和js來說
HTTP協定是一個廣泛應用的Internet協定。在其中有8個不同的請求方法:
GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT
GET:向特定的資源發出請求。
POST:向指定資源提交數據進行處理請求(例如提交表單或者上傳檔案)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
快取策略的分類:
對於強快取,瀏覽器在第一次請求的時候,會直接下載資源,然後快取在本地,第二次請求的時候,直接使用快取。
對於協商快取,第一次請求快取且儲存快取標識與時間,重複請求向伺服器發送快取標識和最後快取時間,伺服器端進行校驗,如果失效則使用快取
100-199 : 正在請求
200-299 : 表示一定上的成功
300-399 : 表示重定向
400-499 : 用戶端錯誤
500-599 : 伺服器端的錯誤
瀏覽器根據請求的URL 交給 DNS 域名解析,找到真實IP, 向伺服器發起請求;
伺服器交給後臺處理完成後返回數,瀏覽器接受檔案(HTML.JS,CSS 影象等)
瀏覽器對載入到的資源(HTML、JS、CSS等)進行語法解析,建立相應的內部數據結構(如HTML的DOM);
載入解析到的資原始檔,渲染頁面,完成。
-----------------------------------------------
1、瀏覽器的位址列輸入URL並按下回車。
2、瀏覽器查詢當前URL的DNS快取記錄。
3、DNS解析URL對應的IP。
4、根據IP建立TCP連線(三次握手)。
5、HTTP發起請求。
6、伺服器處理請求,瀏覽器接收HTTP響應。
7、渲染頁面,構建DOM樹。
8、關閉TCP連線(四次揮手)
爲了數據傳輸的安全, HTTPS 在HTTP 的基礎上加入SSL協定,SSL 依靠證書來驗證伺服器的身份,
並未瀏覽器和伺服器之間的通訊加密
http 是超文字傳輸協定,資訊是明文傳輸,
https 則是具有安全性的 ssl 加密傳輸協定
http 的連線很簡單, 是無狀態的;
https 協定是由 SSL+HTTP 協定構建的可進行加密傳輸,身份認證的網路協定, 比 http 協定安全
就是該記憶體空間使用了 但是沒有回收 所以導致了泄漏
以下會造成記憶體漏失:
(1)意外的全域性變數引起的記憶體泄露。
(2)閉包引起的記憶體泄露。
(3)沒有清理的DOM元素參照。
(4)被遺忘的定時器或者回撥
(5)子元素存在引起的記憶體泄露
(1)模擬手機偵錯
(2)真機偵錯之android手機+Chrome
(3)真機偵錯之 iphone+ safari ⑷UC瀏覽器
(1)微信內建瀏覽器偵錯
(2)debuggap
(3)抓包
可能的原因:
(1)後端原因:後端介面,後端伺服器
(2)域名、IP和路徑問題
(3)網路環境問題
(4)線上庫、框架、工具的版本和本地不—致問題
(5)線上和本地數據資源不—致問題
(6)程式bug
1. 前端是最貼近使用者的程式設計師,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好
2. 參與專案,快速高品質完成實現效果圖,精確到1px;
3. 與團隊成員,UI設計,產品經理的溝通;
4. 做好的頁面結構,頁面重構和使用者體驗;
5. 處理hack,相容、寫出優美的程式碼格式;
6. 針對伺服器的優化、擁抱最新前端技術。
第一次握手,由瀏覽器發起,告訴伺服器,我要發起請求了,
第二次握手,由伺服器發起,告訴瀏覽器我準備接受了,你發送吧
第三次握手,由瀏覽器發送,告訴伺服器,我馬上發送了準備接受吧
第一次揮手, 瀏覽器發起,發送給伺服器 ,我東西發送完了,你準備關閉吧
第二次揮手,伺服器發送,告訴瀏覽器,我東西接收完了(請求報文) 我準備關閉了 你也準備吧
第三個揮手, 伺服器發起,告訴瀏覽器,我東西發送完了,(響應報文) 我準備關閉了 你也準備吧
第四次揮手, 瀏覽器發起,告訴瀏覽器,我東西接受完了,我準備關閉,你也準備吧
/* 把上、左、右三條邊隱藏掉(顏色設爲 transparent) */
#demo {
width: 0;
height: 0;
border-width: 20px;
border-style: solid;
border-color: transparent transparent red transparent;
}
// 給其他三個邊框都設爲 透明
div {
width: 0 ;
height: 0 ;
border: 100px solid red;
border-right-color: transparent;
border-bottom-color: transparent;
border-left-color: transparent;
}
webpack是一個前端模組化打包工具,主要由入口,出口,loader,plugins四個部分。前端的打包工具還有一個gulp,不過gulp側重於前端開發的過程,而webpack側重於模組,例如他會將css檔案看作一個模組,通過css-loader將css打包成符合css的靜態資源。