antd design框架实现后台数据请求

Antd Design使用须知

使用antd design框架首先要明白,他和react一样是个单项数据绑定,不像angularjs或者vue的双向数据绑定。

对于后台数据操作一般是封装在model类中,而model类结构一般分为:

 namespace: 'modelspace', //model唯一名称
    state: {              //state为绑定的数据对象,与angularjs的$scope一样
        ...
    },
    subscriptions: {      //订阅的内容
        setup({ dispatch, history}){ //启动时执行(一般用于数据初始化,例如更新页面的时候要初始化更新之前的数据)

        }
    },
    effects: {            //对后台服务器进行调用(例如调用后台查询接口,保存接口等等)
      *search({ payload }, { select, call, put }){ //search方法,参数:select表示查询state对象,call表示调用其他方法,put为调用reducers方法(用于更新state)
           yield put({type:'showLoading'}); //调用,reducers中的showLoading方法,使得数据请求时,显示加载动画效果
              if(!payload){//判断查询参数是否为空,如果为空,则初始化默认的参数
                payload = {
                  currentPage:1,
                  pageSize:10,
                }
              }
           const { list,pagination } = yield call(searchList,payload);//调用后台接口
          if (list) { //将返回结果通过reducers的searchSuccess,更新到state中
            yield put({
              type: 'searchSuccess',
              payload: {
                list: list,
                pagination:pagination
              }
            });
          }
        },
    },
    reducers: {
        showLoading(state, action){ //设置loadding信息,使得请求数据时,展示加载动画效果
          const result = { ...state, loading: {spinning:true,tip:'加载中',delay:200} };
          return result;
        },
        searchSuccess(state,action){ //更新后台返回的数据到state中
          state.data = action.payload;
          return {...state,loading:false};
        },
    }

接下来看一个antd design的洁面效果:

处理流程

antd design的数据请求流程如下图所示:

代码部分

页面层,page/products.js主要代码如下:


import styles from './products.less';
import { Component,Fragment } from 'react';
import { connect } from 'dva';
import { Form, Row, Col, Card,Input, Button, Icon,Popconfirm,Divider } from 'antd';
import SearchForm from '../components/SearchForm';
import StandardTable from '../components/StandardTable';

const Products = ({ dispatch, products }) => {

  console.log(this)

  function handleDelete(id) {
    dispatch({
      type: 'products/delete',
      payload: id,
    });
  }

  function handleUpdate(id) {
    dispatch({
      type: 'products/query',
      payload: id,
    });
  }

  function onChange(pagination, filtersArg, sorter) { //分页参数

    const params = { //封装分页参数
      currentPage: pagination.current,
      pageSize: pagination.pageSize,
    };


    dispatch({ //通过dispatch方法调用model的effects的search方法
      type: 'products/search',
      payload: params,
    });
  }

  function getFields(){
    const count = products.expand ? 10 : 6;
    const { getFieldDecorator } = this.props.form;
    const children = [];
    for (let i = 0; i < 10; i++) {
      children.push(
        <Col span={8} key={i} style={{ display: i < count ? 'block' : 'none' }}>
          <Form.Item label={`Field ${i}`}>
            {getFieldDecorator(`field-${i}`, {
              rules: [
                {
                  required: true,
                  message: 'Input something!',
                },
              ],
            })(<Input placeholder="placeholder" />)}
          </Form.Item>
        </Col>,
      );
    }
    return children;
  }


  const columns = [
    {
      title: '姓名',
      dataIndex: 'name',
    },
    {
      title: '性别',
      dataIndex: 'sex',
    },
    {
      title: '操作',
      render: (text, record) => (
        <Fragment>
          <a href="#" >查询</a>
          <Divider type="vertical" />
          <a href="javascript:void(0)" onclick={()=>{handleUpdate(record.id)}}>修改</a>
          <Divider type="vertical" />
          <a href="javascript:void(0)" onclick={()=>{handleDelete(record.id)}}>删除</a>
        </Fragment>
      ),
    },
  ];

  return (
    <div>
      <Card bordered={false}>
        <div className={styles.tableList}>
          <div className={styles.tableListForm}>
            <SearchForm />
          </div>
          <div className={styles.tableListOperator}>
            <Button icon="plus" type="primary">
              新建
            </Button>
          </div>
        </div>
        {/*<ProductList onDelete={handleDelete} onUpdate={handleUpdate} products={products} />*/}
        <StandardTable
          selectedRows={products.selectedRows}
          loading={products.loading}
          data={products.data}
          columns={columns}
          onChange={onChange} //分页按钮点击事件
        />
      </Card>
    </div>
  );
};

