发送请求
上次讲到在api.js中发送请求,模拟了假数据,这次讲一下调用真实接口进行请求并渲染页面。
先完整的过一遍请求吧
首先view层发送请求例如下面的代码:
componentDidMount() { this.fetchListCallback(); } fetchListCallback = () => { const { limit, offset } = this.state; const { dispatch } = this.props; dispatch({ type: 'brandDiscountManage/fetchList', payload: { limit, offset, }, callback: (response)=>{ this.setState({ tableData: common(response.data.rows, 'discountId'), }) }, }) };
这里调用了'brandDiscountManage'命名空间下的 fetchList 方法。
另外需要在路由层配置一下,引用的文件。
'/brandDiscountManage': { component: dynamicWrapper(app, ['brandDiscountManage'], () => import('../routes/brand/DiscountManage/index')), },
如上代码显示,这里用到了brandDiscountManage.js。其中的文件内容如下
(effects里面就是用到的一些处理请求方法)
import { responseErrorMsg } from '../assets/common' import { getDiscountList } from '../services/api'; export default { namespace:'brandDiscountManage', state:{ }, effects: { *fetchList({payload, callback}, {call}) { const response = yield call(getDiscountList, payload) if(responseErrorMsg(response) && callback ){ callback(response); } }, }, reducers: { }, }
这样在看上面的代码就知道,页面一进来就调用了fetchList方法。这个方法里面调用了yield call (函数名, payload参数)这个方法(暂时不太懂实现原理,一笔带过),并把响应值response 返回。然后判断有没有错误,有的话 responseErrorMsg 这个函数里面做了处理,没有错误的话并且存在callback就会调用callback,并把response作为参数传送。
接着看getDiscountList这个函数函数里面做了什么,这个函数存在于'../services/api.js'文件夹里面
看代码
export async function getDiscountList(params) { return request('/jiuyue/discount/discountList', { method: 'POST', body: { sort: 'create_dts', order: 'DESC', ...params, }, }); }
这里调用的是真实借口,话说真实的借口应该是域名+地址,这里面只有地址,别急,这里面用到了代理。实际上,在刚开始做的时候我直接把网址放到这个request后面,发现上个公司的测试环境的请求地址http:....是可以访问的,然后当我把现在公司的开发环境的全部地址放上去时候报错了,找不到这个借口,我不知道怎么回事。最终解决方案是用到了上面说的代理。ant design pro用到了webpack环境可以配置代理。
具体是在 .webpackrc.js 文件中,
具体代码如下
const path = require('path'); export default { entry: 'src/index.js', extraBabelPlugins: [ ['import', { libraryName: 'antd', libraryDirectory: 'es', style: true }], ], env: { //开发环境 development: { extraBabelPlugins: ['dva-hmr'], }, // build 时的生产环境 production: { 'extraBabelPlugins': [ 'transform-runtime', 'transform-decorators-legacy', ['import', { 'libraryName': 'antd', 'style': true }], ], }, }, //设置代理请求 proxy: { '/jiuyue': { "target": "http://jiuyue.raykoon.com", "changeOrigin": true, "pathRewrite": { "^/jiuyue" : "" } } }, alias: { components: path.resolve(__dirname, 'src/components/'), }, ignoreMomentLocale: true, theme: './src/theme.js', html: { template: './src/index.ejs', }, // disableDynamicImport: true, //如果你的静态资源域名和应用域名不同(例如独立的 cdn 地址),你需要在 .webpackrc 文件里用 publicPath 对生产环境的静态路径进行配置。 publicPath: '/', hash: true, };
上面就是我的源文件,相信也没有什么值得屏蔽的,代理主要用的 proxy 这个属性的配置。
如果你刚才细心的话就会发现我刚才request后面的借口前面有一个 /jiueyu 这个前缀,在这个代理这里做了处理,它的大致意思就是说遇到带有 /jiuyue的网址,就作处理,域名重定向到 http://jiuyue.raykoon.com 这个域名下,并且把 /jiuyue前面全部替换成""