React狀態管理——Dva

目錄

一、安裝依賴

二、Dva注冊model方式

2.1 自動注冊models

2.2 手動注冊model方式

三、創建 dva 實例

四、創建 model

五、在組件中使用

六、動態加載Dva Model


Dva 是一個基于 redux 和 redux-saga 的輕量級前端框架,可以方便地在 React 應用中管理狀態。下面是將 Dva 接入 create-react-app 項目的步驟:

一、安裝依賴

? ? ? ? 在react-react-app項目目錄中安裝 dva 相關依賴:

npm install dva --save
# 或者使用 yarn
yarn add dva

二、Dva注冊model方式

2.1 自動注冊models

????????Dva 本身不會自動識別特定的?models?文件夾或?model.js?文件,但官方推薦以下約定俗成的結構:

src/├── models/          # 全局 model 目錄│   ├── user.js      # 用戶 model│   └── product.js   # 產品 model└── pages/├── Home/│   ├── model.js # 頁面級 model (可選)│   └── index.js└── About/├── model.js└── index.js

2.2 手動注冊model方式

????????Dva 需要顯式注冊?model 才會生效,主要有以下幾種注冊方式:

  • 初始化時注冊
// src/index.js
app.model(require('./models/user').default);
  • 動態注冊
// 在組件或路由加載時
useEffect(() => {app.model(require('./models/product').default);
}, []);

三、創建 dva 實例

修改?src/index.js?文件:


import React from 'react';
import dva from 'dva';
import createHistory from 'history/createBrowserHistory';
import App from './App';
import './index.css';// 1. Initialize
const app = dva({history: createHistory(),
});// 2. Plugins (可選)
// app.use({});// 3. Model (可以在這里注冊全局model)
// app.model(require('./models/example').default);// 4. Router
app.router(() => <App />);// 5. Start
app.start('#root');

四、創建 model

在?src/models?目錄下創建一個 model 文件,例如?counter.js

// 標準的 model 文件示例 (models/counter.js)
//export default {
//  namespace: 'user',  // 必須的唯一標識
//  state: {},         // 必須的初始狀態
//  reducers: {},      // 同步修改 state 的方法
//  effects: {},       // 異步處理邏輯
//  subscriptions: {}  // 訂閱數據源
//};export default {namespace: 'counter',state: {count: 0,},reducers: {add(state) {return { ...state, count: state.count + 1 };},minus(state) {return { ...state, count: state.count - 1 };},},effects: {*addAsync(_, { call, put }) {yield call(delay, 1000);yield put({ type: 'add' });},},
};function delay(timeout) {return new Promise(resolve => {setTimeout(resolve, timeout);});
}

五、在組件中使用

方法一:connect

import React from 'react';
import { connect } from 'dva';function Counter({ count, dispatch }) {return (<div><h2>Count: {count}</h2><button onClick={() => dispatch({ type: 'counter/add' })}>+</button><button onClick={() => dispatch({ type: 'counter/minus' })}>-</button><button onClick={() => dispatch({ type: 'counter/addAsync' })}>Add Async</button></div>);
}function mapStateToProps(state) {return {count: state.counter.count,};
}export default connect(mapStateToProps)(Counter);

方法二:React Hooks(useSelector、useDispatch)

import React from 'react';
import { useSelector, useDispatch } from 'dva';function Counter() {// 使用 useSelector 獲取 state 中的 counter 數據const count = useSelector(state => state.counter.count);// 使用 useDispatch 獲取 dispatch 方法const dispatch = useDispatch();return (<div><h2>Count: {count}</h2><button onClick={() => dispatch({ type: 'counter/add' })}>+</button><button onClick={() => dispatch({ type: 'counter/minus' })}>-</button><button onClick={() => dispatch({ type: 'counter/addAsync' })}>Add Async</button></div>);
}export default Counter;

六、動態加載Dva Model

方法一:使用useEffect + app.model()

