dva内容简易了解

简介: dva内容简易了解

dva内容简易了解


组件component

模型状态model

连接connect

使用


组件component



这个就不多说了,创建component的大家都会,配合umi来说的话就是在components文件文件夹中创建。


模型状态model



dva 通过 model 的概念把一个领域的模型管理起来,包含同步更新 state 的 reducers,处理异步逻辑的 effects,订阅数据源的 subscriptions 。


一个model大概如此:

export default {
  namespace: 'products',
  state: {
    ...
  },
  effects: {
    *fun1({ payload }, { call, put, select }) {
       const data = yield call(接口_name, { 入参_obj });
       yield put({type: 'save', payload: data })
       const state = yield select(_ => _.products)
       ...
    },
    *fun2({ payload }, { call, put, select }) {},
  },
  subscriptions: {
    setup({dispatch, history}) {
      history.listen(({pathname}) => {
        if (pathname === '/layouts' || pathname.indexOf('/layouts/') === 0) {
          //可在此时执行某异步effets,可以用于加载该路由页面组件一进入就需要的数据
          dispatch({type: 'effects_name', payload: { obj }});
        }
      });
    },
  },
  reducers: {
    save(state, action) {
      return {
        ...state,
        ...action.payload,
      };
    },
  },
};

namespace,定义model的名字,一般与相关联的组件名一一对应。


state,作为这个model的状态。


effects,采用es6的Generator函数定义异步的方法,一般是用于请求接口,对应数据库的增删改查。


effects中有几个传入的方法call、put、select,一般都是先使用call进行接口的访问获取数据,使用put来执行reducers中的操作(通常是save)用获取来的数据更新state,select可以在effect中获取该model中当前的state,此处的products是model的namespace。

const data = yield call(接口_name, { 入参_obj });
yield put({type: 'save', payload: data })
const state = yield select(_ => _.products)

subscriptions,可以用于路由的监听:

  subscriptions: {
    setup({dispatch, history}) {
      history.listen(({pathname}) => {
        if (pathname === '/layouts' || pathname.indexOf('/layouts/') === 0) {
          //可在此时执行某异步effets,可以用于加载该路由页面组件一进入就需要的数据
          dispatch({type: 'effects_name', payload: { obj }});
        }
      });
    },
  },

reducer,用于定义普通方法,比如用于修改state状态的函数,大多项目只需要一个save,也就是覆盖原state。


reducers: {
    save(state, action) {
      return {
        ...state,
        ...action.payload,
      };
    },
  },

连接connect


在组件中使用connect将component与model建立连接,通常一个component对应一个model,常见代码如下:

//普通组件
export default connect(({ model_namespace }) => ({
  model_namespace
}))(component_name);
//需要路由跳转的组件
export default withRouter(connect(({ model_namespace }) => ({
  model_namespace
}))(component_name));

使用


model_namespace作为model的名称,也是这个model的state对象名称,它保存在该组件的props中,在组件中使用起来也很容易,在组件render函数return之前用解构赋值取出中model_namespace对象中的属性值,然后就可以使用了。


render(){
  const { model_namespce : { data1, data2 } } = this.props
  return ...
}

修改状态,也就是调用effects和reducers中的方法:


使用this.props上的dispatch,入参是一个对象,两个属性,一个type,一个payload。

type是由/分割的字符串,前面是model的namespace,后面是方法名,可以是effects中的异步方法也可以是reducers中的同步方法。

payload传入参数、新状态。

this.props.dispatch({ type: 'model_namespace/fun_name', payload: { count: 1 } });
相关文章
el-input el-select调整字体及内边距
1. 背景 el-input输入框默认提供的字体较小,且内边距较大。 这是为了提供统一的样式和好看的外观。 在某些情况下,我们希望使用较大的字体,且让输入框的内边距小一些以便容纳更多东西。
3035 0
|
5月前
|
人工智能 安全 机器人
快手封号人工解封?是真吗
一、平台封禁机制的技术原理 快手采用"AI识别+人工复核"的双层审核体系:
|
7月前
|
IDE 数据可视化 程序员
一文讲透:低代码平台是什么?低代码平台应该如何挑选?
低代码(Low Code)是一种通过可视化和配置化方式快速开发应用的技术工具平台,旨在减少手动编码量,提升开发效率。2014年Forrester定义其为“快速交付应用并简化部署”的工具,随后Gartner推广aPaaS/iPaaS概念,进一步推动其发展。低代码平台适用于数据管理、业务逻辑处理、权限控制、审批流程、报表分析等场景,支持手机访问、版本管理和日志记录等功能。挑选低代码平台需关注数据、逻辑、权限等11个关键问题。对程序员而言,低代码不仅降低开发门槛,还助力个人向产品/项目经理转型,创造更高价值。
1182 32
ThreeJs绘制贝塞尔曲线
这篇文章介绍了如何利用Three.js绘制贝塞尔曲线,并提供了实现的代码示例与说明。
223 2
ThreeJs绘制贝塞尔曲线
|
运维 关系型数据库 MySQL
【运维面试100问】(三)说说你在故障排除方面的经历_运维面试故障排查类面经
【运维面试100问】(三)说说你在故障排除方面的经历_运维面试故障排查类面经
【运维面试100问】(三)说说你在故障排除方面的经历_运维面试故障排查类面经
|
机器学习/深度学习 自然语言处理 数据可视化
开箱即用!智能文档处理“百宝箱“
10 月 24 日至 26 日,CSDN 第五届“1024 程序员节”在长沙召开。合合信息的常扬老师分享了智能文档处理“百宝箱”,包括 TextIn ParseX、acge-embedding 和 markdown_tester 三种工具。这些工具解决了文档解析中的版式复杂、解析错误、语义信息丢失等问题,适用于文字工作者和机器学习研究人员。TextIn ParseX 是一个可视化工具,支持多种格式输出,acge-embedding 模型用于文本向量化,而 markdown_tester 则用于文档解析效果的定量评估。
252 0
|
JavaScript 前端开发
JavaScript的`apply`方法:函数的“应用”与“调用”
JavaScript的`apply`方法:函数的“应用”与“调用”
|
存储 关系型数据库 MySQL
【MySQL探索之旅】MySQL数据库下载及安装教程
【MySQL探索之旅】MySQL数据库下载及安装教程
|
安全 Java 大数据
SpringBoot+Mybatis 实现动态数据源切换方案
SpringBoot+Mybatis 实现动态数据源切换方案
1433 1
|
弹性计算 对象存储 CDN
阿里云服务器公网流量怎么收费的?多少钱1GB?
阿里云服务器公网流量怎么收费的?多少钱1GB?阿里云服务器公网带宽计费模式按固定带宽和按使用流量哪个划算?阿里云百科以北京地域为例,按固定带宽计费1M带宽一个月23元,按使用流量计费1GB流量0.8元,如果云服务器带宽使用率低于10%,那么首选按使用流量计费,如果带宽实际利用率较高的话,按固定带宽计费更划算一些
2027 0
阿里云服务器公网流量怎么收费的?多少钱1GB?