react-redux之connect方法

connect簡介

react-redux僅有2個(gè)API,Provider和connect咧纠,Provider提供的是一個(gè)頂層容器的作用钝吮,實(shí)現(xiàn)store的上下文傳遞迷雪。

原理解析

首先connect之所以會(huì)成功载矿,是因?yàn)镻rovider組件:

在原應(yīng)用組件上包裹一層垄潮,使原來整個(gè)應(yīng)用成為Provider的子組件

接收Redux的store作為props,通過context對象傳遞給子孫組件上的connect

那connect做了些什么呢闷盔?

它真正連接 Redux 和 React魂挂,它包在我們的容器組件的外一層,它接收上面 Provider 提供的 store 里面的 state 和 dispatch馁筐,傳給一個(gè)構(gòu)造函數(shù),返回一個(gè)對象坠非,以屬性形式傳給我們的容器組件敏沉。

connect(mapStateToProps, mapDispatchToProps, mergeProps, options = {})

connect作用:連接React組件與 Redux store。

connect真正連接的是容器型組件,容器型組件主要關(guān)注業(yè)務(wù)邏輯的處理盟迟,比如從服務(wù)器拉取數(shù)據(jù)秋泳,進(jìn)行數(shù)據(jù)校驗(yàn)等,容器組件處理好的數(shù)據(jù)再通過props傳遞給需要使用的展示型組件攒菠,展示型組件是關(guān)注界面渲染的組件迫皱。

一個(gè)應(yīng)用(或頁面)中可以有多個(gè)容器型組件,這取決于你的業(yè)務(wù)邏輯復(fù)雜程度辖众,一般最外層的組件是會(huì)做為一個(gè)容器組件進(jìn)行connect(但這不是必須)卓起,當(dāng)你層級(jí)較低的組件中有較多業(yè)務(wù)邏輯需要處理時(shí),往往也會(huì)在它的上一層封裝一個(gè)容器組件專門處理這些邏輯凹炸,這時(shí)這個(gè)組件也是會(huì)被connect的戏阅。

使用 connect() 前,需要先定義 mapStateToProps 這個(gè)函數(shù)來指定如何把當(dāng)前 Redux store state 映射到展示組件的 props 中啤它。例如奕筐,VisibleTodoList 需要計(jì)算傳到 TodoList 中的 todos,所以定義了根據(jù) state.visibilityFilter 來過濾 state.todos 的方法变骡,并在 mapStateToProps 中使用离赫。

const getVisibleTodos = (todos, filter) => {
  switch (filter) {
    case 'SHOW_COMPLETED':
      return todos.filter(t => t.completed)
    case 'SHOW_ACTIVE':
      return todos.filter(t => !t.completed)
    case 'SHOW_ALL':
    default:
      return todos
  }
}

const mapStateToProps = state => {
  return {
    todos: getVisibleTodos(state.todos, state.visibilityFilter)
  }
}

除了讀取 state,容器組件還能分發(fā) action塌碌。類似的方式渊胸,可以定義 mapDispatchToProps() 方法接收 dispatch() 方法并返回期望注入到展示組件的 props 中的回調(diào)方法。例如誊爹,我們希望 VisibleTodoListTodoList 組件中注入一個(gè)叫 onTodoClick 的 props 蹬刷,還希望 onTodoClick 能分發(fā) TOGGLE_TODO 這個(gè) action:

const mapDispatchToProps = dispatch => {
  return {
    onTodoClick: id => {
      dispatch(toggleTodo(id))
    }
  }
}

最后,使用 connect() 創(chuàng)建 VisibleTodoList频丘,并傳入這兩個(gè)函數(shù)办成。

import { connect } from 'react-redux'

const VisibleTodoList = connect(
  mapStateToProps,
  mapDispatchToProps
)(TodoList)

export default VisibleTodoList

connect和@connect的區(qū)別

The @ symbol is in fact a JavaScript expression currently proposed to signify decorators:

Decorators make it possible to annotate and modify classes and properties at design time.

Here's an example of setting up Redux without and with a decorator:

Without a decorator

import React from 'react';
import * as actionCreators from './actionCreators';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';

function mapStateToProps(state) {
  return { todos: state.todos };
}

function mapDispatchToProps(dispatch) {
  return { actions: bindActionCreators(actionCreators, dispatch) };
}

