React 数据状态管理 Dva

安装 Dva 依赖

通过 npm 安装 dva-cli 并确保版本是 0.9.1 或以上。

cnpm install dva-cli -g

 

定义 Model

新建 model models/products.js :

import Api from 'globals/api/getGoodsDetails';

export default {

  namespace: 'Test', // 命名空间,connect时调用具体空间下的state

  state: {
    stock: 0,
  },

  effects: {
    // umi只支持* yield写法, 类似 ES7的async/await 写法
    *requireData({ payload }, { call, put, select }) {

      const stock = yield select((state) => state.Test.stock)

      const { dm_error, data: productStock } = yield call(Api.getProductStock, {
        ...payload,
      }); // 异步操作,在此处做请求,根据传回参数写回调

      if (+dm_error === 0 && productStock) {
        yield put({ type: 'setProductStock', payload: { productStock } }); // 同步操作,type为reducers中的函数
      }

    },
  },
  reducers: {
    setProductStock(state, { payload }) {
      state.stock = payload.productStock;
    },
  },
  subscriptions: {
    // 注册 model 默认订阅的事件,相当于把一些初始化的dispatch放在此处默认按序执行
    setup({ dispatch }) {
      dispatch({ type: 'setProductStock', payload: { productStock:1 }         
     });
    }
  },
};


这个 model 里:

  • namespace: 当前 Model 的命名空间
  • state: 该 Model 当前的状态。数据保存在这里,直接决定了视图层的输出
  • reducers: Action 处理器,处理同步动作,在此处理State
  • effects:Action 处理器,处理异步动作
  • action:传递的参数对象,内含payload及其它参数
  • payload:传参固定key值,内含自己调用的参数
  • call:执行异步函数
  • put:发出一个 Action,类似于 dispatch
  • select:用于在effect中通过yield获得state的数据

 

reducers中对state数据的处理(嵌套增删改查)

 

使用 model 状态管理

Father 组件 

import React, { Component } from 'react';
import api from '../api';
import { Helmet, connect } from 'umi';
import Son from './son.js'

class Father extends Component {

  // 服务端请求
  static getInitialProps = async ctx => {
    
      const { isServer, history = umiHistory, store } = ctx;
      const { location: { query } } = history;

      // if ( isBrowser() ) return; // 若服务端请求暴露到props的数据满足页面渲染,浏览器可不再次渲染

      const { dispatch, getState } = store;
      const params = { stock: 0, ...query, ctx };

      // 服务端请求,用于渲染meta标签的数据
      let serverData = await dispatch({ type: 'Test/goodsDetails', payload: params });
      // 可以通过dispatch({}).then(()=>{}) 的方式写回调

      return serverData;
  }

  componentDidMount() {

    // connect组件后自动注入dispatch函数到props,用于调用reducers的函数
    // type中的写法为 '命名空间/调用函数'
    // payload为传入的参数,请求无参数时需省略
    // 此处父组件需要调用一次获取初始数据的reducers,子组件connect了model后才能直接使用props数据
    this.props.dispatch({
      type: 'Test/setProductStock',
      payload: { productStock: 123 },
    });

  }

  render() {
    return <div>
      <Helmet>
        <meta property="og:title" content={`服务端渲染动态Meta标签${this.props.serverData.title}`} />
        <title>My Title</title>
      </Helmet>

      <Son></Son>
    </div>
  }
}

export default Father;

son 组件

import React, { Component } from 'react';
import api from '../api';
import { connect } from 'umi';

class Son extends Component {

  componentDidMount() {

  }

  handle(){
    this.props.dispatch({
      type: 'Test/setProductStock',
      payload: { productStock: 123 },
    });
  }

  render() {
    return <div>
      <button onClick={()=>{this.handle()}}>点击设置${this.props.}</button>
    </div>
  }
}

// mapStateToProps函数(约定规范),将state里的数据注入到组件的props
function mapStateToProps(state) {
  const { stock } = state.Test; // 连接刚才定义的命名空间的model进行值的解构
  return { stock };
}

export default connect(mapStateToProps)(Son);

 

详细使用教程:https://www.ahwgs.cn/ruheshiyongdvayufuwuduanjinxingshujujiaohu.html

 

 

 

 

 

 

 

 

 

 

 

在使用React、Umi和dva组合开发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 ``` 这将会生成优化后的静态文件,可以部署到任何静态文件服务器上。 这些步骤为你提供了如何使用React、Umi和dva组合进行Web应用开发的基础。随着项目的深入,你可能还需要了解更多的高级特性,比如插件、中间件、路由配置、布局组件等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值