redux的原理、工作流程及其應(yīng)用方式
redux原理、工作流程及其使用
- Redux對于JavaScript應(yīng)用而言是一個可預(yù)測狀態(tài)的容器。
- 換言之,它是一個應(yīng)用數(shù)據(jù)流框架,而不是傳統(tǒng)的像underscore.js或者AngularJs那樣的庫或者框架。
1、什么是redux?
redux是專門用于集中式管理狀態(tài)的javascript庫,他并不是react的插件庫。
比如你有多個組件A-E都想要用同一個組件D中的狀態(tài):
1)像以前我們可以通過父子組件通信的方式讓父組件進(jìn)行傳遞狀態(tài),或者是讓兄弟組件之間通過訂閱發(fā)布進(jìn)行通信
2)當(dāng)我們使用了redux就可以直接通過讓redux進(jìn)行統(tǒng)一的狀態(tài)管理,誰想要用狀態(tài)就自己去拿,省去了第一種方法的層層傳遞
2、redux的工作流程
在我們了解redux的工作流程之前我們應(yīng)該要知道redux有三個核心概念,分別為actions、store、reducers(帶s的表明可能存在多個)
1)actions
actions英文直譯過來就是行動、動作的意思,那么我們就可以猜到他表示的是“怎么做”,簡單來說actions就是一個對象,actions里面有兩個屬性分別為type和data:
type
:標(biāo)識屬性,值為字符串且唯一,必要屬性(你想要做什么事情data
:數(shù)據(jù)屬性,值為任意類型,可選屬性(你要做事情的數(shù)據(jù)
那我們淺淺舉個栗子:
比如計算器你可以進(jìn)行加1減2等操作,那么加減乘除這個操作就是你的type,數(shù)字就是你的數(shù)據(jù)
2)store
store有且只能有一個,他相當(dāng)于一個最高指揮家,他負(fù)責(zé)把action動作交給對應(yīng)的reducer進(jìn)行執(zhí)行,也就是說將state、action和reducer聯(lián)系在一起的對象。
3)reducer
reducer用于將store發(fā)過來的action完成并將結(jié)果返回給store,他接收兩個參數(shù)preState(舊狀態(tài))和action(動作)并返回一個newState(新狀態(tài))。
比如像計算器我們需要在原來的數(shù)據(jù)上進(jìn)行加1的操作,那么舊狀態(tài)舊對應(yīng)原來的數(shù)據(jù),action對應(yīng)加1的操作,返回的新狀態(tài)就是計算器加完之后重新返回的結(jié)果。
那么他的工作流程是什么樣的呢?
1)首先我們要確定我們要做什么
2)讓Action Creators創(chuàng)建action(也就是你要做的事情)
3)通過dispatch將action分發(fā)出去
4)store對要使用的reducer進(jìn)行綁定,然后將action分發(fā)到對應(yīng)的reducer上
5)在reducer上進(jìn)行相應(yīng)的action操作并返回結(jié)果給store
6)組件就可以通過store的API像store進(jìn)行獲取操作返回的結(jié)果
3、redux的舉例說明
接下來我們會使用一個計算器的案例幫助大家更好的理解redux
1)Count組件
import store from '../../redux/store' import { creatAdd, creatJian } from '../../redux/count_action' export default class Count extends Component { ///相加 addCount = () => { const { value } = this.selectValue///獲取當(dāng)前選擇的值 store.dispatch(creatAdd(value * 1)) } //相減 lessCount = () => { const { value } = this.selectValue store.dispatch(creatJian(value * 1)) } render () { return ( <div> <h2>當(dāng)前計算器的值為:{store.getState()}</h2> <select ref={c => this.selectValue = c}> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select> <button onClick={this.addCount}>相加</button> <button onClick={this.lessCount}>相減</button> </div> ) } }
2)創(chuàng)建action
import { ADDCOUNT, CREATJIAN } from '../redux/constant' export const creatAdd = data => ({ type: ADDCOUNT, data }) export const creatJian = data => ({ type: CREATJIAN, data })
3)store組件
import { legacy_createStore } from 'redux' import countReducer from './count_reducer' ///將reducer和store聯(lián)系起來 export default legacy_createStore(countReducer)
4)reducer組件
import { ADDCOUNT, CREATJIAN } from './constant' const inin = 0 export default function countReducer (pre = inin, action) { ///從action解析出type和data const { type, data } = action ///通過類型進(jìn)行匹配,判斷怎么做 switch (type) { case ADDCOUNT: return pre + data case CREATJIAN: return pre - data default: return pre } }
5)contant常量
為防止出現(xiàn)拼寫錯誤 export const ADDCOUNT = 'addCount' export const CREATJIAN = 'lessCount'
6)當(dāng)檢測到redux中的狀態(tài)發(fā)生變化時要進(jìn)行更新渲染
const root = ReactDOM.createRoot(document.getElementById('root')); root.render( <App /> ); ///在入口文件進(jìn)行更新渲染 store.subscribe(() => { root.render( <App /> ) })
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于PixiJS實現(xiàn)react圖標(biāo)旋轉(zhuǎn)動效
PixiJS是一個開源的基于web的渲染系統(tǒng),為游戲、數(shù)據(jù)可視化和其他圖形密集型項目提供了極快的性能,這篇文章主要介紹了用PixiJS實現(xiàn)react圖標(biāo)旋轉(zhuǎn)動效,需要的朋友可以參考下2022-05-05react-redux中connect的裝飾器用法@connect詳解
這篇文章主要介紹了react-redux中connect的裝飾器用法@connect詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01