react mockjs模拟数据请求

直接通过dva new dva-quickstart直接创建项目

首先引入mockjs

npm install mockjs

先实现一个简单GET请求
在目录的最外层有一个mock文件夹,生成随机数据都放在这里
创建一个cs.js和data.js两个文件
data.js里放的是默认数据

data.js
export default[
    {
        id:1,
        name:'a',
        age:13,
        type:1,
    },
    {
        id:2,
        name:'b',
        age:22,
        type:1,
    },
    {
        id:3,
        name:'c',
        age:33,
        type:1,
    }
]

cs.js中放的是模拟接口,写一个GET请求,没有参数,直接返回所有数据

import data from './data'

export default {
    'GET /api/info': {
        message: '201',
        data,
    },
}

创建一个简单显示js文件,index.js,我比较喜欢用class组件,在componentWillMount生命周期中,进行请求,获取数据,然后在return中遍历数据,显示 li 。 export default connect导出组件。

import React, { Component } from 'react'
import { connect } from 'dva';

class index extends Component {

componentWillMount() {
    const { dispatch } = this.props
    dispatch({
        type: 'cs/fetch',
    })
}
 render() {
  const { cs: { list } } = this.props
 return (
            <div>
                <ul>
                    {list.length > 0 ? list.map(item => (
                        <li key={item.id}>{item.name + " " + item.age} </li>
                    )) : ''}
                </ul>
            </div>
    )
 }
}
export default connect(({ cs }) => ({
    cs,
}))(index);

然后在services文件中创建一个cs.js文件

import request from '../utils/request';

export function query() {
    return request('/api/info', {
        method: 'GET'
    });
}

接着model文件中创建一个cs.js文件

import {query} from '../services/cs'

export default {

    namespace: 'cs',

    state: {
        list: []
    },
    
  effects: {
    *fetch({ payload }, { call, put }) {  // eslint-disable-line
        const res = yield call(query,payload)
        const {data} = res
        yield put({ type: 'save',payload:{data }});
    },
     reducers: {
    save(state, action) {
        return { ...state, list: action.payload.data };
    },
 },

};

修改.roadhogrc.mock.js配置文件

const mock = {}
require('fs').readdirSync(require('path').join(__dirname + '/mock')).forEach(function(file) {
    Object.assign(mock, require('./mock/' + file))
})
module.exports = mock

最外层的index.js文件中引入model

app.model(require('./models/cs').default);

这样简单的一个GET请求就完成了

再来完成一个账号登录的POST请求
index.js中的显示部分,我直接使用antd的Form组件

	const layout = {
        labelCol: { span: 8 },
        wrapperCol: { span: 16 },
    };
    const tailLayout = {
        wrapperCol: { offset: 8, span: 16 },
    };
    
	<Form
        {...layout}
         name="basic"
         onFinish={this.onFinish}
      >
     <Form.Item
            label="Username"
            name="username"
            rules={[{ required: true, message: 'Please input your username!' }]}
           >
          <Input />
           </Form.Item>

          <Form.Item
               label="Password"
              name="password"
              rules={[{ required: true, message: 'Please input your password!' }]}
               >
              <Input.Password />
       	 </Form.Item>


          <Form.Item {...tailLayout}>
              <Button type="primary" htmlType="submit">
                   Submit
               </Button>
           </Form.Item>
  </Form>

在onFinish中,发送请求

 onFinish = (values) => {
        const { dispatch } = this.props
        dispatch({
            type: 'cs/login',
            payload: {
                ...values
            },
            success: () => {
                message.success("登录成功")
            },
            error: () => {
                message.error("登录失败")
            }
        })
    }

在services文件中的cs.js文件加入

export function login(param) {
    return request('/api/login', {
        method: 'POST',
        body:param
    });
}

在models文件中的cs.js文件加入

*login({payload,success,error},{call}){
            const res = yield call(login,payload)
            if(res.message == 500){
                error && error()
            }else{
                success && success()
            }
        },

在mock文件中的cs.js文件加入

'POST /api/login': (req, res) => {
        const { password, username } = req.body;
        if (password === '123' && username === 'admin') {
            res.send({
                message: '201',
                data:'登录成功'
            });
            return;
        }
        res.send({
            message: '500',
            data:'登录失败'
        });
    },

这样一个完整的POST的模拟登录请求就完成了

完整项目下载路径如下
https://download.csdn.net/download/qq_40492771/12682918
上传项目的node_modules文件我删,先npm install一下

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值