Dva使用Mock模拟数据

一、fetch请求简单的封装

1、在utils文件夹下创建config.js文件,utils/config.js ,对fetch请求路径进行配置

//config.js文件

const config = {
  apiUrl: process.env.NODE_ENV === 'development' ? ' http://127.0.0.1:7001' : 'https://www.baidu.com',
  apiPrefix: ' http://127.0.0.1:7001',
  proxy: true  //是否开启mock代理
};

export default config;

2、简单封装fetch请求,utils文件夹下的request.js文件

//request.js文件

import fetch from 'dva/fetch';
import config from './config';

function parseJSON(response) {
  return response.json();
}

function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    return response;
  }

  const error = new Error(response.statusText);
  error.response = response;
  throw error;
}

const assyParams = (obj) => {
  let str = ''
  for (let key in obj) {
    const value = typeof obj[key] !== 'string' ? JSON.stringify(obj[key]) : obj[key]
    str += '&' + key + '=' + value
  }
  return str.substr(1)
}

/**
 * Requests a URL, returning a promise.
 *
 * @param  {string} url       The URL we want to request
 * @param  {object} [options] The options we want to pass to "fetch"
 * @return {object}           An object containing either "data" or "err"
 */
export default function request(obj) {
  let url = '';
  let options = {
    method: obj.method,
    headers: {
      'Content-Type': 'application/json; charset=utf-8',
    },
    credentials: 'include'	 //是否携带cookie,默认为omit不携带; same-origi同源携带; include同源跨域都携带
  };
  if (obj.method === 'GET' || obj.method === 'get') {
    url = (config.proxy ? obj.url : config.apiUrl + obj.url) + '?' + assyParams(obj.data);
  }
  if (obj.method === 'POST' || obj.method === 'post') {
    url = config.proxy ? obj.url : config.apiUrl + obj.url;
    options.body = JSON.stringify(obj.data);
  }
  return fetch(url, options)
    .then(checkStatus)
    .then(parseJSON)
    .then(data => ({ data }))
    .catch(err => ({ err }))
}

二、写api

1、service文件下创建api.js

//api.js文件

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

//获取用户信息
export function dataInfo(params) {
  return request({
    url: '/userInfo',
    method: 'post',
    data: params
  })
}

三、mock相关配置

1、例如需要模拟用户列表数据,可以在mock文件夹下新建user.js文件

//user.js文件

import Mock from 'mockjs';
import { delay } from 'roadhog-api-doc';

const proxy = {
  'POST /userInfo': (req, res) => {
	res.setHeader('Access-Control-Allow-Origin', '*');
	res.send(Mock.mock({
	  code: 700,
	  msg: '请求成功',
	  data: {
		id: '1',
		tel: '18888888888',
		sex: '男',
		name: '张无忌',
		sign: '中国广州',
		nickname: 'apple',
		email: '111111111@qq.com', 
		update_time: '',
	  }
	}));
  }
 };

// 调用 delay 函数,统一处理
export default delay(proxy, 1000);

2、 .roadhogrc.mock.js 中进行导入

//.roadhogrc.mock.js文件,加载mock的数据,通过循环把在mock文件夹下的所有配置文件都拿到,并最后export出去

const fs = require('fs');
const path = require('path');

const mockPath = path.join(__dirname + '/mock');

const mock = {};
fs.readdirSync(mockPath).forEach(file => {
  Object.assign(mock, require('./mock/' + file));
});

export default mock;

4、调用api发送请求

1、例如在routes文件下的IndexPage.js页面发送请求

import React, { Component } from 'react';
import styles from './IndexPage.css';
import { dataInfo } from '../services/api';

class IndexPage extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }

  fetchInfo = async () => {
    const data = await dataInfo({ id: 1 });
    console.log(data);
  }

  render() {
    return (
      <div className={styles.normal}>
        <h1 className={styles.title}> 首页</h1>
        <button onClick={this.fetchInfo}>获取用户信息</button>
      </div>
    )
  }
}

export default IndexPage;

请求结果
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dva是一个基于Redux、React、Redux-saga等技术的轻量级框架,用于简化React应用的开发。Dva提供了一些约定和API,可以帮助我们更快速地开发React应用。以下是在React中使用dva的简单步骤: 1. 创建一个基于dva的React应用 使用dva-cli工具创建一个新的dva项目: ``` $ npm install dva-cli -g $ dva new myApp ``` 2. 引入dva和相关依赖 在src/index.js文件中引入dva和相关依赖: ```javascript import dva from 'dva'; import './index.css'; // 1. Initialize const app = dva(); // 2. Plugins // app.use({}); // 3. Model // app.model(require('./models/example').default); // 4. Router // app.router(require('./router').default); // 5. Start app.start('#root'); ``` 3. 编写dva model 在src/models/目录下创建一个新的model文件,例如user.js: ```javascript export default { namespace: 'user', state: { list: [], }, reducers: { save(state, { payload: { list } }) { return { ...state, list }; }, }, effects: { *fetch({ payload }, { call, put }) { const { data } = yield call(queryUsers); yield put({ type: 'save', payload: { list: data, }, }); }, }, }; ``` 这个model定义了一个namespace为'user'的model,包括了state、reducers和effects三个部分。其中reducers用于处理同步操作,effects用于处理异步操作。 4. 注册dva model 在src/index.js文件中注册刚才编写的model: ```javascript import dva from 'dva'; import './index.css'; import user from './models/user'; // 1. Initialize const app = dva(); // 2. Plugins // app.use({}); // 3. Model app.model(user); // 4. Router // app.router(require('./router').default); // 5. Start app.start('#root'); ``` 5. 使用dva connect连接组件和model 在需要使用model的组件中,使用dva提供的connect方法连接组件和model: ```javascript import { connect } from 'dva'; function Users({ dispatch, users }) { function handleClick() { dispatch({ type: 'user/fetch', }); } return ( <div> <h1>List of users</h1> <button onClick={handleClick}>Fetch users</button> <ul> {users.list.map((user, index) => ( <li key={index}>{user.name}</li> ))} </ul> </div> ); } export default connect(({ user }) => ({ users: user }))(Users); ``` 这个组件使用了connect方法连接了'user'命名空间下的state和dispatch到组件的props中。 6. 运行应用 使用npm start命令启动应用: ``` $ cd myApp $ npm start ``` 以上是在React中使用dva的简单步骤,具体使用可以参照dva官方文档和示例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值