網站首頁 編程語言 正文
1. redux 是什么?
React 只是 DOM 的一個抽象層,并不是 Web 應用的完整解決方案。react只是一個輕量級的視圖層框架,如果要做大型應用就要搭配視圖層框架redux一起使用。主要引用于多交互、多數據源的場景,并不是必須使用,但是必須要會。
2.redux的原理
redux的原理,首先用一張圖來說明,很容易理解
首先,用戶發出 Action。
store.dispatch(action);
然后,Store 自動調用 Reducer,并且傳入兩個參數:當前 State 和收到的 Action。 Reducer 會返回新的 State 。
let nextState = todoApp(previousState, action);
State 一旦有變化,Store 就會調用監聽函數。
// 設置監聽函數 store.subscribe(listener);
listener可以通過store.getState()得到當前狀態。如果使用的是 React,這時可以觸發重新渲染 View。
function listerner() { let newState = store.getState(); component.setState(newState); }
3. 如何使用 redux?
(1).安裝redux,創建redux文件夾,建立store.js
該文件專門用于暴露一個store對象,整個應用只有一個store對象
安裝redux:yarn add redux
/ npm install redux
//引入createStore,專門用于創建redux中最為核心的store對象 import {createStore,applyMiddleware} from 'redux' //引入為Count組件服務的reducer import countReducer from './count_reducer' //引入redux-thunk,用于支持異步action import thunk from 'redux-thunk' //暴露store //applyMiddleware 是中間位 中使用thunk export default createStore(countReducer,applyMiddleware(thunk))
(2).建立reducers.js
- 1.該文件是用于創建一個為Count組件服務的reducer,reducer的本質就是一個函數
- 2.reducer函數會接到兩個參數,分別為:之前的狀態(preState),動作對象(action)
const initState = 0 //初始化狀態 export default function countReducer(preState=initState,action){ // console.log(preState); //從action對象中獲取:type、data const {type,data} = action //根據type決定如何加工數據 switch (type) { case 'increment': //如果是加 return preState + data case 'decrement': //若果是減 return preState - data default: return preState } }
(3).引入store.subscribe
主要用subscribe監聽store中每次修改情況
// 公共 index.js import store from './redux/store' //subscribe當store中數據發生變化就會更新數據,寫在這里是讓全局擁有 store.subscribe(()=>{ ReactDOM.render(<App/>,document.getElementById('root')) })
(4). 引入react-redux
react-redux是redux作者封裝的一個庫,是第三方模塊,對Redux進一步簡化,提供了一些額外的API(例如:Provider,connect等),使用它可以更好的組織和管理我們的代碼,在React中更方便的使用Redux。
下載 react-redux
創建count 文件
//引入Count的UI組件 import CountUI from '../../components/Count' //引入connect用于連接UI組件與redux import {connect} from 'react-redux' ------------------------------------------------------------- /* 1.mapStateToProps函數返回的是一個對象; 2.返回的對象中的key就作為傳遞給UI組件props的key,value就作為傳遞給UI組件props的value 3.mapStateToProps用于傳遞狀態 */ function mapStateToProps(state){ return {count:state} } ----------------------------------------------------------------- /* 1.mapDispatchToProps函數返回的是一個對象; 2.返回的對象中的key就作為傳遞給UI組件props的key,value就作為傳遞給UI組件props的value 3.mapDispatchToProps用于傳遞操作狀態的方法 */ function mapDispatchToProps(dispatch){ return { jia:number => dispatch(createIncrementAction(number)), jian:number => dispatch(createDecrementAction(number)), jiaAsync:(number,time) => dispatch(createIncrementAsyncAction(number,time)), } } //使用connect()()創建并暴露一個Count的容器組件 export default connect(mapStateToProps,mapDispatchToProps)(CountUI) //改良 export default connect( state => ({count:state}), //mapDispatchToProps的一般寫法 /* dispatch => ({ jia:number => dispatch(createIncrementAction(number)), jian:number => dispatch(createDecrementAction(number)), jiaAsync:(number,time) => dispatch(createIncrementAsyncAction(number,time)), }) */ //mapDispatchToProps的簡寫 { jia:createIncrementAction, jian:createDecrementAction, jiaAsync:createIncrementAsyncAction, } )(Count)
生成action對象,并分別暴露
/* 該文件專門為Count組件生成action對象 */ import {INCREMENT,DECREMENT} from '../constant' //同步action,就是指action的值為Object類型的一般對象 export const increment = data => ({type:INCREMENT,data}) export const decrement = data => ({type:DECREMENT,data}) //異步action,就是指action的值為函數,異步action中一般都會調用同步action,異步action不是必須要用的。 export const incrementAsync = (data,time) => { return (dispatch)=>{ setTimeout(()=>{ dispatch(increment(data)) },time) } }
原文鏈接:https://blog.csdn.net/Eternity_matt/article/details/121595678
相關推薦
- 2022-07-30 C語言數組長度的計算方法實例總結(sizeof與strlen)_C 語言
- 2023-02-02 Python實現自動生成請假條_python
- 2022-01-04 給所有使用el-table組件特定列添加統一事件及樣式
- 2022-08-18 kubernetes?k8s常用問題排查方法_云其它
- 2022-04-02 一文講解Kotlin中的contract到底有什么用_Android
- 2022-12-07 c++的virtual和override作用及說明_C 語言
- 2022-02-24 antv/g2圖表tooltip自定義并展示坐標之外的數據
- 2022-12-15 Pycharm中配置Anaconda解釋器的完整步驟_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支