React生命周期事件

了解React生命周期事件及如何使用它們。 React類組件可以綁定幾個生命周期事件。 鉤子(Hooks)也允許函數組件以不同的方式訪問它們。 在組件的生命周期中,有一系列的事件被調用,你可以在每個事件上添加自定義功能。 在哪個生命周期事件上添加哪個鉤子是我們接下來要研究的內容。 首先,React組件的生命周期有3個階段: 加載 更新 卸載 讓我們詳細看一下這3個階段以及每個階段調用的方法。 加載 在加載時,在組件被加載到DOM之前,有4個生命周期方法:constructor、getDerivedStateFromProps、render和componentDidMount。 constructor constructor是組件加載時第一個呼叫的方法。 通常你使用constructor來設置初始狀態,使用this.state = ...。 getDerivedStateFromProps() 當狀態依賴於屬性時,可以使用getDerivedStateFromProps根據屬性值更新狀態。 它在React 16.3中添加,旨在代替被棄用的componentWillReceiveProps方法。 在這個方法中,你沒有訪問this,因為它是一個靜態方法。 它是一個純方法,所以它不應該引起副作用,並且在使用相同輸入多次呼叫時應該返回相同的輸出。 返回帶有更新後的狀態元素的對象(如果狀態未更改則為null) render() 從render()方法中,你返回構建該組件界面的JSX。 它是一個純方法,所以它不應該引起副作用,並且在使用相同輸入多次呼叫時應該返回相同的輸出。 componentDidMount() 這個方法是用於執行API調用或在DOM上進行操作的地方。 更新 當更新時,在組件被加載到DOM之前,有5個生命周期方法:getDerivedStateFromProps、shouldComponentUpdate、render、getSnapshotBeforeUpdate和componentDidUpdate。 getDerivedStateFromProps() 參見上述描述。 shouldComponentUpdate() 此方法返回一個布林值,true或false。你使用這個方法告訴React是否應該繼續重新渲染,默認為true。在重新渲染的成本較高且你希望更控制何時發生重新渲染時,你會返回false。 render() 參見上述描述。 getSnapshotBeforeUpdate() 在這個方法中,你可以訪問上一次渲染和當前渲染的props和state。 它的使用案例非常特殊,可能是你使用最少的一個。 componentDidUpdate() 此方法在組件在DOM中更新後呼叫。使用它來運行任何第三方DOM API或在DOM更改時必須更新的API。 它對應於加載階段的componentDidMount()方法。 卸載 在此階段,我們只有一個方法,componentWillUnmount。 componentWillUnmount() 當組件從DOM中被刪除時,調用此方法。使用它來執行任何所需的清理工作。 舊版 如果你正在開發一個使用了componentWillMount、componentWillReceiveProps或componentWillUpdate的應用程序,這些方法在React 16.3中已被棄用,你應該遷移到其他生命周期方法。

React高階元件

了解什麼是高階元件,以及在開發React應用程式時它們的用途。 你可能對JavaScript中的高階函式已經很熟悉了。這是指接受函式作為參數和/或回傳函式的函式。 兩個範例是Array.map()和Array.filter()。 在React中,我們將此概念擴展到元件,因此我們有了高階元件(HOC),當元件接受元件作為輸入並將元件作為輸出時。 一般來說,高階元件可以讓你創建可組合和可重用的程式碼,並提供更好的封裝性。 我們可以使用高階元件來向元件的狀態或屬性添加方法或屬性,例如Redux儲存。 當你想要增強現有元件、操作狀態或屬性,或者操作它的渲染標記時,你可能會想要使用高階元件。 通常,在高階元件前面加上with字串是一個常見的慣例(這只是一個慣例,並不是強制性的),所以如果你有一個Button元件,它的高階元件對應名稱應該叫作withButton。 讓我們創建一個高階元件。 最簡單的高階元件範例就是不做任何改變地返回元件: const withElement = Element => () => <Element /> 讓我們增加點有用性,將一個額外的屬性(顏色)加到此元素上,除了它原本就有的所有屬性: const withColor = Element => props => <Element {...props} color="red" /> 然後,在元件的JSX中使用這個高階元件: const Button = () => { return <button>test</button> } const ColoredButton = withColor(Button) 最後,在我們應用程式的JSX中渲染包裝後的按鈕元件: function App() { return ( <div className="App"> <h1>Hello</h1> <ColoredButton /> </div> ) } 雖然這只是一個非常簡單的範例,但希望你能掌握高階元件的概念,並將這些概念應用於更複雜的情境中。

