美文网首页
react mockjs模拟数据请求

react mockjs模拟数据请求

作者: 浪天林 | 来源:发表于2020-08-06 11:03 被阅读0次

    我使用的是dva框架,通过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一下

    相关文章

      网友评论

          本文标题:react mockjs模拟数据请求

          本文链接:https://www.haomeiwen.com/subject/stforktx.html