摘要:為什么使用的核心是將組件化,由數(shù)據(jù)驅(qū)動(dòng)的展現(xiàn)。僅僅使用進(jìn)行開(kāi)發(fā)的痛點(diǎn)組件嵌套層級(jí)深,回調(diào)地獄。遵守容器組件與展示組件分離的原則。
為什么使用redux
React的核心是將UI組件化,由數(shù)據(jù)驅(qū)動(dòng)UI的展現(xiàn)。但是如何管理數(shù)據(jù)模型、組件與數(shù)據(jù)模型之間的通信,react并沒(méi)有很好的解決方案。Redux由flux演變而來(lái),同時(shí)簡(jiǎn)化了Flux的流程。
僅僅使用react進(jìn)行開(kāi)發(fā)的痛點(diǎn)組件嵌套層級(jí)深,回調(diào)地獄。你可能會(huì)在一個(gè)較深層次的組件里需要更新全局state的某個(gè)字段,卻無(wú)奈只能通過(guò)從頂層組件一層一層傳遞下來(lái)的props進(jìn)行回調(diào)。
頁(yè)面的state不可預(yù)測(cè)。由于state缺乏一種可預(yù)測(cè)的機(jī)制,導(dǎo)致用戶在進(jìn)行一些頁(yè)面操作(更改state),或者異步請(qǐng)求有新的數(shù)據(jù)從服務(wù)端返回的時(shí)候,state的變化已經(jīng)不可控制,很容易產(chǎn)生bug
redux是怎么解決痛點(diǎn)的?1、通過(guò)react-redux提供的Provider組件,在根組件外面包一層,這樣根組件,以及所有的子組件都能拿到store。實(shí)現(xiàn)的原理是基于React自身提供的context屬性,但是react官方不推薦直接在組件中使用this.context。所以react-redux提供了另一種方法connect,通過(guò)connect將普通的UI組件升級(jí)為容器組件,同時(shí)將獲取store的細(xì)節(jié)也一并封裝在生成容器組件的代碼中,從而容器組件可以直接拿到store
// 定義App組件 class Foo extends React.Component{ render() { const { text } = this.props; return {text}; } } const App = connect( mapStateToProps, mapDispatchToProps )(Foo);
2、使用純函數(shù)修改state,保證state變化可預(yù)測(cè)。每次更改都返回一個(gè)全新的state。
3、遵守容器組件與展示組件分離的原則。這是redux一個(gè)重要的思想,容器組件和展示組件各司其職。
容器組件負(fù)責(zé)以下幾件事情:
處理數(shù)據(jù)邏輯
將store中的state轉(zhuǎn)變?yōu)閜rops傳遞給展示組件,對(duì)應(yīng)mapStateToProps
將注入了dispatch的函數(shù)作為props傳遞給展示組件,對(duì)應(yīng)mapDispatchToProps
有狀態(tài)的(展示組件則是無(wú)狀態(tài)的)
發(fā)起action,更新state
沒(méi)有DOM標(biāo)簽,沒(méi)有樣式
展示組件可復(fù)用的組件,又稱為“傻瓜組件”,僅僅通過(guò)容器組件傳進(jìn)來(lái)的props進(jìn)行UI展示,以及操作回調(diào)。感知不到redux的存在,脫離redux框架也能使用,盡量保持無(wú)狀態(tài)(可包含少量的UI狀態(tài)),有以下幾條原則:
不理解數(shù)據(jù)邏輯:不關(guān)心數(shù)據(jù)是如何得到的,也不關(guān)心數(shù)據(jù)是如何改變的
只通過(guò)props獲取數(shù)據(jù)和操作回調(diào)
基本是無(wú)狀態(tài)的:必須有的話,可以是UI的狀態(tài)
什么時(shí)候引入容器組件在引入之前,你可以先只用展示組件來(lái)構(gòu)建App。當(dāng)你發(fā)現(xiàn)有些組件并不會(huì)用到傳進(jìn)來(lái)的屬性,而僅僅只是把它往下傳給子組件的時(shí)候(并且層級(jí)比較深,超過(guò)兩層),你就要考慮引入容器組件了。
為什么使用immutable.js首先,在沒(méi)有immutable.js的情況下,碰到較深層次的數(shù)據(jù)結(jié)構(gòu)時(shí),更新state會(huì)變得很麻煩。
舊的state:
{ priceInfo: { price: 200, promotion: { offValue: 30 } } }
現(xiàn)在需要只更新offValue的值為50,該怎么處理呢?
let newState = _.cloneDeep(this.state); newState.priceInfo.promotion.offValue = 50; this.setState(newState);
可以看到,需要先深度復(fù)制一份this.state,然后修改offValue的值,最后執(zhí)行setState。除了這個(gè)過(guò)程的有點(diǎn)復(fù)雜,另外深度復(fù)制對(duì)象是挺耗性能的一件事。而通過(guò)Immutable.js,我們只需要這樣做:
let initialState = Immutable.fromJS({ priceInfo: { price: 200, promotion: { offValue: 30 } } }); this.setState(initialState.setIn(["priceInfo", "promotion", "offValue"]), 50);immutable.js帶來(lái)的性能提升
React做性能優(yōu)化時(shí)經(jīng)常用到 shouldComponentUpdate,只有深度比較才能得出正確的值,決定是否render,而深度比較是十分消耗性能的。Immutable 則提供了簡(jiǎn)潔高效的判斷數(shù)據(jù)是否變化的方法,只需 === 和 is 比較就能知道是否需要執(zhí)行render(),而這個(gè)操作幾乎零成本,所以可以極大提高性能。
immutable.js的數(shù)據(jù)結(jié)構(gòu)如何正確使用...擴(kuò)展運(yùn)算符在jsx的語(yǔ)法中,你已經(jīng)習(xí)慣了使用擴(kuò)展運(yùn)算符來(lái)傳遞props,如下所示:
const titleInfo = { title: "主標(biāo)題", subTitle: "副標(biāo)題" }; ... import Title from "title"; render() { return (); }
但是如果你要傳遞的數(shù)據(jù)是Immutable.Map類型的,使用...擴(kuò)展運(yùn)算符,得到的數(shù)據(jù)可能與你期望的不太一樣,因?yàn)?b>Immutable.Map的實(shí)例對(duì)象并不是plain object。{...titleInfo}等同于Object.assign({}, titleInfo)。Immutable.js提供了一種方法,可以實(shí)現(xiàn)這種轉(zhuǎn)換,如果是Map實(shí)例,只需調(diào)用toObject()(不要調(diào)用深度復(fù)制的toJS),就可以將Immutable.js的Map對(duì)象轉(zhuǎn)變?yōu)榭梢允褂?b>...擴(kuò)展運(yùn)算符的plain object。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/81026.html
摘要:不過(guò)今天我希望能夠更進(jìn)一步,不僅僅再抱怨現(xiàn)狀,而是從我個(gè)人的角度來(lái)給出一個(gè)逐步深入學(xué)習(xí)生態(tài)圈的方案。最后,我還是想提到下對(duì)于的好的學(xué)習(xí)方法就是回顧參照各種各樣的代碼庫(kù),學(xué)習(xí)人家的用法與實(shí)踐。 本文翻譯自A-Study-Plan-To-Cure-JavaScript-Fatigue。筆者看到里面的幾張配圖著實(shí)漂亮,順手翻譯了一波。本文從屬于筆者的Web Frontend Introduc...
摘要:對(duì)獲獎(jiǎng)隊(duì)伍,官方要求提交代碼,并邀請(qǐng)答辯。是否允許公開(kāi)代碼到公共平臺(tái),如答疑可以官方會(huì)出個(gè)嗎答疑會(huì)無(wú)法順利加入團(tuán)隊(duì)顯示密令有誤和操作頻繁答疑應(yīng)該是團(tuán)隊(duì)密令有誤,請(qǐng)注意大小寫。 1、由于公開(kāi)測(cè)試集,所以可以人工作答直接寫答案?;蛘邔㈩A(yù)測(cè)值中拿不準(zhǔn)的答案由人工來(lái)做。這是個(gè)漏洞,獲獎(jiǎng)隊(duì)伍是否會(huì)由官方進(jìn)行二次驗(yàn)證?答疑:會(huì)的。對(duì)獲獎(jiǎng)隊(duì)伍,官方要求提交代碼,并邀請(qǐng)答辯。最終的獲獎(jiǎng)名次將由模型表現(xiàn)...
摘要:目錄開(kāi)發(fā)環(huán)境調(diào)試分析環(huán)境搭建問(wèn)題描述及解答開(kāi)發(fā)環(huán)境調(diào)試分析下使用官方環(huán)境安裝包出現(xiàn)錯(cuò)誤。大部分情況下是因?yàn)榫W(wǎng)絡(luò)問(wèn)題下載錯(cuò)誤,具體錯(cuò)誤查看錯(cuò)誤。已存在虛擬環(huán)境,則需要?jiǎng)h掉重新安裝。 ...
摘要:一,前端性能優(yōu)化有哪些頁(yè)面優(yōu)化方面,減少請(qǐng)求數(shù)設(shè)計(jì)簡(jiǎn)化頁(yè)面合理設(shè)置緩存資源合并與壓縮圖片嵌入,將外部腳本置底,異步執(zhí)行腳本,,將外鏈放在中,異步請(qǐng)求,減少不必要的跳轉(zhuǎn),避免重復(fù)的資源請(qǐng)求代碼優(yōu)化方面,操作轉(zhuǎn)為數(shù)組 一,前端性能優(yōu)化有哪些? a) 頁(yè)面優(yōu)化方面: 1,減少HTTP請(qǐng)求數(shù)--設(shè)計(jì)簡(jiǎn)化頁(yè)面--合理設(shè)置緩存--資源合并與壓縮--css sprites--圖片嵌入--Lazy L...
摘要:一,前端性能優(yōu)化有哪些頁(yè)面優(yōu)化方面,減少請(qǐng)求數(shù)設(shè)計(jì)簡(jiǎn)化頁(yè)面合理設(shè)置緩存資源合并與壓縮圖片嵌入,將外部腳本置底,異步執(zhí)行腳本,,將外鏈放在中,異步請(qǐng)求,減少不必要的跳轉(zhuǎn),避免重復(fù)的資源請(qǐng)求代碼優(yōu)化方面,操作轉(zhuǎn)為數(shù)組 一,前端性能優(yōu)化有哪些? a) 頁(yè)面優(yōu)化方面: 1,減少HTTP請(qǐng)求數(shù)--設(shè)計(jì)簡(jiǎn)化頁(yè)面--合理設(shè)置緩存--資源合并與壓縮--css sprites--圖片嵌入--Lazy L...
閱讀 2958·2021-11-24 09:39
閱讀 2869·2021-09-29 09:34
閱讀 3560·2021-09-24 10:23
閱讀 1746·2021-09-22 15:41
閱讀 1701·2019-08-30 15:55
閱讀 3516·2019-08-30 13:58
閱讀 2624·2019-08-30 13:11
閱讀 1669·2019-08-29 12:31