成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

說說你對Redux的理解?其工作原理?

開發(fā) 前端
React是用于構(gòu)建用戶界面的,幫助我們解決渲染DOM的過程,而在整個應(yīng)用中會存在很多個組件,每個組件的state是由自身進(jìn)行管理,包括組件定義自身的state、組件之間的通信通過props傳遞、使用Context實現(xiàn)數(shù)據(jù)共享

[[411631]]

一、是什么

React是用于構(gòu)建用戶界面的,幫助我們解決渲染DOM的過程

而在整個應(yīng)用中會存在很多個組件,每個組件的state是由自身進(jìn)行管理,包括組件定義自身的state、組件之間的通信通過props傳遞、使用Context實現(xiàn)數(shù)據(jù)共享

如果讓每個組件都存儲自身相關(guān)的狀態(tài),理論上來講不會影響應(yīng)用的運(yùn)行,但在開發(fā)及后續(xù)維護(hù)階段,我們將花費(fèi)大量精力去查詢狀態(tài)的變化過程

這種情況下,如果將所有的狀態(tài)進(jìn)行集中管理,當(dāng)需要更新狀態(tài)的時候,僅需要對這個管理集中處理,而不用去關(guān)心狀態(tài)是如何分發(fā)到每一個組件內(nèi)部的

redux就是一個實現(xiàn)上述集中管理的容器,遵循三大基本原則:

  • 單一數(shù)據(jù)源
  • state 是只讀的
  • 使用純函數(shù)來執(zhí)行修改

注意的是,redux并不是只應(yīng)用在react中,還與其他界面庫一起使用,如Vue

二、工作原理

redux要求我們把數(shù)據(jù)都放在 store公共存儲空間

一個組件改變了 store 里的數(shù)據(jù)內(nèi)容,其他組件就能感知到 store的變化,再來取數(shù)據(jù),從而間接的實現(xiàn)了這些數(shù)據(jù)傳遞的功能

工作流程圖如下所示:

根據(jù)流程圖,可以想象,React Components 是借書的用戶, Action Creactor 是借書時說的話(借什么書), Store 是圖書館管理員,Reducer 是記錄本(借什么書,還什么書,在哪兒,需要查一下), state 是書籍信息

整個流程就是借書的用戶需要先存在,然后需要借書,需要一句話來描述借什么書,圖書館管理員聽到后需要查一下記錄本,了解圖書的位置,最后圖書館管理員會把這本書給到這個借書人

轉(zhuǎn)換為代碼是,React Components 需要獲取一些數(shù)據(jù), 然后它就告知 Store 需要獲取數(shù)據(jù),這就是就是 Action Creactor , Store 接收到之后去 Reducer 查一下, Reducer 會告訴 Store 應(yīng)該給這個組件什么數(shù)據(jù)

三、如何使用

創(chuàng)建一個store的公共數(shù)據(jù)區(qū)域

  1. import { createStore } from 'redux' // 引入一個第三方的方法 
  2. const store = createStore() // 創(chuàng)建數(shù)據(jù)的公共存儲區(qū)域(管理員) 

