dva model和组件的实际运用

本文详细介绍了如何使用DvaJS框架和Ant Design组件库进行高效Web应用开发,包括状态管理、组件渲染及异步数据加载等关键环节。通过具体实例,展示了如何利用DvaJS的model、effects和reducers处理复杂业务逻辑,以及Ant Design在界面设计上的灵活运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运用到的技术

dvaJS
antd Design

./model/nyltest/index.js

import { get } from 'api';
export default {
  namespace: 'nyltest', 
  state: {
    nylName: 'nielonglong',
    nylAge: 22,
    current2: 1,
    total2: 0,
    searchParams: {},
    recipeList: [],
    totalData: {},
  },

  // effects中处理异步函数
  effects: {
    *getRecipeData_nyl({ payload }, {call, put, select}) {
      const { searchParams } = yield select(state => state.testnyl);
      // get 是api.js中封装点的get请求方法
      const data = yield call(get, '接口url', { ...searchParams, ...payload });
      // 保存数据, payload里面的值 更新UI
      yield put({
        type:'save', // save是reducer中的save方法
        payload:{
          recipeList: data.items,
          current2: payload.page,
          total2: data.count,
        },
      });
    }
  },

  // reducers处理同步函数
  reducers: {
    // 同步保存到sate
    save(state, { payload }) {
      console.log({...state, ...payload})
      return {...state, ...payload} //{...变量1, ...变量2} 合并两个对象为一个对象
    }
  },
};

./routes/Nyltest/index.js

import React, { Component } from 'react';
import { connect } from 'dva';
import { columns1, columns2 } from './colums';
import styles from './index.less';
import { Tabs, Button, Card, Row, Col, Table, Input, DatePicker } from 'antd';
const TabPane = Tabs.TabPane;

// 方式1关联model (ES7语法糖)
@connect((state) => ({
  nyltestData: state.nyltest,
}))

export default class Nyltest extends Component{

  constructor(props) {
    super(props)
    this.requestData()
  }
  componentDidMount() {
    let p1 = {name: '张三'}
    let p2 = {age: '男'}
    console.log({...p1, ...p2})
  }

  //
  requestData = (page = 1, per = 3) => {
    console.log('page='+ page, 'per=' + per)
    this.props.dispatch({
      type:'nyltest/getRecipeData_nyl',
      payload: {
        page,
        per
      },
    });
  };

  // 第一个参数p代表当前页, p2代表每页的大小, 形参名字随意取, 但是顺序唯一
  pageFunc = (p, p2) => {
    console.log('p='+p+'p2='+p2)
  }


  render() {
    const { nyltestData } = this.props
    const { nylName, nylAge, recipeList, current2, total2 } = nyltestData;
    return (
      <div style={{background: '#fff'}}>
        <h4>{nylName}</h4>
        <h4>{nylAge}</h4>

        <Tabs defaultActiveKey='1'>
          <TabPane tab='栏目1' key='1'>
            <div>chufang</div>
          </TabPane>

          <TabPane tab='栏目2' key='2'>
            <div>
              <Table columns={columns2}
                     dataSource={ recipeList }
                      pagination={{ current:current2, total: total2, pageSize: 3,  onChange: this.requestData  }}
//                      pagination={{ current:current2, total: total2, pageSize: 3,  onChange: this.pageFunc  }}
/>
                      
            </div>
          </TabPane>
        </Tabs>
      </div>
    )
  }
}
/*

// 方式2关联model 如果用这种方式 class前面需要去掉export default
function mapStateToProps(state) {
  return {
name1: state.nyltest.nylName,
  age1: state.nyltest.nylAge,
  };
}

export default connect(mapStateToProps)(Nyltest);
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值