国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【前端知識】React 基礎(chǔ)鞏固(三十二)——Redux的三大原則、使用流程及實踐

這篇具有很好參考價值的文章主要介紹了【前端知識】React 基礎(chǔ)鞏固(三十二)——Redux的三大原則、使用流程及實踐。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

React 基礎(chǔ)鞏固(三十二)——Redux的三大原則

一、Redux的三大原則

  1. 單一數(shù)據(jù)源

    • 整個應(yīng)用程序的state被存儲在一顆object tree 中,并且這個object tree 只存儲在一個store中;
    • Redux并沒有強(qiáng)制讓我們不能創(chuàng)建多個Store,但是那樣做不利于數(shù)據(jù)維護(hù);
    • 單一的數(shù)據(jù)源可以讓整個應(yīng)用程序的state變得方便維護(hù)、追蹤、修改;
  2. State是只讀的

    • 唯一修改State的方法一定是觸發(fā)action,不要試圖在其他地方通過任何的方式來修改State;

    • 這樣就確保了View或網(wǎng)絡(luò)請求都不能直接修改state,它們只能通過action來描述自己想要如何修改state;

    • 這樣可以保證所有的修改都被集中化處理,并且按照嚴(yán)格的順序來執(zhí)行,所以不需要擔(dān)心reace condition(競態(tài))的問題;

  3. 使用純函數(shù)來執(zhí)行修改

    • 通過reducer將舊state和actions聯(lián)系在一起,并且返回一個新的state;
    • 隨著應(yīng)用程序的復(fù)雜度增加,我們可以將reducer拆分成多個小的reducers,分別操作不同state tree 的一部分;
    • 但是所有的reducer都應(yīng)該是純函數(shù),不能產(chǎn)生任何的副作用;

二、Redux的使用流程

【前端知識】React 基礎(chǔ)鞏固(三十二)——Redux的三大原則、使用流程及實踐,前端知識,React,前端,react.js,前端框架

三、Redux的基本使用(計數(shù)器小案例)

  1. 構(gòu)建react項目

    # 創(chuàng)建新的react項目
    create-react-app redux-learn
    # 創(chuàng)建成功后cd進(jìn)入文件夾,隨后安裝redux
    npm install redux
    
  2. 刪除暫時無關(guān)文件,構(gòu)建store相關(guān)文件,并引用store至所需頁面中

    • 目錄

【前端知識】React 基礎(chǔ)鞏固(三十二)——Redux的三大原則、使用流程及實踐,前端知識,React,前端,react.js,前端框架

  • store/constants.js

    export const ADD_NUMBER = "add_number";
    export const SUB_NUMBER = "sub_number";
    
  • store/reducer.js

    import * as actionTypes from "./constants";
    
    const initialState = {
      counter: 111,
    };
    
    function reducer(state = initialState, action) {
      switch (action.type) {
        case actionTypes.ADD_NUMBER:
          return { ...state, counter: state.counter + action.num };
        case actionTypes.SUB_NUMBER:
          return { ...state, counter: state.counter - action.num };
        default:
          return state;
      }
    }
    
    export default reducer;
    
    
  • store/actionCreators.js

    import * as actionTypes from "./constants";
    
    export const addNumberAction = (num) => ({
      type: actionTypes.ADD_NUMBER,
      num,
    });
    
    export const subNumberAction = (num) => ({
      type: actionTypes.SUB_NUMBER,
      num,
    });
    
    
  • store/index.js

    import { createStore } from "redux";
    import reducer from "./reducer";
    
    const store = createStore(reducer);
    
    export default store;
    
    
  • pages/home.jsx

    import React, { PureComponent } from "react";
    import store from "../store";
    import { addNumberAction } from "../store/actionCreators";
    export class home extends PureComponent {
      constructor() {
        super();
    
        this.state = {
          counter: store.getState().counter,
        };
      }
      componentDidMount() {
        store.subscribe(() => {
          const state = store.getState();
          this.setState({
            counter: state.counter,
          });
        });
      }
    
      addNumber(num) {
        store.dispatch(addNumberAction(num));
      }
    
      render() {
        const { counter } = this.state;
        return (
          <div>
            home counter:{counter}
            <div>
              <button onClick={(e) => this.addNumber(1)}>+1</button>
              <button onClick={(e) => this.addNumber(5)}>+5</button>
              <button onClick={(e) => this.addNumber(8)}>+8</button>
            </div>
          </div>
        );
      }
    }
    
    export default home;
    
    
  • pages/profile.jsx

    import React, { PureComponent } from "react";
    import store from "../store";
    import { subNumberAction } from "../store/actionCreators";
    export class profile extends PureComponent {
      constructor() {
        super();
    
        this.state = {
          counter: store.getState().counter,
        };
      }
      componentDidMount() {
        store.subscribe(() => {
          const state = store.getState();
          this.setState({
            counter: state.counter,
          });
        });
      }
    
      subNumber(num) {
        store.dispatch(subNumberAction(num));
      }
    
      render() {
        const { counter } = this.state;
        return (
          <div>
            profile counter:{counter}
            <div>
              <button onClick={(e) => this.subNumber(1)}>-1</button>
              <button onClick={(e) => this.subNumber(5)}>-5</button>
              <button onClick={(e) => this.subNumber(8)}>-8</button>
            </div>
          </div>
        );
      }
    }
    
    export default profile;
    
    
  • App.jsx

    import React, { PureComponent } from "react";
    import Home from "./pages/home";
    import Profile from "./pages/profile";
    import "./style.css";
    import store from "./store";
    
    export class App extends PureComponent {
      constructor() {
        super();
    
        this.state = {
          counter: store.getState().counter,
        };
      }
      componentDidMount() {
        store.subscribe(() => {
          const state = store.getState();
          this.setState({
            counter: state.counter,
          });
        });
      }
      render() {
        const { counter } = this.state;
        return (
          <div>
            <h2>App Counter: {counter}</h2>
    
            <div className="pages">
              <Home />
              <Profile />
            </div>
          </div>
        );
      }
    }
    
    export default App;
    
    
  1. 運(yùn)行結(jié)果
    【前端知識】React 基礎(chǔ)鞏固(三十二)——Redux的三大原則、使用流程及實踐,前端知識,React,前端,react.js,前端框架

