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