dvaJs在react 项目中的简单使用

news2025/1/17 15:25:40

官网:入门课 | DvaJS

备注:个人学习

代码示例:

getColumns.js

const getColumns = [
    {
        title: '姓名', // 列标题
        dataIndex: 'name', // 数据字段名称,与数据中的字段名对应
        key: 'name', // 列的唯一键
    },
    {
        title: '年龄', // 列标题
        dataIndex: 'age', // 数据字段名称,与数据中的字段名对应
        key: 'age', // 列的唯一键
    },
];

export default getColumns

model.js

import {
    Test
} from 'utils/api'


export default {
    namespace: "myName",
    state: {
        jsonData: [],
    },
    effects: {
        // 获取列表信息
        * getMyName({}, {put, call, select}) {
            const res = yield call(Test);
            console.log("======================================================",res.data)
            if (res.meta.statusCode === 200) {
                // 设置state
                yield put({
                    type: "selectMyName",
                    payload: {
                        jsonData: res.data,
                    }
                });
            }
        },
    },
    reducers: {
        selectMyName(state, {payload}) {
            return {...state, ...payload};
        },
        setState(state, { jsonData }) {
            return {
                ...state,
                ...jsonData
            };
        }
    }
};

 index.js

import React from "react";
import {connect} from "react-redux";
import { Button, Table} from "antd";
import styles from "../ordinary/index.less";
import PermissionDiv from "utils/PermissionDiv";
import getColumns from "../ordinary/getColumns";

@connect((state) => {
    const {myName, login} = state;
    return {...myName, login};
})
export default class Test extends React.Component {
    constructor(props) {
        super(props);
    }
    // static getDerivedStateFromProps(nextProps,nextState) {
    //     console.log("========================",nextProps,nextState)
    // }
    componentWillMount() {
        console.log("666",this.props)
        //获取已存在的发起单位list
        this.props.dispatch({
            type: 'myName/getMyName'
        });
    }
    render() {
        const { jsonData } = this.props;
        console.log("查出来的数据",jsonData)
        const columns = getColumns
        return (
            <div className={styles.box}>
                <div className={styles.topBoxL} id="coll_xzrw">
                <PermissionDiv perms={"ly-dcp_fill_collection_test_add"}>
                    <Button type="primary">
                        新增任务
                    </Button>
                </PermissionDiv>
                </div>
                <Table dataSource={jsonData} columns={columns} rowKey="name" />
            </div>
        );
    }
}

Dva.js 是一个基于 React 和 Redux 的轻量级前端框架,用于帮助开发者更容易地管理应用的状态和副作用。Dva.js 在 React 应用中提供了一种可预测的状态管理方式,并降低了 Redux 的复杂性。dva 是体验技术部开发的 React 应用框架,将上面三个 React 工具库包装在一起,简化了 API,让开发 React 应用更加方便和快捷。

dva = React-Router + Redux + Redux-saga

dva 应用的最简结构

import dva from 'dva';
const App = () => <div>Hello dva</div>;

// 创建应用
const app = dva();
// 注册视图
app.router(() => <App />);
// 启动应用
app.start('#root');

 数据流图

核心概念:

  • State:一个对象,保存整个应用状态
  • View:React 组件构成的视图层
  • Action:一个对象,描述事件
  • connect 方法:一个函数,绑定 State 到 View
  • dispatch 方法:一个函数,发送 Action 到 State

State 和 View

State 是储存数据的地方,收到 Action 以后,会更新数据。

View 就是 React 组件构成的 UI 层,从 State 取数据后,渲染成 HTML 代码。只要 State 有变化,View 就会自动更新。

Action


Action 是用来描述 UI 层事件的一个对象。

{
  type: 'click-submit-button',
  payload: this.form.data
}

connect 方法

connect 是一个函数,绑定 State 到 View。

import { connect } from 'dva';

function mapStateToProps(state) {
  return { todos: state.todos };
}
connect(mapStateToProps)(App);

connect 方法返回的也是一个 React 组件,通常称为容器组件。因为它是原始 UI 组件的容器,即在外面包了一层 State。

connect 方法传入的第一个参数是 mapStateToProps 函数,mapStateToProps 函数会返回一个对象,用于建立 State 到 Props 的映射关系。

dispatch 方法

dispatch 是一个函数方法,用来将 Action 发送给 State。

dispatch({
  type: 'click-submit-button',
  payload: this.form.data
})

dispatch 方法从哪里来?被 connect 的 Component 会自动在 props 中拥有 dispatch 方法。

connect 的数据从哪里来?

dva 应用的最简结构(带 model)

// 创建应用
const app = dva();

// 注册 Model
app.model({
  namespace: 'count',
  state: 0,
  reducers: {
    add(state) { return state + 1 },
  },
  effects: {
    *addAfter1Second(action, { call, put }) {
      yield call(delay, 1000);
      yield put({ type: 'add' });
    },
  },
});

// 注册视图
app.router(() => <ConnectedApp />);

// 启动应用
app.start('#root');

数据流图 1

数据流图 2

app.model

dva 提供 app.model 这个对象,所有的应用逻辑都定义在它上面。

