摘要:基本流程組件只接受數(shù)據(jù)包括出來的數(shù)據(jù)以及方法容器組件通過將返回的作為傳入通過將作為傳入通過方法將這兩個方法與組件連接起來返回一個容器組件組件將所有組件分成兩大類組件和容器組件組件有以下幾個特征只負責的呈現(xiàn)不帶有任何業(yè)務(wù)邏輯沒有狀態(tài)即不
基本流程
1.UI組件Example,只接受this.props數(shù)據(jù),包括reducer出來的數(shù)據(jù)state,
以及dispatch方法.
2.容器組件
const store = createStore(reducer);
通過mapStateToProps將reducer返回的state作為this.props傳入.
通過mapDispatchToProps將action作為this.props傳入.
通過connect方法將這兩個方法與Example組件連接起來,返回一個容器組件.
import React, { Component } from "react"; import { render } from "react-dom"; import { createStore } from "redux"; import { Provider, connect } from "react-redux"; import reducer from "../reducers/reducer6.js"; import { addAction, delAction } from "../actions/action2.js"; import Example from "../components/Example5.js"; const store = createStore(reducer); function mapStateToProps(state) { return { count: state.count }; } function mapDispatchToprops(dispatch) { return { add: () => dispatch(addAction()), del: () => dispatch(delAction()) }; } const App = connect(mapStateToProps, mapDispatchToprops)(Example) render(, document.getElementById("root") );
import React, { Component } from "react"; class Example extends Component { render() { const { count, add, del } = this.props; return (UI組件); } } export default Example;count: { count }
1.React-Redux將所有組件分成兩大類:UI組件和容器組件.
2.UI組件有以下幾個特征:
import React, { Component } from "react"; class Counter extends Component { render() { const { value, onIncreaseClick } = this.props; return ({ value }); } } export default Counter;
1.只負責UI的呈現(xiàn),不帶有任何業(yè)務(wù)邏輯 2.沒有狀態(tài)(即不使用this.state這個變量) 3.所有數(shù)據(jù)都由參數(shù)(this.props)提供 4.不適用任何redux的API
因為不含有狀態(tài),UI組件又被稱為"純組件",即它跟純函數(shù)一樣,純粹由參數(shù)決定它的值.
容器組件// Action const increaseAction = { type: "increase" }; // Reducer function counter(state = { count: 0 }, action) { const count = state.count; switch (action.type) { case "increase": return { count: count + 1 } default: return state; } } // Store const store = createStore(counter); // Map Redux state to component props function mapStateToProps(state) { return { value: state.count }; } // Map Redux actions to component props function mapDispatchToProps(dispatch) { return { onIncreaseClick: () => dispatch(increaseAction) }; } // Connected Component const App = connect(mapStateToProps, mapDispatchToProps)(Counter);
容器組件的特征恰恰相反
1.負責管理數(shù)據(jù)和業(yè)務(wù)邏輯,不負責UI的呈現(xiàn) 2.帶有內(nèi)部狀態(tài) 3.使用redux的API
UI組件負責UI的呈現(xiàn),容器組件負責管理數(shù)據(jù)和邏輯.
react-redux規(guī)定,所有的UI組件都由用戶提供,容器組件則是由react-redux自動生成,也就是說,
用戶負責視覺層,狀態(tài)管理則是全部交給它.
react-redux提供connect方法,用于從UI組件生成容器組件.
connect的意思,就是將這兩種組件連起來.
const App = connect(mapStateToProps, mapDispatchToProps)(Counter);
Counter是UI組件,App就是由React-Redux通過connect方法自動生成的容器組件.
但是,因為沒有定義業(yè)務(wù)邏輯,上面這個容器組件毫無意義,只是Ui組件的一個單純的包裝層.
為了定義業(yè)務(wù)邏輯,需要給出下面兩方面的信息.
1.輸入邏輯:外部的數(shù)據(jù)(即state對象)如何轉(zhuǎn)化為UI組件的參數(shù). 2.輸出邏輯:用戶發(fā)出的動作如何變?yōu)锳ction對象,從UI組件傳出去
connect方法接受兩個參數(shù):mapStateToProps和mapDispatchToProps,他們定義了UI組件的業(yè)務(wù)邏輯,
前者負責輸入邏輯,即將state映射到Ui組件的參數(shù)(props),后者負責輸出邏輯,即將用戶對UI組件的操作映射成Action.
mapStateToProps是一個函數(shù),它的作用就是像它的名字那樣,建立一個從(外部的)state對象到(Ui組件的)props對象的映射關(guān)系.
作為函數(shù),mapStateToProps執(zhí)行后應(yīng)該返回一個對象,里面的每一個鍵值對就是一個映射.
mapStateToProps會訂閱store,每當state更新的時候,就會自動執(zhí)行,重新計算UI組件的參數(shù),從而
觸發(fā)UI組件的重新渲染.
mapStateToProps的第一個參數(shù)是state對象.
mapDispatchToProps是connect函數(shù)的第二個參數(shù),用來建立UI組件的參數(shù)到store.dispatch方法的映射,
也就是說,他定義了哪些用戶的操作應(yīng)該當作Action,傳給Store,它可以是一個函數(shù),也可以是一個對象.
如果mapDispatchToProps是一個函數(shù),會得到dispatch和ownProps(容器組件的props對象)兩個參數(shù).
作為函數(shù),應(yīng)該返回一個對象,該對象的每個鍵值對都是一個映射,定義了UI組件的參數(shù)怎樣發(fā)出Action.
connect方法生成容器組件以后,需要讓容器組件拿到state對象,才能生成UI組件的參數(shù).
react-redux提供Provider組件,可以讓容器組件拿到state.
Provider在根組件外面包了一層,這樣一來,App的所有子組件就默認都可以拿到state了.
它的原理是React組件的context屬性.
react-redux自動生成的容器組件的代碼,就類似上面這樣,從而拿到store.
render(React-Router路由庫, document.getElementById("root") );
使用React-Router的項目,與其他項目也沒有不同之處,也是使用Provider在Router外面包一層,畢竟Provider的唯一功能就是傳入store對象.
const root = ({ store }) => ();
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84334.html
摘要:帶有內(nèi)部狀態(tài),內(nèi)部可以使用。代表監(jiān)聽的全局,也可以說是全局的,表示該組件自身攜帶的方法。回答問題是通過應(yīng)用的,將通過頂層組件傳遞到上下文環(huán)境中。所有頁面集合緩存不用每次都重新加載通過綁定用法完參考文章 react-redux把組件分為UI組件和容器組件。先看圖下圖: showImg(https://segmentfault.com/img/bVbkVBz?w=1378&h=1194);...
摘要:編輯器頂層組件不就了嗎這就是。官方提供的綁定庫。具有高效且靈活的特性。在的中,可以使用或者等來監(jiān)聽某個,當某個觸發(fā)后,可以使用發(fā)起異步操作,操作完成后使用函數(shù)觸發(fā),同步更新,從而完成整個的更新。 不就ok了嗎?這就是 react-redux。Redux 官方提供的 React 綁定庫。 具有高效且靈活的特性。 React Redux 將組件區(qū)分為 容器組件 和 UI 組件 前者會處理邏輯...
摘要:的實現(xiàn)原理作為一個通用的模塊,主要還是用來應(yīng)用項目中的變更通過做連接,可以在的項目中將兩者結(jié)合的更好。上述便是兩個核心的用法啦。如有不對,還請指正。 react-redux的實現(xiàn)原理: Redux作為一個通用的模塊,主要還是用來應(yīng)用項目中state的變更,通過react-redux做連接,可以在React+Redux的項目中將兩者結(jié)合的更好。 React-redux是一個輕量級的封裝庫...
摘要:更新類型及具體內(nèi)容負責更新數(shù)據(jù)的具體邏輯。即根據(jù)當前及攜帶的信息合成新的數(shù)據(jù)。下面帶著這些問題深入了解本質(zhì)上也是高階組件的一種實現(xiàn)。核心實現(xiàn)聲明以被子組件獲取。通過的實現(xiàn),我們可以得到的重要性淺比較的實現(xiàn)由此可以看到的重要性。前言 Redux作為通用的狀態(tài)管理器,可以搭配任意界面框架。所以并搭配react使用的話就要借助redux官方提供的React綁定庫react-redux,以高效靈活的...
摘要:簡介創(chuàng)建的函數(shù),返回一個對象,包含等方法合并多個中間件處理,在實際的前調(diào)用一系列中間件,類似于綁定和函數(shù)式編程中常見的方法,介紹官方提供的綁定庫。 前言 在學習了React之后, 緊跟著而來的就是Redux了~ 在系統(tǒng)性的學習一個東西的時候, 了解其背景、設(shè)計以及解決了什么問題都是非常必要的。接下來記錄的是, 我個人在學習Redux時的一些雜七雜八~ Redux是什么 通俗理解 h...
閱讀 2952·2023-04-25 19:20
閱讀 814·2021-11-24 09:38
閱讀 2066·2021-09-26 09:55
閱讀 2443·2021-09-02 15:11
閱讀 2075·2019-08-30 15:55
閱讀 3621·2019-08-30 15:54
閱讀 3159·2019-08-30 14:03
閱讀 2972·2019-08-29 17:11