• dva基本用法


    基于 reduxredux-saga 和 react-router 的轻量级前端框架,是支付宝前端应用架构的发展和选择。

    主要代码由4个部分组成:router,modle,routes,service。

    此时,我按照我们项目目前应用某一模块举例(安全联动项目二期指标管理)

    1、route,添加路由配置,示例代码如下:

    {
              path: 'indexmanage/editindex',
              getComponent (nextState, cb) {
                require.ensure([], require => {
                  registerModel(app, require('./models/indexmanage/editindex'))
                  cb(null, require('./routes/indexmanage/editindex/'))
                }, 'editindex')
              },
            },
    View Code

     2、model 是 dva 中最重要的概念,其主要包含 5 个属性:

    1)namespace

     model 的命名空间,同时也是他在全局 state 上的属性,只能用字符串,不支持通过 . 的方式创建多层命名空间。

    2)state

     初始值,每当state改变时,重新刷新页面。

    3)subscriptions

    在初始化时候执行,例如:

    subscriptions: {
        setup ({ dispatch, history }) {
          history.listen((location) => {
            if (location.pathname === '/indexmanage/editindex') {
              dispatch({ type: 'changeworkModalclose' })
            }
          })
        },
      },
    View Code

    4)reducers

     修改state状态,且是唯一能够修改state状态的地方。

    5)effects

     用于处理异步操作和业务逻辑,不直接修改 state,可以应用call和put调用相关方法,一般情况下call调用service方法,put调用本文件方法。

     modle全部示例代码如下:

    import { addAssessmentIndex} from 'services/editindex'
    import { browserHistory } from 'react-router'
    export default {
      namespace: 'editindex',
      state: {
        tableTime: '',
        workModal: {
          visible: false,
        },
      },
    
      subscriptions: {
        setup ({ dispatch, history }) {
          history.listen((location) => {
            // 初始进入页面时,根据业务进行相关方法的执行
            if (location.pathname === '/indexmanage/editindex') {
              location.state.record && dispatch({ type: 'changeworkModal', payload: { ...location.state.record.jobGenerationRule } })
            }
          })
        },
      },
      effects: {
        * changeStates ({
            payload,
          }, { put }) {
          yield put({ type: 'updateStates', payload })
        },
        
        * updateSubdivisionIndex ({ payload }, { put, call, select }) {
          const { fileModal } = yield select(state => state.editindex)
          const { form } = payload
          payload = { ...payload, referenceFile: fileModal.selectedRowKeys.join(',') }
          const res = yield call(updateSubdivisionIndex, payload)
          console.log('res.success', res.success)
          if (res.success) {
            yield put({ type: 'subdivisionSuccess', payload: { form } })
          }
        },
        // 修改、新增细分指标成功后再跳转
        * subdivisionSuccess ({ payload }, { put }) {
          const { form } = payload
          yield put({ type: 'changefileModalclose' })
          yield put({ type: 'changefileModal', payload: { subdivisionloading: false } })
          browserHistory.goBack()
          form.resetFields
        },
    
      },
      reducers: {
        updateStates (state, { payload }) {
          const statr = {
            ...state,
            ...payload,
          }
          return statr
        },
        // 当state里面对象包含其它对象时,此时应该用如下方法改变state的状态,否则会清空其它值
        updatefileModal (state, { payload }) {
          const { fileModal } = state
          const newState = {
            ...state,
            fileModal: { ...fileModal, ...payload },
          }
          return newState
        },
      },
    }
    View Code

     3、routes,主要是渲染页面组件:

    import React from 'react'
    import PropTypes from 'prop-types'
    import { connect } from 'dva'
    
    const Dditindex = ({
      editindex,
      location,
      dispatch,
       }) => {
      const Parameters = location.state
      return (
        <div>
          <AssessmentIndex Parameters={Parameters} editindex={editindex} dispatch={dispatch} />
        </div>
      )
    }
    Dditindex.propTypes = {
      location: PropTypes.object,
      editindex: PropTypes.object,
      dispatch: PropTypes.func,
    }
    export default connect(({ editindex }) => ({ editindex }))(Dditindex)
    View Code

     4、service,主要用于发送异步请求获取数据:

    import { request } from 'utils'
    import { api } from './api'
    
    export async function deleteSubdivisionIndex (params) {
      return request(api.deleteSubdivisionIndex, { data: params })
    }
    
    export async function addSubdivisionIndex (params) {
      return request(api.addSubdivisionIndex, { data: params, showMsg: true })
    }
    View Code

     本项目是利用项目封装的request方法通过feach方式发起异步请求,大家可以根据自己需要采用其它方式。

  • 相关阅读:
    Prism 4 文档 ---第6章 高级MVVM场景
    Prism 4 文档 ---第5章 实现MVVM模式
    Prism 4 文档 ---第4章 模块化应用程序开发
    Prism 4 文档 ---第3章 管理组件间的依赖关系
    Prism 4 文档 ---第2章:初始化Prism应用程序
    阿里人都在使用的在线诊断工具—Arthas
    开发人员如何规范你的Git commit?
    重磅:Java 16 正式发布了!
    MySQL 要分表分库怎么进行数据切分?
    Kafka 中所谓的 ‘零拷贝’ 技术到底是什么?
  • 原文地址:https://www.cnblogs.com/baiyuer666/p/7793820.html
Copyright © 2020-2023  润新知