const app = dva();

// 新增这一行
app.model({ /**/ });

app.router(() => <App />);
app.start('#root');

Model 对象的例子

{
  namespace: 'count',
  state: 0,
  reducers: {
    add(state) { return state + 1 },
  },
  effects: {
    *addAfter1Second(action, { call, put }) {
      yield call(delay, 1000);
      yield put({ type: 'add' });
    },
  },
}

Model 对象的属性

  • namespace: 当前 Model 的名称。整个应用的 State,由多个小的 Model 的 State 以 namespace 为 key 合成
  • state: 该 Model 当前的状态。数据保存在这里,直接决定了视图层的输出
  • reducers: Action 处理器,处理同步动作,用来算出最新的 State
  • effects:Action 处理器,处理异步动作

Reducer

Reducer 是 Action 处理器,用来处理同步操作,可以看做是 state 的计算器。它的作用是根据 Action,从上一个 State 算出当前 State。

一些例子:

// count +1
function add(state) { return state + 1; }

// 往 [] 里添加一个新 todo
function addTodo(state, action) { return [...state, action.payload]; }

// 往 { todos: [], loading: true } 里添加一个新 todo,并标记 loading 为 false
function addTodo(state, action) {
  return {
    ...state,
    todos: state.todos.concat(action.payload),
    loading: false
  };
}

Effect

Action 处理器,处理异步动作,基于 Redux-saga 实现。Effect 指的是副作用。根据函数式编程,计算以外的操作都属于 Effect,典型的就是 I/O 操作、数据库读写。

function *addAfter1Second(action, { put, call }) {
  yield call(delay, 1000);
  yield put({ type: 'add' });
}

Generator 函数

Effect 是一个 Generator 函数,内部使用 yield 关键字,标识每一步的操作(不管是异步或同步)。

call 和 put

dva 提供多个 effect 函数内部的处理函数,比较常用的是 callput

  • call:执行异步函数
  • put:发出一个 Action,类似于 dispatch

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1104276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ps:变形

Ps菜单&#xff1a;编辑/变换/变形 Edit/Transform/Warp 变形 Warp是自由变换的一种模式&#xff0c;不仅可以用于物体的伸缩扭曲&#xff0c;也可用于人体的局部塑形。 除了从菜单打开&#xff0c;通常情况下&#xff0c;按 Ctrl T 进入自由变换&#xff0c;然后在画面上右击…

stm32 cubeide 闪退 显示self upgrade failed

更新或安装新版cubeide时&#xff0c;可能会出现打开后一段时间直接闪退&#xff0c;显示如下图。此时怎么折腾cubeide都是没用的。应该去升级stm32 cubemx。记得打开cubemx时选择用管理员身份打开&#xff0c;升级完成后重新开打。然后尝试打开cubdeide&#xff0c;如果继续报…

钢铁异常分类140篇Trans 学习笔记 小陈读paper

钢铁异常分类 对比学习 比较好用 1.首先&#xff0c;为每个实例生成一对样本&#xff0c; 来自同一实例的样本被认为是正例&#xff0c; 来自不同实例的样本被认为是负例。 2.其次&#xff0c;这些样本被馈送到编码器以获得嵌入。 3.在对比损失[16]的影响下&#xff0c; …

一文了解 Amazon DataZone 使用指南

Amazon DataZone 现已正式发布。作为一项新的数据管理服务&#xff0c;它能够在组织中对数据生产者和消费者之间产生的数据进行编目、发现、分析、共享和管理。 通过 Amazon DataZone&#xff0c;数据生产者可使用 Amazon Glue 数据目录和 Amazon Redshift 表格中的结构化数据资…

如何优化模型渲染性能

1、提高模型渲染性能的好处 优化模型渲染性能有以下几个好处&#xff1a; 提高用户体验&#xff1a;良好的模型渲染性能可以使图形应用程序更加流畅和响应快速。当模型以较高的帧率渲染时&#xff0c;用户可以获得更流畅、更真实的视觉效果&#xff0c;提升整体的用户体验。 …

Jmeter性能测试(压力测试)

1.先保存 2.添加请求&#xff08;即添加一个线程组&#xff09; 3.添加取样器&#xff08;在线程组下面添加一个http请求&#xff09; 场景1&#xff1a;模拟半小时之内1000个用户访问服务器资源&#xff0c;要求平均响应时间在3000毫秒内&#xff0c;且错误率为0&#xff0…

BI工具-DataEase(2) 基础使用

先讲下工具栏,分别是仪表盘,数据集,数据源,模板市场等等. 和大多数的BI工具一样,首先配置的就是数据源 1. 数据源:支持OLTP,OLAP,数仓/数据湖,我们这边还是使用的mysql 新建mysql数据源,填写配置信息 2. 数据集支持Excel,SQL,关联数据集等等,新建SQL数据集,输出SQL语句 点击运…

软考-面向对象技术

面向对象的基本概念 对象&#xff1a;属性&#xff08;数据&#xff09; 方法&#xff08;操作&#xff09; 对象ID类&#xff08;实体类、控制类/边界类&#xff09;继承与泛化&#xff1a;复用机制封装&#xff1a;隐藏对象的属性和实现细节&#xff0c;仅对外公开接口多态&…

