<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        詳解關(guān)于react-redux中的connect用法介紹及原理解析

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:30:26
        文檔

        詳解關(guān)于react-redux中的connect用法介紹及原理解析

        詳解關(guān)于react-redux中的connect用法介紹及原理解析:關(guān)于react-redux的一個(gè)流程圖 流程圖 connect用法介紹 connect方法聲明: connect([mapStateToProps], [mapDispatchToProps], [mergeProps],[options]) 作用:連接React組件與 Redux store。 參數(shù)說明: mapStateToP
        推薦度:
        導(dǎo)讀詳解關(guān)于react-redux中的connect用法介紹及原理解析:關(guān)于react-redux的一個(gè)流程圖 流程圖 connect用法介紹 connect方法聲明: connect([mapStateToProps], [mapDispatchToProps], [mergeProps],[options]) 作用:連接React組件與 Redux store。 參數(shù)說明: mapStateToP

        關(guān)于react-redux的一個(gè)流程圖

        流程圖

        connect用法介紹

        connect方法聲明:

        connect([mapStateToProps], [mapDispatchToProps], [mergeProps],[options])

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

        參數(shù)說明:

        mapStateToProps(state, ownProps) : stateProps

        這個(gè)函數(shù)允許我們將 store 中的數(shù)據(jù)作為 props 綁定到組件上。

        const mapStateToProps = (state) => {
         return {
         count: state.count
         }
        }

        (1)這個(gè)函數(shù)的第一個(gè)參數(shù)就是 Redux 的 store,我們從中摘取了 count 屬性。你不必將 state 中的數(shù)據(jù)原封不動(dòng)地傳入組件,可以根據(jù) state 中的數(shù)據(jù),動(dòng)態(tài)地輸出組件需要的(最?。傩?。

        (2)函數(shù)的第二個(gè)參數(shù) ownProps,是組件自己的 props。有的時(shí)候,ownProps 也會(huì)對其產(chǎn)生影響。

        當(dāng) state 變化,或者 ownProps 變化的時(shí)候,mapStateToProps 都會(huì)被調(diào)用,計(jì)算出一個(gè)新的 stateProps,(在與 ownProps merge 后)更新給組件。

        mapDispatchToProps(dispatch, ownProps): dispatchProps

        connect 的第二個(gè)參數(shù)是 mapDispatchToProps,它的功能是,將 action 作為 props 綁定到組件上,也會(huì)成為 MyComp 的 props。

        [mergeProps],[options]

        不管是 stateProps 還是 dispatchProps,都需要和 ownProps merge 之后才會(huì)被賦給組件。connect 的第三個(gè)參數(shù)就是用來做這件事。通常情況下,你可以不傳這個(gè)參數(shù),connect 就會(huì)使用 Object.assign 替代該方法。

        [options] (Object) 如果指定這個(gè)參數(shù),可以定制 connector 的行為。一般不用。

        原理解析

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

        1. 在原應(yīng)用組件上包裹一層,使原來整個(gè)應(yīng)用成為Provider的子組件
        2. 接收Redux的store作為props,通過context對象傳遞給子孫組件上的connect

        那connect做了些什么呢?

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

        關(guān)于它的源碼

        connect是一個(gè)高階函數(shù),首先傳入mapStateToProps、mapDispatchToProps,然后返回一個(gè)生產(chǎn)Component的函數(shù)(wrapWithConnect),然后再將真正的Component作為參數(shù)傳入wrapWithConnect,這樣就生產(chǎn)出一個(gè)經(jīng)過包裹的Connect組件,該組件具有如下特點(diǎn):

        1. 通過props.store獲取祖先Component的store
        2. props包括stateProps、dispatchProps、parentProps,合并在一起得到nextState,作為props傳給真正的Component
        3. componentDidMount時(shí),添加事件this.store.subscribe(this.handleChange),實(shí)現(xiàn)頁面交互
        4. shouldComponentUpdate時(shí)判斷是否有避免進(jìn)行渲染,提升頁面性能,并得到nextState
        5. componentWillUnmount時(shí)移除注冊的事件this.handleChange

        由于connect的源碼過長,我們只看主要邏輯:

        export default function connect(mapStateToProps, mapDispatchToProps, mergeProps, options = {}) {
         return function wrapWithConnect(WrappedComponent) {
         class Connect extends Component {
         constructor(props, context) {
         // 從祖先Component處獲得store
         this.store = props.store || context.store
         this.stateProps = computeStateProps(this.store, props)
         this.dispatchProps = computeDispatchProps(this.store, props)
         this.state = { storeState: null }
         // 對stateProps、dispatchProps、parentProps進(jìn)行合并
         this.updateState()
         }
         shouldComponentUpdate(nextProps, nextState) {
         // 進(jìn)行判斷,當(dāng)數(shù)據(jù)發(fā)生改變時(shí),Component重新渲染
         if (propsChanged || mapStateProducedChange || dispatchPropsChanged) {
         this.updateState(nextProps)
         return true
         }
         }
         componentDidMount() {
         // 改變Component的state
         this.store.subscribe(() = {
         this.setState({
         storeState: this.store.getState()
         })
         })
         }
         render() {
         // 生成包裹組件Connect
         return (
         <WrappedComponent {...this.nextState} />
         )
         }
         }
         Connect.contextTypes = {
         store: storeShape
         }
         return Connect;
         }
         }
        

        connect使用實(shí)例

        這里我們寫一個(gè)關(guān)于計(jì)數(shù)器使用的實(shí)例:

        Component/Counter.js

        import React, {Component} from 'react'
        
        class Counter extends Component {
         render() {
         //從組件的props屬性中導(dǎo)入四個(gè)方法和一個(gè)變量
         const {increment, decrement, counter} = this.props;
         //渲染組件,包括一個(gè)數(shù)字,四個(gè)按鈕
         return (
         <p>
         Clicked: {counter} times
         {' '}
         <button onClick={increment}>+</button>
         {' '}
         <button onClick={decrement}>-</button>
         {' '}
         </p>
         )
         }
        }
        
        export default Counter;
        
        

        Container/App.js

        import { connect } from 'react-redux'
        import Counter from '../components/Counter'
        import actions from '../actions/counter';
        
        //將state.counter綁定到props的counter
        const mapStateToProps = (state) => {
         return {
         counter: state.counter
         }
        };
        //將action的所有方法綁定到props上
        const mapDispatchToProps = (dispatch, ownProps) => {
         return {
         increment: (...args) => dispatch(actions.increment(...args)),
         decrement: (...args) => dispatch(actions.decrement(...args))
         }
        };
        
        //通過react-redux提供的connect方法將我們需要的state中的數(shù)據(jù)和actions中的方法綁定到props上
        export default connect(mapStateToProps, mapDispatchToProps)(Counter)
        
        

        完整代碼

        Github:https://github.com/lipeishang/react-redux-connect-demo

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        詳解關(guān)于react-redux中的connect用法介紹及原理解析

        詳解關(guān)于react-redux中的connect用法介紹及原理解析:關(guān)于react-redux的一個(gè)流程圖 流程圖 connect用法介紹 connect方法聲明: connect([mapStateToProps], [mapDispatchToProps], [mergeProps],[options]) 作用:連接React組件與 Redux store。 參數(shù)說明: mapStateToP
        推薦度:
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 91嫩草免费国产永久入口| 丝瓜app免费下载网址进入ios| 中文字幕免费在线| 亚洲AV无码乱码国产麻豆穿越 | 免费看国产一级特黄aa大片| 亚洲一区二区三区成人网站| 成年人性生活免费视频| 97久久国产亚洲精品超碰热| 久久久www成人免费毛片| 亚洲а∨天堂久久精品9966 | 97人伦色伦成人免费视频| 最新国产成人亚洲精品影院| 麻豆国产人免费人成免费视频| 亚洲人成电影网站色| 免费人成在线观看网站视频| 亚洲日韩在线观看免费视频| 国产亚洲人成无码网在线观看| 久久久久久AV无码免费网站| 亚洲国产中文在线视频| 暖暖日本免费在线视频| 一级女性全黄久久生活片免费| 亚洲第一AAAAA片| 亚洲成人免费网址| 亚洲AV噜噜一区二区三区| 亚洲精品综合久久| 色欲色香天天天综合网站免费| 亚洲五月综合网色九月色| 又爽又高潮的BB视频免费看| 日韩电影免费观看| 亚洲日韩国产精品乱-久| 免费一级毛片在级播放| 精品四虎免费观看国产高清午夜 | 亚洲国产V高清在线观看| 久久www免费人成精品香蕉| 亚洲精品免费在线观看| 免费无码精品黄AV电影| 一区二区在线免费视频| 亚洲综合色丁香麻豆| 又黄又爽一线毛片免费观看| 久久一本岛在免费线观看2020| 在线亚洲高清揄拍自拍一品区|