首頁 web前端 js教程 在React和Redux中有關連接react-redux(詳細教學)

在React和Redux中有關連接react-redux(詳細教學)

Jun 22, 2018 pm 05:39 PM
react redux

這篇文章主要介紹了淺談React和Redux的連接react-redux,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

之前一直在探索React相關的東西,手上有個SPA項目,於是準備上Redux試試水。 Redux本身和React並沒有之間的關聯,它是一個通用Javscript App模組,用做App State的管理。要在React的專案中使用Redux,比較好的方式是藉助react-redux這個函式庫來做連接,這裡的意思是,並不是沒有react-redux,這兩個函式庫就不弄一起用了,而是說react-redux提供了一些封裝,一種更科學的程式碼組織方式,讓我們更舒服地在React的程式碼中使用Redux。

之前僅透過Redux文件來了解react-redux,在一段時間的實踐後準備翻一翻原始碼,順便做些相關的總結。我看的程式碼的npm版本為v4.0.0,也就是說使用的React版本是0.14.x。

react-redux提供兩個關鍵模組:Provider和connect。

Provider

Provider這個模組是作為整個App的容器,在你原有的App Container的基礎上再包上一層,它的工作很簡單,就是接受Redux的store作為props,並將其聲明為context的屬性之一,子元件可以在聲明了contextTypes之後可以方便的透過this.context.store存取到store。不過我們的組件通常不需要這麼做,將store放在context裡,是為了給下面的connect用的。

這個是Provider的使用範例:

// config app root
const history = createHistory()
const root = (
 <Provider store={store} key="provider">
  <Router history={history} routes={routes} />
 </Provider>
)

// render
ReactDOM.render(
 root,
 document.getElementById(&#39;root&#39;)
)
登入後複製

connect

這個模組是算是真正意義上連接了Redux和React,剛好它的名字也叫connect。

先考慮Redux是怎麼運作的:首先store維護了一個state,我們dispatch一個action,接下來reducer根據這個action更新state。

對應到我們的React應用程式中,store中維護的state就是我們的app state,一個React元件作為View層,做兩件事:render和回應使用者操作。於是connect就是將store中的必要資料當作props傳遞給React元件來render,包裝action creator用於在回應使用者操作時dispatch一個action。

好了,詳細看看connect這個模組做了什麼。先從它的使用來說,它的API如下:

connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])
登入後複製

mapStateToProps是一個函數,回傳值表示的是需要merge進props的state。預設值為() => ({}),即什麼都不傳。

(state, props) => ({ }) // 通常会省略第二个参数
登入後複製

mapDispatchToProps是可以是一個函數,回傳值表示的是需要merge僅props的actionCreators,這裡的actionCreator應該是已經被包裝了dispatch了的,推薦使用redux的bindActionCreators函數。

(dispatch, props) => ({ // 通常会省略第二个参数
 ...bindActionCreators({
  ...ResourceActions
 }, dispatch)
})
登入後複製

更方便的是可以直接接受一個對象,此時connect函數內部會將其轉變為函數,這個函數和上面那個例子是一模一樣的。

mergeProps用於自訂merge流程,下面這個是預設流程,parentProps值的就是元件本身的props,可以發現如果元件的props上出現同名,會被覆寫。

(stateProps, dispatchProps, parentProps) => ({
 ...parentProps,
 ...stateProps,
 ...dispatchProps
})
登入後複製

options共有兩個開關:pure代表是否打開優化,詳細內容下面會提,預設為true,withRef用來給包裝在裡面的組件一個ref,可以透過getWrappedInstance方法來取得這個ref,預設為false。

connect傳回一個函數,它接受一個React元件的建構函數作為連接對象,最後傳回連接好的元件建構函數。

然後幾個問題:

  1. React元件如何回應store的變化?

  2. 為什麼connect選擇性的merge一些props,而不是直接將整個state傳入?

  3. pure優化的是什麼?

我們把connect回傳的函數叫做Connector,它回傳的是內部的一個叫Connect的元件,它在包裝原有元件的基礎上,還在內部監聽了Redux的store的變化,為了讓被它包裝的組件可以響應store的變化:

trySubscribe() {
 if (shouldSubscribe && !this.unsubscribe) {
  this.unsubscribe = this.store.subscribe(::this.handleChange)
  this.handleChange()
 }
}

handleChange () {
 this.setState({
  storeState: this.store.getState()
 })
}
登入後複製

但是通常,我們connect的是某個Container組件,它並不承載所有App state,然而我們的handler是響應所有state變化的,所以我們需要優化的是:當storeState變化的時候,只有在我們真正依賴那部分state變化時,才重新render對應的React元件,那麼什麼才是我們真正依賴的部分?就是透過mapStateToProps和mapDispatchToProps得到的。

具體優化的方式就是在shouldComponentUpdate中做檢查,如果只有在元件本身的props改變,或是mapStateToProps的結果改變,或是mapDispatchToProps的結果改變時shouldComponentUpdate才會回傳true,檢查的方式是shallowEqual的比較。

