日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

redux工作原理講解及使用方法_React

更新時間: 2021-11-01 編程語言

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

欄目分類
最近更新