ant design pro 初识
发送请求
上次讲到在api.js中发送请求,模拟了假数据,这次讲一下调用真实接口进行请求并渲染页面。
先完整的过一遍请求吧
首先view层发送请求例如下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 方法。
另外需要在路由层配置一下,引用的文件。
1 2 3 | '/brandDiscountManage' : { component: dynamicWrapper(app, [ 'brandDiscountManage' ], () => import ( '../routes/brand/DiscountManage/index' )), }, |
如上代码显示,这里用到了brandDiscountManage.js。其中的文件内容如下
(effects里面就是用到的一些处理请求方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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'文件夹里面
看代码
1 2 3 4 5 6 7 8 9 10 | 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 文件中,
具体代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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前面全部替换成""
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步