至此,代碼仍較為復(fù)雜,代碼將在React 基礎(chǔ)鞏固(三十三)中得到優(yōu)化文章來源地址http://www.zghlxwxcb.cn/news/detail-605505.html

到了這里,關(guān)于【前端知識】React 基礎(chǔ)鞏固(三十二)——Redux的三大原則、使用流程及實踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【前端知識】React 基礎(chǔ)鞏固(四十二)——React Hooks的介紹

    【前端知識】React 基礎(chǔ)鞏固(四十二)——React Hooks的介紹

    Hook 是 React 16.8 的新增特性,它可以讓我們在不編寫class的情況下使用state以及其他的React特性(比如生命周期)。 class組件 VS 函數(shù)式組件: class的優(yōu)勢: class組件可以定義自己的state,用來保存組件自己內(nèi)部的狀態(tài);而函數(shù)式組件不可以,因為函數(shù)每次調(diào)用都會產(chǎn)生新的臨時

    2024年02月14日
    瀏覽(33)
  • 【前端知識】React 基礎(chǔ)鞏固(三十七)——自定義connect高階組件

    【前端知識】React 基礎(chǔ)鞏固(三十七)——自定義connect高階組件

    從這行代碼可以看到,目前的connect直接引用了上級目錄的store,過于依賴目前既定的store,這樣不利于復(fù)用。假設(shè)另一個項目的store所在位置不在上級目錄中,則會出現(xiàn)問題。 為了讓所有人都能使用,我們應(yīng)該把這種“寫死”的做法換成讓開發(fā)者自己傳入一個store: 構(gòu)建一個

    2024年02月15日
    瀏覽(25)
  • 【前端知識】React 基礎(chǔ)鞏固(三十六)——RTK中的異步操作

    【前端知識】React 基礎(chǔ)鞏固(三十六)——RTK中的異步操作

    引入RTK中的createAsyncThunk,在extraReducers中監(jiān)聽執(zhí)行狀態(tài) 在界面中引入所需的異步操作Action 查看運(yùn)行結(jié)果 extraReducer還可以傳入一個函數(shù),函數(shù)接受一個builder參數(shù): 查看運(yùn)行結(jié)果,與之前的寫法結(jié)果一致

    2024年02月15日
    瀏覽(30)
  • 【前端知識】React 基礎(chǔ)鞏固(三十九)——React-Router的基本使用

    【前端知識】React 基礎(chǔ)鞏固(三十九)——React-Router的基本使用

    Router中包含了對路徑改變的監(jiān)聽,并且會將相應(yīng)的路徑傳遞給子組件。 Router包括兩個API: BrowserRouter使用history模式 HashRouter使用hash模式(路徑后面帶有#號) 嘗試在項目中使用HashRouter: 安裝Router 在 index.js 中引入并使用HashRouter Routes:包裹所有的Route,在其中匹配一個路由(

    2024年02月14日
    瀏覽(27)
  • 【前端知識】React 基礎(chǔ)鞏固(三十四)——組件中的異步操作及優(yōu)化

    【前端知識】React 基礎(chǔ)鞏固(三十四)——組件中的異步操作及優(yōu)化

    通過組件的生命周期來完成網(wǎng)絡(luò)請求,網(wǎng)絡(luò)請求的異步代碼直接放在組件中 通過redux來管理異步網(wǎng)絡(luò)請求 在store中引入中間件 redux-thunk 構(gòu)建 fetchHomeMultidataAction ,將原本在組件中的異步請求代碼放入到actionCreators.js中 改寫原來的category.jsx,派發(fā)異步請求的dispatch 查看運(yùn)行結(jié)果

    2024年02月15日
    瀏覽(38)
  • 【前端知識】React 基礎(chǔ)鞏固(三十八)——log、thunk、applyMiddleware中間件的核心代碼

    利用Monkey Patching,修改原有的程序邏輯,在調(diào)用dispatch的過程中,通過dispatchAndLog實現(xiàn)日志打印功能 redux中利用中間件 redux-thunk 可以讓dispatch不不僅能處理對象,還能處理函數(shù) 單個調(diào)用函數(shù)來應(yīng)用中間件,非常不方便,封裝一個函數(shù)來合并中間件 在store/index.js中應(yīng)用上面三個

    2024年02月14日
    瀏覽(46)
  • 【前端知識】React 基礎(chǔ)鞏固(十三)——列表渲染

    在 React 中沒有像 Vue 模塊語法中的 v-for 指令,而是需要我們通過 JS 代碼的方式組織數(shù)據(jù),轉(zhuǎn)成 JSX 在 React 中,展示列表最多的方式就是使用數(shù)組的 map 高階函數(shù) 在展示數(shù)組前,有時會進(jìn)行一些處理 過濾一些內(nèi)容(filter 函數(shù)) 截取數(shù)組中的一部分內(nèi)容(slice 函數(shù)) 列表中的

    2024年02月10日
    瀏覽(31)
  • 【前端知識】React 基礎(chǔ)鞏固(二十八)——StrictMode

    【前端知識】React 基礎(chǔ)鞏固(二十八)——StrictMode

    StrictMode 是一個用來突出顯示應(yīng)用程序中潛在問題的工具 與 Fragment 一樣,StrictMode 不會渲染任何可見的 UI 為后代出發(fā)額外的檢測和警告 嚴(yán)格模式檢查僅在開發(fā)模式下運(yùn)行,不影響生產(chǎn)構(gòu)建 嚴(yán)格模式檢查什么? 識別不安全的生命周期 使用過時的 ref API 檢查意外的副作用 組件

    2024年02月16日
    瀏覽(57)
  • 【前端知識】React 基礎(chǔ)鞏固(四十)——Navigate導(dǎo)航

    【前端知識】React 基礎(chǔ)鞏固(四十)——Navigate導(dǎo)航

    新建Login頁面,在Login中引入Navigate,實現(xiàn)點(diǎn)擊登陸按鈕跳轉(zhuǎn)至 /home 路徑下: 當(dāng)路由均無匹配時,通過Navigate跳轉(zhuǎn)至NotFound界面,其中 * 為通配符: 構(gòu)建NotFound.jsx 在App.jsx中配置NotFound: 構(gòu)建Home的子路由頁面: HomeRecommend.jsx HomeRanking.jsx 利用 Route 嵌套子路由,實現(xiàn)Home頁面下的

    2024年02月14日
    瀏覽(28)
  • 【前端知識】React 基礎(chǔ)鞏固(二十七)——Fragment

    【前端知識】React 基礎(chǔ)鞏固(二十七)——Fragment

    Fragment 允許將子列表分組,而無需向 DOM 添加額外節(jié)點(diǎn) 可以采用語法糖 / 來替代 Fragment,但在需要添加 key 的場景下不能使用此短語 查看Fragment應(yīng)用后的效果

    2024年02月16日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包