react-redux 類組件的 connect

store 目錄下

store/reducer.js

import * as actionTypes from './constants'const initalState = {counter: 100,banners: [],recommends: []
}/*** 定義reducer函數:純函數* @param 參數一:store中目前保存的state* @param 參數二:通過 dispatch 傳過來的 action* @returns 返回值:此函數的返回值,會作為,store的最新的state*/
function reducer(state = initalState, action) {/*** 關于此函數的返回值,*  1、有數據進行更新的時候,返回一個新的state*  2、沒有數據更新的時候,返回之前的state*/switch (action.type) {case actionTypes.ADD_NUMBER:return { ...state, counter: state.counter + action.num }case actionTypes.SUB_NUMBER:return { ...state, counter: state.counter - action.num }case actionTypes.CHANGE_BANNERS:return { ...state, banners: action.banners }case actionTypes.CHANGE_RECOMMENDS:return { ...state, recommends: action.recommends }default:return state}
}export default reducer

store/index.js

import { createStore, applyMiddleware } from 'redux'`redux-thunk:一個流行的Redux中間件,允許 dispatch 函數(而不僅是對象)`
import { thunk } from 'redux-thunk'import reducer from './reducer'` 默認情況下,Redux的store.dispatch(object),只能是object,不能是function使用 redux-thunk 可以增強store,就能 store.dispatch(function)store.dispatch(function) store.dispatch一個函數,這個函數會被中間件自動執行!`
`當需要更多的中間件時,只需:applyMiddleware(thunk, xxx, xxx, xxx) 即可 `
const store = createStore(reducer, applyMiddleware(thunk))export default store

store/actionCreators.js(這里的方法們,是在 .jsx組件中使用的)