class MyApp extends React.Component {
  // ...define your main app here
}

export default connect(mapStateToProps, mapDispatchToProps)(MyApp);

Using a decorator

import React from 'react';
import * as actionCreators from './actionCreators';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';

function mapStateToProps(state) {
  return { todos: state.todos };
}

function mapDispatchToProps(dispatch) {
  return { actions: bindActionCreators(actionCreators, dispatch) };
}

@connect(mapStateToProps, mapDispatchToProps)
export default class MyApp extends React.Component {
  // ...define your main app here
}

From What's the '@' (at symbol) in the Redux @connect decorator?

為什么我們需要react-redux?

熟悉redux的人可能知道搂漠,redux是數(shù)據(jù)存儲(chǔ)和管理的工具迂卢,但是想要在react中使用redux,并不能直接將store桐汤、action和react組件建立連接而克,所以就需要react-redux來結(jié)合react和redux。

Redux 的工作流程怔毛,Reducer 的拆分

從何處開始解析react-redux源碼员萍?

1、在JavaScript中拣度,讀懂別人的代碼文件碎绎,你首先應(yīng)該看的是函數(shù)的入口螃壤。

2、找到函數(shù)入口筋帖,然后看有哪些參數(shù)奸晴。

3、看看導(dǎo)入了哪些額外的插件日麸,每個(gè)插件的作用大概預(yù)測一下寄啼。

4、進(jìn)入函數(shù)體進(jìn)行解讀代箭。

如何發(fā)送網(wǎng)絡(luò)請求

當(dāng)我們需要從服務(wù)器獲取數(shù)據(jù)時(shí)墩划,我們應(yīng)該在組件的哪一個(gè)生命周期方法中發(fā)送網(wǎng)絡(luò)請求呢?React官網(wǎng)上提到梢卸,可以在componentDidMount中發(fā)送網(wǎng)絡(luò)請求走诞,這也是一般情況下的最佳實(shí)踐。有些人也會(huì)把發(fā)送網(wǎng)絡(luò)請求放在componentWillMount中蛤高,并且認(rèn)為這個(gè)方法先于componentDidMount調(diào)用蚣旱,所以可以更快地獲取數(shù)據(jù)。個(gè)人認(rèn)為戴陡,這種使用方法一般也是沒有問題的塞绿,但在一些場景下會(huì)出現(xiàn)問題,比如需要在服務(wù)器端渲染時(shí)恤批,componentWillMount會(huì)被調(diào)用兩次异吻,一次是在Server端,一次是在Client端喜庞【骼耍可參考這篇文章

詳見

  1. React系列——react-redux之connect方法解析
  2. 用好React延都,你必須要知道的事情
  3. 關(guān)于react-redux中的connect用法介紹及原理解析
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雷猪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子晰房,更是在濱河造成了極大的恐慌求摇,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殊者,死亡現(xiàn)場離奇詭異与境,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)猖吴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門摔刁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人海蔽,你說我怎么就攤上這事簸搞”馕唬” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵趁俊,是天一觀的道長。 經(jīng)常有香客問我刑然,道長寺擂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任泼掠,我火速辦了婚禮怔软,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘择镇。我一直安慰自己挡逼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布腻豌。 她就那樣靜靜地躺著家坎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吝梅。 梳的紋絲不亂的頭發(fā)上虱疏,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音苏携,去河邊找鬼做瞪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛右冻,可吹牛的內(nèi)容都是我干的装蓬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼纱扭,長吁一口氣:“原來是場噩夢啊……” “哼牍帚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跪但,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對情侶失蹤履羞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后屡久,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忆首,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年被环,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糙及。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筛欢,死狀恐怖浸锨,靈堂內(nèi)的尸體忽然破棺而出唇聘,到底是詐尸還是另有隱情,我是刑警寧澤柱搜,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布迟郎,位于F島的核電站,受9級(jí)特大地震影響聪蘸,放射性物質(zhì)發(fā)生泄漏宪肖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一健爬、第九天 我趴在偏房一處隱蔽的房頂上張望控乾。 院中可真熱鬧,春花似錦娜遵、人聲如沸蜕衡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慨仿。三九已至,卻和暖如春蒜绽,著一層夾襖步出監(jiān)牢的瞬間镶骗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國打工躲雅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鼎姊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓相赁,卻偏偏與公主長得像相寇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子钮科,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容