export default connect(({ dispatch,products }) => ({
  dispatch,products,
}))(Products);

model/products.js代码如下:

/**
 * Create by pengweikang on 2019/5/30.
 */

import { query,searchUser,searchList } from '../services/product';

export default {
  namespace: 'products',
  state: {
    loading:false,
    loadTip:"加载中",
    data:{
      pagination:{pageSizeOptions:['5','10', '20', '30', '40']}
    },
    expand:false,
    selectedRows:[]
  },
  subscriptions: {

    setup({history,dispatch}){
      dispatch({type:'search'});
    }
  },
    effects: {
    *search({ payload }, { select, call, put }){

      yield put({type:'showLoading'});

      if(!payload){
        payload = {
          currentPage:1,
          pageSize:10,
        }
      }

      const { list,pagination } = yield call(searchList,payload);
      if (list) {
        yield put({
          type: 'searchSuccess',
          payload: {
            list: list,
            pagination:pagination
          }
        });
      }
    },
      *query({ payload }, { select, call, put }){

        yield put({type:'showLoading'});

        const { data,page } = yield call(searchUser,payload);
        if (data) {
          yield put({
            type: 'querySuccess',
            payload: {
              list: data,
              total: page.total,
              current: page.current,
              id:payload
            }
          });
        }
      },
  },
  reducers: {
    searchSuccess(state,action){


      state.data = action.payload;
      return {...state,loading:false};

    },
    querySuccess(state,action){
     state.data.list.filter(item =>{
        if(item.id == action.payload.id){
          item.name = action.payload.list[0].name;
        }

      });
      return {...state,loading:false};

    },
    showLoading(state, action){
      const result = { ...state, loading: {spinning:true,tip:'加载中',delay:200} };
      return result;
    },
    delete(state, { payload: id }) {
      return state.filter(item => item.id !== id);
    },
    update(state, { payload: id }) {
      return state.filter(item => {
        if(item.id == id){
          item.name ="update";
        }
        return true;
      });
    },
  },
};

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
React Antd是一个基于React开发的UI组件库,提供了一系列美观、易用的组件,能够帮助我们快速构建前端界面。而一个完整的后台项目框架首先需要具备以下几个方面的内容: 1. 路由管理:一个后台项目通常会有很多不同的页面,因此需要一个路由管理器来管理不同页面之间的切换。React Antd提供了React Router库来实现路由管理,我们可以通过配置路由信息来指定每个页面对应的路径,帮助我们实现页面间的跳转。 2. 权限管理:后台项目通常会有一些权限控制的需求,比如某些用户只能访问特定的页面或者执行特定的操作。React Antd提供了权限管理相关的组件,如Menu、Button等,我们可以根据不同的用户角色显示或隐藏某些功能。 3. 状态管理:一个完整的后台项目通常会有很多需要共享的状态,比如用户信息、页面数据等。React Antd本身并不提供状态管理解决方案,但可以与Redux、Mobx等状态管理工具配合使用,帮助我们管理全局的状态数据。 4. 表单验证:后台项目中经常需要进行表单验证,以确保用户输入的数据符合要求。React Antd提供了Form组件,可以方便地实现表单验证功能,如必填项校验、数据格式校验等。 5. 数据交互:后台项目通常需要与后端进行数据交互,如获取用户信息、提交表单数据等。React Antd并没有提供专门的数据交互解决方案,通常我们可以使用Axios等第三方库来实现数据请求和响应。 综上所述,React Antd提供了一套美观、易用的UI组件,可以帮助我们快速构建后台项目。但在构建一个完整的后台项目框架时,我们还需要根据项目的具体需求,结合以上提到的几个方面来进行完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值