React Umi 集成 Dva框架简化数据传输流向原理篇

一、基本概念

dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,还额外内置了

react-router 和 fetch,所以也可以理解为一个轻量级的应用框架。

  • 易学易用,仅有 6 个 api,对 redux 用户尤其友好,配合 umi 使用后更是降低为 0 API
  • elm 概念,通过 reducers, effects 和 subscriptions 组织 model
  • 插件机制,比如 dva-loading 可以自动处理 loading 状态,不用一遍遍地写 showLoading 和 hideLoading
  • 支持 HMR,基于 babel-plugin-dva-hmr 实现 components、routes 和 models 的 HMR
     

个人理解 :简化了React的setState跨组件传输数据的耦合,数据通过mapStateToProps

就可以共享数据,并且比Redux传输数据操作要更简单,可以自动处理等待状态,如果会

Redux入门可以更迅速 ,更快的上手。

二、代码详解

可以通过  npm install  dva-cli  或  yarn add dva-cli 安装

创建model文件夹和viewer.js

export default {

  namespace: "viewer",

  state: {
    cesiumViewer:undefined
  },

  subscriptions: {
    setup({ dispatch, history }) {  // eslint-disable-line
    },
  },
  effects: {
    * fetch({ payload }, { call, put }) {  // eslint-disable-line
      yield put({ type: "save" });
    }
  },
  reducers: {
    /**
     *
     * @param {*}state 状态
     * @param {*}action 动作
     * @returns {*} 结果
     */
    save(state, action) {
      return { ...state, ...action.payload };
    },
    /**
     *
     * @param {*}state 状态
     * @param {*}action 动作
     * @returns {*} 结果
     */
    changeAction(state, action){
      return { ...state, ...action.payload };
    }
  },
}

namespace:可以通过空间名找到对应的model下的 viewer.js
state: {cesiumViewer:undefined} 存储共享的数据
subscriptions:常用来监听浏览器地址输入的参数
effects:异步处理
reducers:同步处理
save:自定义方法里的 state为当前的数据,action.payload为传过来要改变的数据

调用save方法只需要用  dispatch type类型为 namespace(viewer) 和自定义方法名(save)  payload 传递改变的参数

    this.props.dispatch({
      type: "viewer/save",
      payload: {
        cesiumViewer:123456
      },
    });

save 加上回调和异常处理则为

    this.props.dispatch(
      {
        type: "viewer/save",
        payload: {
           cesiumViewer:123456
        },
        callback:(result)=>{
          console.log(result)
        },
        errorcallback:()=>{
          message.warning("服务异常");
        }
      }
    )

需要拿到共享参数则为 this.props.viewer.cesiumViewer 就可以拿到 viewer 空间下的共享数据

function mapStateToProps(state) {
  return {
    viewer:state.viewer,
  };
}
export default connect(mapStateToProps)(绑定的class);

三、Dva原理图

数据的改变发生通常是通过用户交互行为或者浏览器行为(如路由跳转等)触发的,当此类行为会改变数据的时候可以通过 dispatch 发起一个 action,如果是同步行为会直接通过 Reducers 改变 State ,如果是异步行为(副作用)会先触发 Effects 然后流向 Reducers 最终改变 State,所以在 dva 中,数据流向非常清晰简明,并且思路基本跟开源社区保持一致(也是来自于开源社区)。

个人理解:通过URL调用渲染组件初始化dom的时候,会通过connect(mapStateToProps) 加载共享数据,并且调用dispatch会触发action 进行同步或异步操作或者监听地址栏是否传入参数的处理。

 

在使用ReactUmidva组合开发Web应用时,你需要遵循一系列步骤来构建和组织你的项目。这里是一个基本的介绍: 1. **创建项目**:首先,你需要创建一个新的Umi项目。Umi是一个可插拔的企业级React应用框架,它可以帮助你快速搭建项目结构,并提供了一些约定和最佳实践。你可以通过命令行使用Umi的脚手架工具来创建新项目: ``` npx umi init my-app cd my-app ``` 2. **安装dva**:dva是一个轻量级的前端框架,它基于Redux和Redux-Saga,提供了一种更简洁的方式来组织你的应用状态和处理数据流。在项目中安装dva: ``` npm install dva ``` 3. **配置路由**:Umi使用约定式路由,你只需要在`src`目录下创建对应的文件和目录来定义你的页面和路由。例如,创建一个`pages`文件夹,并在其中创建`user.js`文件,这将会被识别为一个用户页面,并且对应的路由会被自动生成。 4. **使用dva模型**:在dva中,模型(model)是应用中数据和逻辑的抽象。你需要定义模型来管理状态,并且定义effect来处理异步逻辑。在Umi项目中,你可以创建一个`models`目录来存放你的dva模型。 5. **连接视图和模型**:在React组件中,你可以使用`connect`方法来连接组件和dva模型。这样,你的组件就可以访问模型中的状态,并且可以触发模型中的dispatch来更新状态。 6. **数据流管理**:在dva中,使用Redux的`dispatch`来触发一个action,然后action会调用对应的reducer来更新状态,或者调用effect来处理异步逻辑。这是一个单向数据流的过程,有助于维护状态的一致性和可预测性。 7. **启动和构建项目**:在开发过程中,你可以使用以下命令来启动开发服务器: ``` npm start ``` 当你需要构建项目用于生产环境时,可以使用: ``` npm run build ``` 这将会生成优化后的静态文件,可以部署到任何静态文件服务器上。 这些步骤为你提供了如何使用ReactUmidva组合进行Web应用开发的基础。随着项目的深入,你可能还需要了解更多的高级特性,比如插件、中间件、路由配置、布局组件等。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南归北隐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值