網(wǎng)站首頁 編程語言 正文
一、UI組件和容器組件
React-Redux 將所有組件分成兩大類:UI 組件和容器組件。
- UI 組件:只負(fù)責(zé) UI 的呈現(xiàn),不帶有任何業(yè)務(wù)邏輯,沒有狀態(tài)state值的使用,所以的參數(shù)是通過this.props獲取。
- 容器組件:負(fù)責(zé)管理數(shù)據(jù)和業(yè)務(wù)邏輯,不負(fù)責(zé) UI 的呈現(xiàn),有業(yè)務(wù)邏輯,并且使用Redux提供的API。
對(duì)于上面的AppUI就是一UI組件,App就是一個(gè)容器組件。
二、connect
React-Redux提供connect方法,用于從 UI 組件生成容器組件。connect的意思,就是將這兩種組件連起來。
1、導(dǎo)入
import { connect } from 'react-redux'
2、使用
export default connect(mapStateToProps, mapDispatchToProps)(AppUI);
connect方法可以省略mapStateToProps參數(shù),那樣的話,UI 組件就不會(huì)訂閱Store,就是說 Store 的更新不會(huì)引起 UI 組件的更新。
- mapStateToProps:更新props————>作為輸入源。返回一個(gè)對(duì)象,key為UI界面對(duì)應(yīng)的名稱,value為state處理的結(jié)果
- mapDispatchToProps:更新action————>作為輸出源。觸發(fā)action更新reducer,進(jìn)而更新state,從而驅(qū)動(dòng)參數(shù)1變化,引起UI數(shù)據(jù)的變化
通過這個(gè)兩參數(shù)的自動(dòng)調(diào)用方式,將UI和業(yè)務(wù)邏輯分開,UI組件通過props顯示,沒有任何業(yè)務(wù)邏輯,容器組件負(fù)責(zé)邏輯業(yè)務(wù)。下面詳解這兩個(gè)參數(shù)
三、mapStateToProps
建立一個(gè)從(外部的)state對(duì)象到(UI 組件的)props對(duì)象的映射關(guān)系。作為函數(shù),mapStateToProps執(zhí)行后應(yīng)該返回一個(gè)對(duì)象,里面的每一個(gè)鍵值對(duì)就是一個(gè)映射。
mapStateToProps會(huì)訂閱 Store,每當(dāng)state更新的時(shí)候,就會(huì)自動(dòng)執(zhí)行,重新計(jì)算 UI 組件的參數(shù),從而觸發(fā) UI 組件的重新渲染。
mapStateToProps的第一個(gè)參數(shù)總是state對(duì)象,還可以使用第二個(gè)參數(shù),代表容器組件的props對(duì)象。使用ownProps作為參數(shù)后,如果容器組件的參數(shù)發(fā)生變化,也會(huì)引發(fā) UI 組件重新渲染。
下面以加減數(shù)字為例說明:
<div>
<button style={{width: 40, height: 40}} onClick={onIncreaseClick}>+</button>
<text style={{padding: 40}}>{value}</text>
<button style={{width: 40, height: 40}} onClick={onReduceClick}>-</button>
</div>
1、一個(gè)參數(shù)
const mapStateToProps = (state) => {
return {
value: state.count //UI組件中需要什么參數(shù),對(duì)象中就寫哪些參數(shù)
}
}
2、兩個(gè)參數(shù)
const mapStateToProps = (state, ownProps) => {
return {
value: state.count //UI組件中需要什么參數(shù),對(duì)象中就寫哪些參數(shù)
}
}
四、mapDispatchToProps
mapDispatchToProps是connect函數(shù)的第二個(gè)參數(shù),用來建立 UI 組件的參數(shù)到store.dispatch方法的映射。也就是說,它定義了哪些用戶的操作應(yīng)該當(dāng)作 Action,傳給 Store。它可以是一個(gè)函數(shù),也可以是一個(gè)對(duì)象。
1、作為函數(shù)
如果mapDispatchToProps是一個(gè)函數(shù),會(huì)得到dispatch和ownProps(容器組件的props對(duì)象)兩個(gè)參數(shù)。作為函數(shù),應(yīng)該返回一個(gè)對(duì)象,該對(duì)象的每個(gè)鍵值對(duì)都是一個(gè)映射,定義了 UI 組件的參數(shù)怎樣發(fā)出 Action。
dispach(action)發(fā)出消息。
const mapDispatchToProps = (dispatch, ownProps) => {
return {
onIncreaseClick: () => dispatch({type: 'increase'}),
onReduceClick: () => dispatch({type: 'reduce'})
}
}
2、作為對(duì)象
const mapDispatchToProps = {
onIncreaseClick: () => ({type: 'increase'}),
onReduceClick: () => ({type: 'reduce'})
};
const mapDispatchToProps = (dispatch) => ({
onIncreaseClick() {
dispatch({type: 'increase'})
},
onReduceClick() {
dispatch({type: 'reduce'})
}
})
這兩個(gè)使用的效果一樣。通過connect,store.subscribe也不需要了。通過connnect方法,最終的代碼:
import React, {Component} from 'react'
import {connect} from "react-redux";
class App extends Component {
render() {
const {value, onIncreaseClick, onReduceClick} = this.props
return (
<div>
<button style={{width: 40, height: 40}} onClick={onIncreaseClick}>+</button>
<text style={{padding: 40}}>{value}</text>
<button style={{width: 40, height: 40}} onClick={onReduceClick}>-</button>
</div>
);
}
}
const mapStateToProps = (state) => {
return {
value: state.count
}
}
const mapDispatchToProps = (dispatch, ownProps) => {
return {
onIncreaseClick: () => dispatch({type: 'increase'}),
onReduceClick: () => dispatch({type: 'reduce'})
}
}
export default connect(mapStateToProps, mapDispatchToProps)(App);
五、Provider
1、導(dǎo)入
import {Provider} from "react-redux";
2、使用
Provider在根組件外面包了一層,這樣一來,App的所有子組件就默認(rèn)都可以拿到state了
<Provider store={store}>
<App/>
</Provider>
效果如下:http://localhost:3000/
原文鏈接:https://blog.csdn.net/yoonerloop/article/details/112058929
相關(guān)推薦
- 2022-05-22 查看Docker容器的信息的方法實(shí)現(xiàn)_docker
- 2022-07-22 C語言中字符串詳解
- 2022-06-01 一起來學(xué)習(xí)C++的動(dòng)態(tài)內(nèi)存管理_C 語言
- 2022-12-07 Android?Flutter實(shí)現(xiàn)興趣標(biāo)簽選擇功能_Android
- 2023-03-02 Kotlin關(guān)于協(xié)程是什么的探究_Android
- 2023-07-18 SpringBoot中無法用@Value獲取yml中的配置值的原因
- 2022-03-14 springboot下Static變量通過@Value和set方法注入失敗的問題和解決辦法
- 2022-04-08 關(guān)于Kotlin委托你必須重視的幾個(gè)點(diǎn)_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支