【JavaEE】Callable 接口

Callable 是一个 interface . 相当于把线程封装了一个 “返回值”. 方便程序猿借助多线程的方式计算结果. 实现Callable也是创建线程的一种方法&#xff01;&#xff01;&#xff01;&#xff01; Callable的用法非常接近于Runnable&#xff0c;Runnable描述了一个任务&#…

C语言中static关键字用法

C语言中static关键字用法 2021年7月28日席锦 static关键字在c语言中比较常用&#xff0c;使用恰当能够大大提高程序的模块化特性&#xff0c;有利于扩展和维护。但是对于c语言初学者&#xff0c;static由于使用灵活&#xff0c;并不容易掌握。 变量 1.局部变量 普通局部变量是再…

智能手表上的音频(二):驱动

上一篇讲了智能手表上音频系统的架构和应用场景。从本篇开始讲具体的&#xff0c;首先讲音频相关的驱动&#xff0c;主要包括IPC&#xff08;inter-processor communication&#xff0c;核间通信&#xff0c; 即AP/CP/ADSP之间的通信&#xff09;的driver 和audio的driver。首先…

讯飞星火3.0版发布前瞻,生产力将大幅提升

AI头部企业科大讯飞宣布&#xff0c;即将在10月24日发布讯飞星火认知大模型3.0版。新版本将极大提升生产力&#xff0c;并开启大规模AI应用产业落地。 一、讯飞星火大模型3.0版即将升级发布 科大讯飞是AI人工智能技术、智能语音识别技术领域的全球领先企业&#xff0c;也是大…

垃圾回收器、垃圾回收算法、空间分配担保、JVM调优、GC回收对象的过程

文章目录 &#x1f34a; 垃圾回收器、垃圾回收算法、空间分配担保&#x1f389; Serial&#x1f389; ParNew&#x1f389; Parallel scavenge&#x1f389; 复制算法&#x1f389; 分代收集算法&#x1f389; 进入老年代的几种情况&#x1f4dd; 空间分配担保 &#x1f389; S…

PCI认证:为什么它对你的业务至关重要,以及如何成功获得认证?

PCI认证是保障你的业务安全和合规性的重要工具。它是一个由支付卡行业安全标准委员会(PCI SSC)提供的全球性标准&#xff0c;旨在保护持卡人信息和资金的安全。如果你的企业处理、存储或传输持卡人信息&#xff0c;那么PCI认证就对你的业务至关重要。 为什么PCI认证对你的业务至…

拼接屏新时代:了解OLED透明拼接屏的尺寸与定制选择

在当今科技迅速发展的时代&#xff0c;OLED透明拼接屏作为一项引人注目的创新技术&#xff0c;正在改变我们对于显示屏的认知。 它以其独特的透明性和高清晰度&#xff0c;为用户提供了前所未有的视觉体验。 一、OLED透明拼接屏原理 OLED&#xff08;Organic Light Emitting …

基于 Servlet 的博客系统

基于 Servlet 的博客系统 一、准备工作1、创建项目2、创建包3、导入前端静态页面 二、数据库设计1、blog&#xff08;博客表&#xff09;2、user&#xff08;用户表&#xff09;3、建库建表的 SQL 语句 三、封装数据库操作1、为什么要封装数据库&#xff1f;2、封装数据库的连接…

最高频的五个面试题

目录 1.JavaSE阶段&#xff1a;谈谈啥是多态 2.数据结构阶段&#xff1a;谈谈哈希表 3.数据库阶段&#xff1a;谈谈事务 4.操作系统阶段&#xff1a;谈谈进程和线程的区别联系 5.网络阶段&#xff1a;TCP三次握手和四次挥手 1.JavaSE阶段&#xff1a;谈谈啥是多态 多态&a…

解决方案-LBS用户位置Redis-GEO附近人/店铺

附近人 windows安装附近人列表功能mysqlredis GEO CNNVD-201511-230 未授权访问python 多线程 redis大端模式与小端模式IP地址的不同表现形式1.字符串表现形式2. 整数表现形式3.大小端模式下的IP地址 0x01 进入python正题Python的socket库1.socket.socket(family,type)2.socket…

【前端学习】—多种方式实现数组拍平(十一)

【前端学习】—多种方式实现数组拍平&#xff08;十一&#xff09; 一、数组拍平 数组拍平也叫数组扁平化、数组拉平、数组降维&#xff0c;指的是把多维数组转化为一维数组。 二、使用场景 复杂场景下的数据处理&#xff08;echarts做大屏数据展示&#xff09; 三、如何实…

华硕U盘盘重装Win10系统步骤图解

重装操作系统是在电脑系统遇到问题或者需要清除所有数据时的一种常见解决方法。但是&#xff0c;很多使用华硕电脑的新手用户&#xff0c;不清楚具体的操作步骤&#xff0c;接下来小编就给介绍关于利用U盘给华硕电脑重装Win10系统的方法&#xff0c;帮助用户们更快地完成系统的…