import * as actionTypes from './constants'
import axios from 'axios'export const addNumberAction = num => ({type: actionTypes.ADD_NUMBER,num
})export const subNumberAction = num => ({type: actionTypes.SUB_NUMBER,num
})export const changeBannersAction = banners => ({type: actionTypes.CHANGE_BANNERS,banners
})export const changeRecommendsAction = recommends => ({type: actionTypes.CHANGE_RECOMMENDS,recommends
})export const fetchHomeMultidataAction = () => {function foo(dispatch, getState) {axios.get('http://121.200.320.20:8180/home/multidata').then(res => {const banners = res.data.data.banner.listconst recommends = res.data.data.banner.list// dispatch({ type: actionTypes.CHANGE_BANNERS, banners })// dispatch({ type: actionTypes.CHANGE_RECOMMENDS, recommends })dispatch(changeBannersAction(banners))dispatch(changeRecommendsAction(recommends))})}return foo
}

src 下的 index.js

src/index.js

import React from 'react'
import ReactDOM from 'react-dom/client'`* 步驟1 - 通過 react-redux 庫的高階組件,減少使用過程中 .jsx文件中的冗余代碼* Provider :react-redux 庫的高階組件,用于將 Redux 的 store 傳遞給整個 React 應用,* Provider 必須包裹根組件(如:<App />),并傳入 store 作為 prop。`
import { Provider } from 'react-redux'
`2 - import 你的 store`
import store from './store'import App from './App'const root = ReactDOM.createRoot(document.getElementById('root'))root.render(<React.StrictMode>`3 - 必須傳入一個store`<Provider store={store}><App /></Provider>`4 - 在具體的.jsx組件中,在子組件(如 about.jsx)中,通過 connect 函數或 useSelector 鉤子連接 Redux store,無需手動導入 store。`</React.StrictMode>
)

category.jsx

import React, { PureComponent } from 'react'
import { connect } from 'react-redux'
import { fetchHomeMultidataAction } from '../store/actionCreators'export class Category extends PureComponent {componentDidMount() {this.props.fetchHomeMultidata()}render() {return (<div><h2>Catefory Page</h2></div>)}
}const mapDispatchToProps = dispatch => ({fetchHomeMultidata() {dispatch(fetchHomeMultidataAction())}
})export default connect(null, mapDispatchToProps)(Category)

about.jsx 【含 connect 詳解】

import React, { PureComponent } from 'react'
import { connect } from 'react-redux'
import { addNumberAction, subNumberAction } from '../store/actionCreators'export class About extends PureComponent {calcNumber(num, isAdd) {if (isAdd) {this.props.addNumber(num)} else {this.props.subNumber(num)}}render() {const { counter, banners, recommends } = this.propsreturn (<div><h2>about: {counter}</h2><div><button onClick={e => this.calcNumber(6, true)}>+6</button><button onClick={e => this.calcNumber(88, true)}>+88</button><button onClick={e => this.calcNumber(6, false)}>-6</button><button onClick={e => this.calcNumber(88, false)}>-88</button></div><div className="banner"><h2>輪播圖數據</h2><ul>{ banners.map((item, index) => {return <li key={index}>{item.title}</li> })}</ul></div><div className='recommend'><h2>推薦數據</h2><ul>{ recommends.map((item, index) => {return <li key={index}>{item.title}</li> })}</ul></div></div>)} // end - render
} // end - class`* connect是一個函數,而且,connect的返回值,是一個高階函數(高階函數,接收一個組件作為參數)所以,這個 connect 是這樣使用的:connect(fn1, fn2)(about)* fn1函數,會接收一個state【就是store中的state (完整的 Redux state 樹)】,作用:將 Redux store 的 state 映射到組件的 props。* fn2函數,會接收一個dispatch((就是store中的dispatch))作用:將 Redux 的 dispatch 方法映射到組件的 props。export default connect(fn1)(fn2)(About) 這樣操作之后,就在 About組件中,使用 const { counter } = this.props,即可拿到store的state的counter屬性了也可以調用this.props.addNumber(1)、this.props.subNumber(2)* 這個 fn1 是隨便寫的,一般都用 mapStateToProps* 這個 fn2 是隨便寫的,一般都用 mapDispatcchToProps
`
function fn1(state) {return {counter: state.counter, `說明,About組件,會使用store的state的counter屬性,`` xxx: state.xxx 說明,About組件,會使用store的state的xxx屬性,`` 總之,About組件,使用啥,就在這里列出來即可 `banners: state.banners,recommends: state.recommends}
}
const mapStateToProps = state => ({ counter: state.counter })function fn2(dispatch) {`這里 return 的對象的屬性,也會被合并到props中 `return {addNumber(num) {dispatch(addNumberAction(num))},subNumber(num) {dispatch(subNumberAction(num))}}
}
const mapDispatcchToProps = dispatch => ({addNumber: num => dispatch(addNumberAction(num)),subNumber: num => dispatch(subNumberAction(num))
})export default connect(fn1, fn2)(About)
// export default connect(mapStateToProps, mapDispatcchToProps)(About)
connect 的工作流程
/*** connect 的工作流程* 1、訂閱Store:connect 會讓組件訂閱 Redux store 的變化* 2、注入Props:mapStateToProps 將需要的 state 片段注入到組件的 propsmapDispatchToProps 將 action 分發函數注入到組件的 props。* 3、自動更新:當 Redux store 的 state 變化時,mapStateToProps 會重新執行,如果返回的數據變化,組件會重新渲染* 4、觸發 Action:組件通過 this.props.addNumber() 等方法調用 mapDispatchToProps 返回的函數,觸發 Redux action 更新全局狀態*/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91570.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91570.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91570.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據分布是如何影響目標檢測精度

文章目錄一、研究背景與目標模型效果提升數據集優化二、研究問題明細各方向的關聯性與核心邏輯1. 高質量數據集的高效篩選與主動學習應用2. 基于推理結果的數據補充與增強方向優化3. 多類別場景下目標尺度與模型精度的關聯性4. 損失函數與數據增強對精度的量化影響5. 目標類型專…

高效批量轉換Java接口為MCP服務:降低重復勞動的實戰指南

高效批量轉換Java接口為MCP服務:降低重復勞動的實戰指南 在AI大模型技術飛速發展的今天,企業需要將現有Java接口快速適配為模型計算協議(MCP,Model Calculation Protocol)服務,以便與大模型生態無縫對接。然而,手動逐個轉換接口不僅耗時耗力,還容易因人為疏忽導致錯誤…

Eclipse Debug 配置指南

Eclipse Debug 配置指南 引言 Eclipse 作為一款功能強大的集成開發環境(IDE),在Java開發者中享有盛譽。在開發過程中,調試功能是必不可少的。本文將詳細介紹如何在Eclipse中配置調試環境,以便更高效地進行代碼調試。 1. 開發環境準備 在開始配置Eclipse調試環境之前,…

modelscope ProxyError: HTTPSConnectionPool(host=‘www.modelscope.cn‘, port=443)

目錄 Windows CMD&#xff1a; powershell Linux / macOS / Git Bash&#xff1a; win11 設置全局系統變量代理 modelscope ProxyError: HTTPSConnectionPool(hostwww.modelscope.cn, port443) 報錯&#xff1a; requests.exceptions.ProxyError: HTTPSConnectionPool(host…

Python學習之——序列化與反序列化

Python學習之——序列化與反序列化yaml & json & xmlyamljsonPython自帶Json庫xml一個綜合示例pickle & msgpack & marshalpicklemsgpackmarshal自定義導出py文件一個導出py文件的示例yaml & json & xml YAML & JSON &XML 如何選擇 yaml Py…

設計模式之代理模式:掌控對象訪問的優雅之道

代理模式&#xff1a;掌控對象訪問的優雅之道 引言&#xff1a;設計模式的重要性 在軟件開發中&#xff0c;設計模式是解決常見問題的可復用方案&#xff0c;它們如同建筑師的藍圖&#xff0c;為開發者提供了經過驗證的最佳實踐。在23種經典設計模式中&#xff0c;代理模式因其…

sqli-labs靶場通關筆記:第18-19關 HTTP頭部注入

第18關 User-Agent注入登錄正確的用戶名密碼&#xff0c;它會將User-Agent的信息回顯到頁面上。猜測UA頭可能存在注入點。利用bp抓包&#xff0c;在UA頭后面加一個單引號&#xff0c;發現報錯了。觀察報錯信息&#xff0c;顯示nearxx,admin)&#xff0c;推測后面應該還有兩個參…

基于按鍵開源MultiButton框架深入理解代碼框架(三)(指針的深入理解與應用)

文章目錄3、分析代碼3.3 按鍵的插入3.4 按鍵的刪除3.5 繼續分析狀態機核心理解4、寫在最后的總結5、思想感悟篇6、慈悲不渡自絕人3、分析代碼 3.3 按鍵的插入 // Button handle list headstatic Button* head_handle NULL;/*** brief Start the button work, add the handle…

ACOUSLIC-AI挑戰報告:基于低收入國家盲掃超聲數據的胎兒腹圍測量|文獻速遞-醫學影像算法文獻分享

Title題目ACOUSLIC-AI challenge report: Fetal abdominal circumferencemeasurement on blind-sweep ultrasound data from low-income countriesACOUSLIC-AI挑戰報告&#xff1a;基于低收入國家盲掃超聲數據的胎兒腹圍測量01文獻速遞介紹胎兒生長受限&#xff08;FGR&#xf…

集群聊天服務器各個類進行詳解

1.dh.h類定義概要類名&#xff1a; MySQL功能&#xff1a; 簡化MySQL的連接、查詢和更新操作&#xff0c;提供接口給上層應用使用。成員變量private:MYSQL *_conn;_conn&#xff1a;指向MYSQL結構體的指針&#xff0c;用于代表數據庫連接實例。由mysql_init()初始化&#xff0c…

電纜安全雙保險:不止防盜,更能防觸電的塔能智慧照明守護方案

城市照明、地下車庫以及園區路燈所涉及的電纜安全問題&#xff0c;向來都是運維管理方面頗為棘手的難題。在傳統的運維管理模式之下&#xff0c;電纜一旦被盜&#xff0c;那么所造成的影響可不小&#xff0c;一方面會帶來直接的經濟損失&#xff0c;另一方面還極有可能因為線路…

Leetcode刷題營第二十九,三十題:二叉樹的中序以及后序遍歷

94.二叉樹的中序遍歷 給定一個二叉樹的根節點 root &#xff0c;返回 它的 中序 遍歷 。 示例 1&#xff1a; 輸入&#xff1a;root [1,null,2,3] 輸出&#xff1a;[1,3,2]示例 2&#xff1a; 輸入&#xff1a;root [] 輸出&#xff1a;[]示例 3&#xff1a; 輸入&#x…

Rabbitmq Direct Exchange(直連交換機)可以保證消費不被重復消費嗎,可以多個消費者,但是需要保證同一個消息,不會被投遞給多個消費者

在 RabbitMQ 中&#xff0c;默認情況下&#xff0c;不能保證消息不被重復消費&#xff0c;但可以通過 隊列綁定方式 消費者競爭機制 來確保 同一消息只被一個消費者處理。以下是幾種可行的方案&#xff1a;方案 1&#xff1a;單隊列 競爭消費者模式&#xff08;默認行為&…

常用的OTP語音芯片有哪些?

唯創知音在 OTP 語音芯片有著26年的歷史&#xff0c;有著豐富的技術積累與產品迭代歷程。1999 年&#xff0c;唯創知音在廣州成立&#xff0c;彼時便開始在電子領域積極探索。2000 年&#xff0c;公司敏銳捕捉到語音芯片行業的發展潛力&#xff0c;正式進軍該領域。經過數年技術…

分布式光伏發電系統中的“四可”指的是什么?

在分布式光伏電站規模爆發式增長的今天&#xff0c;“看不見、管不住、調不動”的難題卻成為行業痛點。如何讓散布各處的光伏電站真正成為穩定高效的“綠色能量站”&#xff1f;2025年《分布式光伏發電開發建設管理辦法》大型工商業項目&#xff08;≥6MW&#xff09;明確要求具…

健康管理系統新趨勢:AI + 物聯網如何重塑健康管理

一、傳統健康管理的痛點與變革之必然長久以來&#xff0c;我們熟悉的健康管理方式存在明顯局限&#xff1a;數據孤島嚴重&#xff1a;體檢報告在抽屜里沉睡&#xff0c;健身手環數據僅存于手機&#xff0c;不同醫療機構信息互不相通&#xff0c;個人健康信息猶如碎片散落各處。…

git基本操作【GIT-2】

git基本操作初始化一個倉庫&#xff08;repository&#xff09;、開始或停止跟蹤&#xff08;track&#xff09;文件、暫存&#xff08;stage&#xff09;或提交&#xff08;commit&#xff09;更改如何配置 Git 來忽略指定的文件和文件模式、如何迅速而簡單地撤銷錯誤操作、如…

【數據準備】——深度學習.全連接神經網絡

目錄 1 數據加載器 1.1 構建數據類 1.1.1 Dataset類 1.1.2 TensorDataset類 1.2 數據加載器 2 數據加載案例 2.1 加載csv數據集 2.2 加載圖片數據集 2.3 加載官方數據集 2.4 pytorch實現線性回歸 1 數據加載器 分數據集和加載器2個步驟~ 1.1 構建數據類 1.1.1 Dat…

健康生活,從細節開始

健康生活&#xff0c;從細節開始在當今快節奏的生活中&#xff0c;健康逐漸成為人們關注的焦點。擁有健康的身體&#xff0c;才能更好地享受生活、追求夢想。那么&#xff0c;如何才能擁有健康呢&#xff1f;這就需要我們從生活中的點滴細節入手&#xff0c;培養良好的生活習慣…

javax.servlet.http.HttpServletResponse;API導入報錯解決方案

javax.servlet.http.HttpServletResponse;API導入報錯解決方案與Postman上傳下載文件驗證 1. 主要錯誤&#xff1a;缺少 Servlet API 依賴 錯誤信息顯示 javax.servlet.http 包不存在。這是因為你的項目缺少 Servlet API 依賴。 解決方案&#xff1a; 如果你使用的是 Maven&…