import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'dva';export default function CounterPage() {const dispatch = useDispatch();const count = useSelector(state => state.counter.count);useEffect(() => {// 動態加載 modelapp.model(require('../models/counter').default);// 組件卸載時取消注冊 model(可選)return () => {app.unmodel('counter');};}, [app]);return (<div><h2>Count: {count}</h2><button onClick={() => dispatch({ type: 'counter/add' })}>+</button></div>);
}

方法二:使用dynamic

import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'dva';export default function CounterPage() {const dispatch = useDispatch();const count = useSelector(state => state.counter.count);useEffect(() => {// 動態加載 modeldispatch({type: '@@dva/dynamicLoad',payload: {models: () => [import('../models/counter')],},});return () => {// 可以在這里取消 model(如果需要)};}, [dispatch]);return (<div><h2>Count: {count}</h2><button onClick={() => dispatch({ type: 'counter/add' })}>+</button></div>);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90590.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90590.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編程與數學 03-002 計算機網絡 05_以太網技術

編程與數學 03-002 計算機網絡 05_以太網技術一、以太網的基本原理&#xff08;一&#xff09;CSMA/CD協議的工作原理&#xff08;二&#xff09;以太網的幀結構二、以太網的拓撲結構與設備&#xff08;一&#xff09;傳統以太網的拓撲結構&#xff08;二&#xff09;交換機的工…

解決英文版Windows10安裝WireShark報錯

問題點擊WireShark安裝包進行安裝時報錯原因編碼方式故障解決方式修改操作系統編碼1.WinR&#xff0c;輸入Control&#xff0c;打開控制面板2.點擊Small icons3.點擊Region4.設置編碼UTF-8

利用aruco標定板標定相機

1、生成aruco標定板#include <opencv2/opencv.hpp> #include <opencv2/aruco.hpp> #include <opencv2/objdetect/aruco_detector.hpp> #include <iostream> #include <string>using namespace cv; using namespace std;int main() {int markers…

C/C++語言程序使用三種主要的內存分配方式,和python語言一樣么?

這是一個很好的比較問題&#xff01;C/C 和 Python 在內存分配方式上有本質的區別&#xff0c;雖然它們最終使用的都是計算機的物理內存&#xff08;堆、棧等&#xff09;&#xff0c;但語言層面提供的抽象和管理機制完全不同。核心區別&#xff1a;控制權&#xff1a; C/C 程序…

小電流驅動大電流:原理、實現方式與應用前景

目錄 一、什么是“小電流驅動大電流”&#xff1f; 舉個例子&#xff1a; 二、核心原理與實現方式 1. 電流放大原理 2. 電子開關元件 3. 控制電路設計 4. 附加保護措施 三、為什么采用“小電流驅動大電流”&#xff1f; 1. 提高安全性 2. 降低能耗 3. 改善效率 4. …

【DM數據守護集群搭建-讀寫分離】

DM數據守護集群搭建-讀寫分離 讀寫分離集群由一個主庫以及一個或者多個配置了即時&#xff08;Timely&#xff09;歸檔或實時&#xff08;Realtime&#xff09;歸檔的備庫組成&#xff0c;其主要目標是在保障數據庫可用性基礎上&#xff0c;實現讀、寫操作的自動分離&#xff0…

earth靶場

1、找ip和端口主機是192.168.6.213&#xff0c;因此靶場ip就是192.168.6.34&#xff0c;三個端口開放&#xff0c;我們去訪問一下頁面。三個端口都無法訪問。我們使用nmap進行dns解析。nmap -A -p- -T4 -sV 192.168.6.34把這兩條解析添加到hosts文件中去&#xff0c;這樣我們才…

Kafka——Java消費者是如何管理TCP連接的?

引言在分布式消息系統中&#xff0c;網絡連接是數據流轉的"血管"&#xff0c;其管理效率直接決定了系統的吞吐量、延遲與穩定性。作為Kafka生態中負責數據消費的核心組件&#xff0c;Java消費者&#xff08;KafkaConsumer&#xff09;的TCP連接管理機制一直是開發者理…

idea監控本地堆棧

idea 安裝插件 VisualVM Launcher重啟idea后&#xff0c;配置 VisualVM 屬性選擇自己jdk的 jvisualvm啟動時&#xff0c;選擇監控&#xff0c;會自動彈出 VisualVM

系統性提升大模型回復準確率:從 RAG 到多層 Chunk 策略

大語言模型&#xff08;LLM&#xff09;在問答、搜索、對話等任務中展現出強大的生成能力&#xff0c;但它并不具備真實世界知識的完全記憶與對齊能力&#xff0c;尤其在涉及復雜信息、長文檔引用或領域細節時&#xff0c;其“幻覺”問題&#xff08;hallucination&#xff09;…

【神經網絡概述】從感知機到深度神經網絡(CNN RNN)

文章目錄1. 神經網絡基礎1.1 感知器&#xff08;Perceptron)1.2 深度神經網絡&#xff08;DNN&#xff09;2. 卷積神經網絡&#xff08;CNN&#xff09;2.1 核心思想2.2 典型結構2.3 ?程碑模型:2.4 卷積層 - CNN 核心2.5 池化層3. 循環神經網絡&#xff08;RNN&#xff09;3.1…

界面規范3-列表下

4、內容文字有鏈接的采用藍色字體<font colorblue></font>重要內容采用紅字字體&#xff0c;如狀態<font colorred></font>一般字體使用color: #3232325、行高height: 40px;line-height: 40px;6、其他表格占滿界面空間&#xff0c;內容多時&#xff0c…

中文語音識別與偏誤檢測系統開發

中文語音識別與偏誤檢測系統開發 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家&#xff0c;覺得好請收藏。點擊跳轉到網站。 1. 系統概述 本系統旨在開發一個基于Paraformer模型的中文語音識別與偏誤檢…

MySQL創建普通用戶并為其分配相關權限的操作步驟

1. 登錄MySQL服務器 首先&#xff0c;你需要以管理員身份登錄MySQL服務器。可以使用以下命令&#xff1a; mysql -u root -p 輸入密碼后&#xff0c;即可進入MySQL命令行界面。 2. 創建新用戶 使用CREATE USER語句創建新用戶。語法如下&#xff1a; CREATE USER usernamehost I…

OSPF 路由協議多區域

一、課程目標本課程旨在幫助學習者掌握 OSPF 多區域的核心知識&#xff0c;具體包括&#xff1a;掌握 OSPF 各種 LSA 的內容和傳遞過程、了解普通區域與特殊區域的特點、掌握 OSPF 多區域的配置。二、OSPF 多區域劃分的必要性單區域存在的問題單區域 OSPF 網絡中&#xff0c;存…

小程序的客服咨詢(與企業微信建立溝通)

背景&#xff1a;小程序是面向群眾的。需要提供與企業的聊天窗口。 一、連接方式。 使用組件的方式最佳wx.openCustomerServiceChat 二、接入小程序 鏈接

解碼3D格式轉換

三維圖形與可視化領域&#xff0c;3D模型格式作為數據交換與存儲的基石&#xff0c;承載著模型結構、幾何形狀、紋理以及材質等多重信息。不同的3D模型格式在支持材質的方式上各有差異&#xff0c;這些差異不僅影響模型的外觀表現&#xff0c;還在格式轉換過程中帶來了特定的挑…

HarmonyOS學習記錄5

HarmonyOS學習記錄5 本文為個人學習記錄&#xff0c;僅供參考&#xff0c;如有錯誤請指出。本文主要記錄網絡請求的開發知識。 參考文檔&#xff1a;HTTP和RCP訪問網絡 網絡連接 概述 網絡連接管理提供管理網絡一些基礎能力&#xff0c;包括WiFi/蜂窩/Ethernet等多網絡連接優…

【C/C++】explicit_bzero

explicit_bzero explicit_bzero 是一個為了解決 memset 在安全清除內存場景中可能被優化器移除的問題而設計的函數&#xff0c;廣泛用于安全編程中&#xff0c;比如密碼、密鑰清除等。Introduce 頭文件 #include <string.h>函數原型 void explicit_bzero(void *s, size_t…

MySQL 鏈接方法思考

代碼: import subprocess import os from dotenv import load_dotenv import pymysql from sqlalchemy import create_enginedef check_mysql_service():"""檢查 MySQL 服務是否運行"""try:result = subprocess.run(["systemctl", &…