React概念:不變性

什麼是不變性?它在React世界中扮演怎樣的角色? 在React編程中,你可能會遇到的一個概念就是不變性(和其反面,可變性)。 不管你對不變性的概念有什麼看法,React及其大部分生態系統基本上都強制了這一點,所以你至少需要了解為什麼它如此重要以及它的影響。 在編程中,當變量的值在創建後無法更改時,該變量就是不可變的。 當你操作字符串時,你可能已經在不知不覺中使用了不可變變量。字符串在默認情況下是不可變的,當你改變它們時,實際上是創建了一個新的字符串並將其賦值給同一個變量名。 不可變變量永遠無法更改。要更新其值,你需要創建一個新的變量。 對於對象和數組也是同樣的道理。 要添加新項目,你可以創建一個新的數組,通過連接舊數組和新項目。 在更改對象之前,需要先將其複製。 這個原則在React中有很多應用。 例如,你不應該直接變異組件的state屬性,而是應該通過setState()方法來變更。 在Redux中,你不應該直接變異狀態,而是通過reducer函數來變更。 那麼,為什麼要這樣做呢? 其原因有很多,其中最重要的是: 變異可以集中管理,例如在Redux中,這樣可以提高調試能力並減少錯誤源。 代碼看起來更整潔,更容易理解。你不會預期一個函數在沒有你知曉的情況下改變某個值,這給你帶來了可預測性。當函數不變異對象而只返回一個新對象時,稱為純函數。 函數庫可以對代碼進行優化,例如,JavaScript在將一個舊的對象引用替換為一個全新的對象時,比直接修改現有對象更快。這提升了性能。

React概念:純度

純度是什麼,純函數和純組件是什麼 在JavaScript中,如果一個函數不改變對象,而只是返回一個新的對象,則稱為純函數。 一個函數,或者一個方法,要被稱為純,不能引起副作用,在使用相同的輸入多次調用時應該返回相同的輸出。 純函數接收輸入並返回輸出,不改變輸入或其他任何東西。 它的輸出僅由參數決定。你可以對這個函數調用100萬次,並給定相同的參數,輸出始終是相同的。 React將這個概念應用到組件上。當組件的輸出僅依賴於它的props時,它被稱為純組件。 所有的函數組件都是純組件: const Button = props => { return <button>{props.message}</button> } 如果類組件的輸出僅依賴於props,它也可以是純組件: class Button extends React.Component { render() { return <button>{this.props.message}</button> } }

React概念:組合

什麼是組合,為什麼它是React應用中的關鍵概念? 在程式設計中,組合允許您通過結合小而專注的函數來構建更複雜的功能。 例如,想象使用map()從初始數組創建新的數組,然後使用filter()過濾結果: const list = ['Apple', 'Orange', 'Egg'] list.map(item => item[0]).filter(item => item === 'A') //'A' 在React中,組合使您能夠享受一些很棒的優勢。 您可以創建小而精簡的組件,並使用它們來組合更多的功能。該怎麼做呢? 創建組件的專用版本 使用外部組件來擴展和專門化一個更通用的組件: const Button = props => { return <button>{props.text}</button> } const SubmitButton = () => { return <Button text="Submit" /> } const LoginButton = () => { return <Button text="Login" /> } 將方法作為props傳遞 組件可以專注於跟蹤點擊事件,例如,當點擊事件發生時,實際發生的事情由容器組件決定: const Button = props => { return <button onClick={props.onClickHandler}>{props.text}</button> } const LoginButton = props => { return <Button text="Login" onClickHandler={props....

React概念:聲明性

當你讀到React是一種聲明性的方法來構建用戶界面時,這是什麼意思? 你會遇到一些文章描述React是一種聲明性的方法來構建用戶界面。 React以其聲明性方法讓它在前端世界中變得非常流行且顯著。 這並不是一個新的概念,但React在構建用戶界面方面比HTML模板更具聲明性: 你可以構建Web界面,而無需直接操作DOM 你可以擁有一個事件系統,而無需與實際的DOM事件交互。 聲明性的相對概念是命令式。命令式的一個常見例子是使用jQuery或DOM事件在DOM中查找元素。你告訴瀏覽器要做什麼,而不是告訴它你需要什麼。 React的聲明性方法抽象了這一點。我們只告訴React我們要以特定方式渲染一個組件,我們永遠不需要與DOM交互以後引用它。

