最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文理解Redux及其工作原理

 更新時間:2022年09月12日 10:18:31   作者:小番茄夫斯基  
這篇文章主要介紹了一文理解R通過圍繞主題展開詳細(xì)edux及其工作原理,文章通過主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

一、是什么

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

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

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

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

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

// 設(shè)置默認(rèn)值
const initialState = {
  counter: 0
}

const reducer = (state = initialState, action) => {
}

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

如下:

const store = createStore(reducer)

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

console.log(store.getState());

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

store.dispatch({
  type: "INCREMENT"
})

store.dispath({
  type: "DECREMENT"
})

store.dispatch({
  type: "ADD_NUMBER",
  number: 5
})

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

const reducer = (state = initialState, action) => {
  switch (action.type) {
    case "INCREMENT":
      return {...state, counter: state.counter + 1};
    case "DECREMENT":
      return {...state, counter: state.counter - 1};
    case "ADD_NUMBER":
      return {...state, counter: state.counter + action.number}
    default: 
      return state;
  }
}

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

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

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

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

完整代碼如下:

const redux = require('redux');

const initialState = {
  counter: 0
}

// 創(chuàng)建reducer
const reducer = (state = initialState, action) => {
  switch (action.type) {
    case "INCREMENT":
      return {...state, counter: state.counter + 1};
    case "DECREMENT":
      return {...state, counter: state.counter - 1};
    case "ADD_NUMBER":
      return {...state, counter: state.counter + action.number}
    default: 
      return state;
  }
}

// 根據(jù)reducer創(chuàng)建store
const store = redux.createStore(reducer);

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

// 修改store中的state
store.dispatch({
  type: "INCREMENT"
})
// console.log(store.getState());

store.dispatch({
  type: "DECREMENT"
})
// console.log(store.getState());

store.dispatch({
  type: "ADD_NUMBER",
  number: 5
})
// 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í)行

到此這篇關(guān)于一文理解Redux及其工作原理的文章就介紹到這了,更多相關(guān) Redux 工作原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React中的useState如何改變值不重新渲染的問題

    React中的useState如何改變值不重新渲染的問題

    這篇文章主要介紹了React中的useState如何改變值不重新渲染的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • React?在非組件環(huán)境切換路由的方法

    React?在非組件環(huán)境切換路由的方法

    這篇文章主要介紹了React?在非組件環(huán)境切換路由的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-10-10
  • 淺談react.js中實現(xiàn)tab吸頂效果的問題

    淺談react.js中實現(xiàn)tab吸頂效果的問題

    下面小編就為大家?guī)硪黄獪\談react.js中實現(xiàn)tab吸頂效果的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • React中useState和useEffect的用法詳解

    React中useState和useEffect的用法詳解

    Hooks?發(fā)布之后,函數(shù)組件能擁有自己的?state,React提供了很多內(nèi)置的Hooks,這篇文章就來和大家介紹一下useState?和?useEffect的使用,需要的可以參考一下
    2023-06-06
  • React復(fù)制到剪貼板的示例代碼

    React復(fù)制到剪貼板的示例代碼

    本篇文章主要介紹了React復(fù)制到剪貼板的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 使用React hook實現(xiàn)remember me功能

    使用React hook實現(xiàn)remember me功能

    相信大家在使用 React 寫頁面的時候都遇到過完成 Remember me 的需求吧!本文就將這個需求封裝在一個 React hook 中以供后續(xù)的使用,覺得有用的同學(xué)可以收藏起來以備不時之需,感興趣的小伙伴跟著小編一起來看看吧
    2024-04-04
  • 使用React封裝一個Tree樹形組件的實例代碼

    使用React封裝一個Tree樹形組件的實例代碼

    這篇文章主要介紹了使用React封裝一個Tree樹形組件的實例,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • React之useEffect缺少依賴警告問題及解決

    React之useEffect缺少依賴警告問題及解決

    這篇文章主要介紹了React之useEffect缺少依賴警告問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • React 組件中的 bind(this)示例代碼

    React 組件中的 bind(this)示例代碼

    這篇文章主要介紹了 React 組件中的 bind(this) ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • react中使用Modal.confirm數(shù)據(jù)不更新的問題完美解決方案

    react中使用Modal.confirm數(shù)據(jù)不更新的問題完美解決方案

    這篇文章主要介紹了react中使用Modal.confirm數(shù)據(jù)不更新的問題解決方案,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09

最新評論

大竹县| 孟津县| 上犹县| 澳门| 双桥区| 波密县| 石屏县| 耿马| 泰宁县| 滨海县| 莒南县| 剑阁县| 桃园县| 禄劝| 兰西县| 新巴尔虎左旗| 汝城县| 静宁县| 丰台区| 嘉峪关市| 腾冲县| 额尔古纳市| 寿阳县| 沙田区| 额敏县| 碌曲县| 虞城县| 图们市| 威海市| 游戏| 康平县| 安阳市| 新干县| 察雅县| 五莲县| 聂拉木县| 盐山县| 惠东县| 大余县| 景德镇市| 西乌珠穆沁旗|