還需要創(chuàng)建一個記錄本去輔助管理數(shù)據(jù),也就是reduecer,本質(zhì)就是一個函數(shù),接收兩個參數(shù)state,action,返回state

  1. // 設(shè)置默認(rèn)值 
  2. const initialState = { 
  3.   counter: 0 
  4.  
  5. const reducer = (state = initialState, action) => { 

然后就可以將記錄本傳遞給store,兩者建立連接。如下:

  1. const store = createStore(reducer) 

如果想要獲取store里面的數(shù)據(jù),則通過store.getState()來獲取當(dāng)前state

  1. console.log(store.getState()); 

下面再看看如何更改store里面數(shù)據(jù),是通過dispatch來派發(fā)action,通常action中都會有type屬性,也可以攜帶其他的數(shù)據(jù)

  1. store.dispatch({ 
  2.   type: "INCREMENT" 
  3. }) 
  4.  
  5. store.dispath({ 
  6.   type: "DECREMENT" 
  7. }) 
  8.  
  9. store.dispatch({ 
  10.   type: "ADD_NUMBER"
  11.   number: 5 
  12. }) 

下面再來看看修改reducer中的處理邏輯:

  1. const reducer = (state = initialState, action) => { 
  2.   switch (action.type) { 
  3.     case "INCREMENT"
  4.       return {...state, counter: state.counter + 1}; 
  5.     case "DECREMENT"
  6.       return {...state, counter: state.counter - 1}; 
  7.     case "ADD_NUMBER"
  8.       return {...state, counter: state.counter + action.number} 
  9.     default:  
  10.       return state; 
  11.   } 

注意,reducer是一個純函數(shù),不需要直接修改state

這樣派發(fā)action之后,既可以通過store.subscribe監(jiān)聽store的變化,如下:

  1. store.subscribe(() => { 
  2.   console.log(store.getState()); 
  3. }) 

在React項目中,會搭配react-redux進(jìn)行使用

完整代碼如下:

  1. const redux = require('redux'); 
  2.  
  3. const initialState = { 
  4.   counter: 0 
  5.  
  6. // 創(chuàng)建reducer 
  7. const reducer = (state = initialState, action) => { 
  8.   switch (action.type) { 
  9.     case "INCREMENT"
  10.       return {...state, counter: state.counter + 1}; 
  11.     case "DECREMENT"
  12.       return {...state, counter: state.counter - 1}; 
  13.     case "ADD_NUMBER"
  14.       return {...state, counter: state.counter + action.number} 
  15.     default:  
  16.       return state; 
  17.   } 
  18.  
  19. // 根據(jù)reducer創(chuàng)建store 
  20. const store = redux.createStore(reducer); 
  21.  
  22. store.subscribe(() => { 
  23.   console.log(store.getState()); 
  24. }) 
  25.  
  26. // 修改store中的state 
  27. store.dispatch({ 
  28.   type: "INCREMENT" 
  29. }) 
  30. // console.log(store.getState()); 
  31.  
  32. store.dispatch({ 
  33.   type: "DECREMENT" 
  34. }) 
  35. // console.log(store.getState()); 
  36.  
  37. store.dispatch({ 
  38.   type: "ADD_NUMBER"
  39.   number: 5 
  40. }) 
  41. // console.log(store.getState()); 

小結(jié)

  • createStore可以幫助創(chuàng)建 store
  • store.dispatch 幫助派發(fā) action , action 會傳遞給 store
  • store.getState 這個方法可以幫助獲取 store 里邊所有的數(shù)據(jù)內(nèi)容
  • store.subscrible 方法訂閱 store 的改變,只要 store 發(fā)生改變, store.subscrible 這個函數(shù)接收的這個回調(diào)函數(shù)就會被執(zhí)行

參考文獻(xiàn) 

  • https://cn.redux.js.org/docs/introduction/
  • https://www.redux.org.cn/docs/basics/Actions.html
  • https://lulujianglab.com/posts/大白話解析 Redux 、 redux-thunk 、redux-saga 和 react-redux

 

責(zé)任編輯:武曉燕 來源: JS每日一題
相關(guān)推薦

2020-07-03 17:20:07

Redux前端代碼

2022-09-06 11:13:16

接口PipelineHandler

2021-11-25 10:18:42

RESTfulJava互聯(lián)網(wǎng)

2021-08-09 07:47:40

Git面試版本

2020-12-01 08:47:36

Java異常開發(fā)

2020-06-12 15:50:56

options前端服務(wù)器

2023-10-25 12:51:28

Go調(diào)度器

2022-07-28 19:19:21

Zookeeper中心化架構(gòu)

2021-07-19 07:55:24

Redux中間件原理

2022-10-09 15:18:31

SwaggerOpenAPI工具

2021-09-16 07:52:18

算法應(yīng)用場景

2019-05-10 10:50:04

Spring AOPJDK動態(tài)代理CGLIB動態(tài)代理

2022-08-14 07:14:50

Kafka零拷貝

2023-03-07 08:38:23

三次握手四次揮手服務(wù)端

2020-12-04 06:27:04

序列化面試官Java

2021-11-05 07:47:56

代理模式對象

2021-11-09 08:51:13

模式命令面試

2021-11-02 22:04:58

模式

2021-11-10 07:47:49

組合模式場景

2022-02-21 17:24:18

序列化對象存儲
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久精彩视频 | 91久久国产综合久久 | 国产精品亚洲综合 | av免费在线观看网站 | 欧美不卡在线 | 国产综合视频 | 在线观看中文字幕 | 国产欧美精品区一区二区三区 | 久久在线 | 欧美一级高清片 | 欧产日产国产精品视频 | 国产精品福利视频 | 蜜臀网| 男女羞羞视频免费 | 日韩精品一区二区三区中文在线 | 中日韩欧美一级片 | 成人三级网址 | 欧美一级大片 | 亚洲精品久久久久avwww潮水 | 日韩欧美国产一区二区三区 | 国产91在线视频 | 成人区精品 | 每日更新av | 精品视频一区二区三区 | 欧美精品一区二区三区蜜桃视频 | 精品在线一区 | av黄色在线 | 国产欧美一区二区三区在线看 | 福利精品在线观看 | 中国xxxx性xxxx产国 | 亚洲视频免费观看 | 亚洲国产精品久久久久婷婷老年 | 国产成人精品一区二区三区在线观看 | 日本欧美在线视频 | 国产精品久久久久久久久久久久午夜片 | 91在线视频播放 | 欧美成人aaa级毛片在线视频 | 色综合激情 | 黄色在线 | 久久久久99 | 国产精品伦一区二区三级视频 |