所以對某個reducer來說:

export default (state = {}, action) => {
 return { ...state } // 返回的是一个新的对象,可能会使组件reRender
 // return state // 可能不会使得组件reRender
}
登入後複製

另外在connect的時候,要謹慎map真正需要的state或actionCreators到props中,以避免不必要的效能損失。

最後,根據connect的API我們發現可以使用ES7 decorator功能來配合React ES6的寫法:

@connect(
 state => ({
  user: state.user,
  resource: state.resource
 }),
 dispatch => ({
  ...bindActionCreators({
   loadResource: ResourceActions.load
  }, dispatch)
 })
)
export default class Main extends Component {

}
登入後複製

上面是我整理給大家的,希望今後會對大家有幫助。

相關文章:

有關JS排序演算法總結

使用JS canvas如何製作圓錐

在vue-router中如何實現路由懶載入

在Angular2中如何實作斷點偵錯ts檔案

如何實作網頁快報向上捲動

##在vue中有關資料夾結構配置

以上是在React和Redux中有關連接react-redux(詳細教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1273
29
C# 教程
1252
24
如何利用React和RabbitMQ建立可靠的訊息應用 如何利用React和RabbitMQ建立可靠的訊息應用 Sep 28, 2023 pm 08:24 PM

如何利用React和RabbitMQ建立可靠的訊息傳遞應用程式引言:現代化的應用程式需要支援可靠的訊息傳遞,以實現即時更新和資料同步等功能。 React是一種流行的JavaScript庫,用於建立使用者介面,而RabbitMQ是一種可靠的訊息傳遞中間件。本文將介紹如何結合React和RabbitMQ建立可靠的訊息傳遞應用,並提供具體的程式碼範例。 RabbitMQ概述:

React Router使用指南:如何實現前端路由控制 React Router使用指南:如何實現前端路由控制 Sep 29, 2023 pm 05:45 PM

ReactRouter使用指南:如何實現前端路由控制隨著單頁應用的流行,前端路由成為了一個不可忽視的重要部分。 ReactRouter作為React生態系統中最受歡迎的路由庫,提供了豐富的功能和易用的API,使得前端路由的實作變得非常簡單和靈活。本文將介紹ReactRouter的使用方法,並提供一些具體的程式碼範例。安裝ReactRouter首先,我們需要

PHP、Vue和React:如何選擇最適合的前端框架? PHP、Vue和React:如何選擇最適合的前端框架? Mar 15, 2024 pm 05:48 PM

PHP、Vue和React:如何選擇最適合的前端框架?隨著互聯網技術的不斷發展,前端框架在Web開發中起著至關重要的作用。 PHP、Vue和React作為三種代表性的前端框架,每一種都具有其獨特的特徵和優勢。在選擇使用哪種前端框架時,開發人員需要根據專案需求、團隊技能和個人偏好做出明智的決策。本文將透過比較PHP、Vue和React這三種前端框架的特徵和使

Java框架與前端React框架的整合 Java框架與前端React框架的整合 Jun 01, 2024 pm 03:16 PM

Java框架與React框架的整合:步驟:設定後端Java框架。建立專案結構。配置建置工具。建立React應用程式。編寫RESTAPI端點。配置通訊機制。實戰案例(SpringBoot+React):Java程式碼:定義RESTfulAPI控制器。 React程式碼:取得並顯示API回傳的資料。

如何利用React開發一個響應式的後台管理系統 如何利用React開發一個響應式的後台管理系統 Sep 28, 2023 pm 04:55 PM

如何利用React開發一個響應式的後台管理系統隨著互聯網的快速發展,越來越多的企業和組織需要一個高效、靈活、易於管理的後台管理系統來處理日常的操作事務。 React作為目前最受歡迎的JavaScript庫之一,提供了一種簡潔、高效和可維護的方式來建立使用者介面。本文將介紹如何利用React開發一個響應式的後台管理系統,並給出具體的程式碼範例。建立React專案首先

vue.js vs.反應:特定於項目的考慮因素 vue.js vs.反應:特定於項目的考慮因素 Apr 09, 2025 am 12:01 AM

Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

React在HTML中的作用:增強用戶體驗 React在HTML中的作用:增強用戶體驗 Apr 09, 2025 am 12:11 AM

React通過JSX與HTML結合,提升用戶體驗。 1)JSX嵌入HTML,使開發更直觀。 2)虛擬DOM機制優化性能,減少DOM操作。 3)組件化管理UI,提高可維護性。 4)狀態管理和事件處理增強交互性。

react有哪些閉包 react有哪些閉包 Oct 27, 2023 pm 03:11 PM

react有事件處理函數、useEffect和useCallback、高階元件等等閉包。詳細介紹:1、事件處理函數閉包:在React中,當我們在元件中定義事件處理函數時,函數會形成一個閉包,可以存取元件作用域內的狀態和屬性。這樣可以在事件處理函數中使用元件的狀態和屬性,實現互動邏輯;2、useEffect和useCallback中的閉包等等。

See all articles