React嚴格模式

React嚴格模式是什麼,如何使用 您可以使用內建的React.StrictMode組件來啟用React執行的一組檢查並提醒您相關問題。 一種簡單的方法是在index.js文件中將整個App組件包裹在<React.StrictMode></React.StrictMode>中: import React from 'react' import ReactDOM from 'react-dom' ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ) 您還可以通過包裹一個或多個組件使用它: import React from 'react' class Hello extends React.Component { render() { return ( <div> <React.StrictMode> ... </React.StrictMode> </div> ) } } 這個組件的主要用例之一是作為一個自動化的最佳實踐、潛在問題和過時檢查。 它不能捕獲所有問題,但在這裡有很多有用的檢查,可以幫助您解決一些簡單的問題。 React StrictMode在2018年3月的React 16.3中引入,對生產環境沒有任何影響,所以您可以始終將組件留在代碼庫中。在開發中使用它會在瀏覽器的JavaScript控制台中打印有用的警告信息。

Redis 列表

列表是一組相互關聯的鍵-值對。 LPUSH 和 RPUSH 是用於操作列表的兩個命令。 你可以使用命令 LPUSH <listkey> <value> 創建第一個項目。 例如: LPUSH names "Flavio" 然後後續項目可以添加到列表的底部:RPUSH <listkey> <value>,或者使用 LPUSH <listkey> <value> 添加到列表的頂部。 例如: LPUSH names "Flavio" LPUSH names "Syd" RPUSH names "Roger" 你可以將重複的值添加到列表中。 LPUSH names "Flavio" LPUSH names "Flavio" RPUSH names "Flavio" 列表可以容納大量的項目,超過 40 億個。 使用 LLEN <listkey> 命令計算列表中的項目數量。 使用 RPOP <listkey> 來獲取並移除列表的最後一個項目。使用 LPOP 命令可以獲取並移除列表的第一個項目。 使用 LREM 命令可以從列表中一次刪除多個項目。 你可以使用 LTRIM 命令來限制列表的長度。 LTRIM names 0 1 會將列表剪裁為僅有 2 個項目,位置 0(第一個項目)和位置 1 的項目。...

Redis 發布/訂閱

Redis實現了一個發布/訂閱的消息機制。 它的概念很簡單:發布者在一個頻道上發送消息,多個訂閱者接收它。 使用以下命令訂閱一個頻道: SUBSCRIBE <channel> 使用以下命令發布到一個頻道: PUBLISH <channel> <message> 例如: SUBSCRIBE dogs 在另一個redis-cli窗口中,輸入: PUBLISH dogs "Roger" 消息將被發送給訂閱者,它們默認顯示事件類型、頻道和消息的內容: 訂閱者可以聽取多個頻道: SUBSCRIBE dogs cats 並將接收來自所有頻道的消息。

redis-sorted-lists

#如何使用Redis排序列表 排序集將每個項目與一個排名關聯起來。 排序集的工作方式與集合類似,它們使用類似的命令,只是將S替換為Z,例如: SADD -> ZADD SPOP -> ZPOP 但它們略有不同。 ZADD接受一個分數: ZADD names 1 "Flavio" ZADD names 2 "Syd" ZADD names 2 "Roger" 如您所見,值仍然必須是唯一的,但現在它們與一個分數相關聯。 分數不必唯一。 集合中的項目始終按照分數排序。 這對於實現某種數據存儲工具非常有用,例如(常見示例)排行榜,或者用時間戳表示某個項目的添加時間。 您可以使用ZRANK獲取項目的分數: ZRANK names "Flavio" 使用ZRANGE列出排序集中的所有項目,其工作方式與列表中的LRANGE類似: ZRANGE names 0 -1 將WITHSCORES添加到還可返回分數信息: 您可以使用ZINCRBY將集合中的項目的分數增加。 在此處查看所有排序集命令這裡。