编写你的当前模块服务接口

  1. 在 /src/services 目录下 新建 如:system.js
  1. /**
  2. * time:2019/4/1
  3. * 作者:xzc
  4. * 功能:系统权限
  5. */
  6. import { stringify } from 'qs';
  7. import request from '@/utils/request';
  8. //_____GET没带参数_______
  9. // 获取菜单列表 /admin/sys/menu/nav
  10. export async function getMenuList() {
  11. return request('/sys/menu/nav');
  12. }
  13. //_____GET带参数_______
  14. // 上移 /admin/sys/menu/moveUp
  15. export async function menuMoveUp(params) {
  16. return request(`/sys/menu/moveUp?${stringify(params)}`);
  17. }
  18. //_____POST不带参数_______
  19. // 删除菜单 /admin/sys/menu/delete
  20. export async function deleteMenu(menuId) {
  21. return request(`/sys/menu/delete/${menuId}`, {
  22. method: 'POST',
  23. });
  24. }
  25. //_____POST带参数_______
  26. // 添加菜单 /admin/sys/menu/save
  27. export async function addMenu(params) {
  28. return request('/sys/menu/save', {
  29. method: 'POST',
  30. body: {
  31. ...params,
  32. },
  33. });
  34. }
  1. 在文件中引用
    如 /src/pages/SystemManage/MenuManageindex.js
  1. /**
  2. * time:2019/3/30
  3. * 作者:xzc
  4. * 功能:菜单管理
  5. */
  6. // ...略
  7. // @是/src文件的别名
  8. import {updateMenu,menuMoveUp,menuMoveDown} from '@/services/system';

3.业务中使用

加载初始数据

  1. // 在组件的componentDidMount生命周期中调用
  2. componentDidMount() {
  3. // 调用封装后的方法
  4. this.getRoleMenuList();
  5. }
  6. // 可以进行稍微的封装
  7. getRoleMenuList(){
  8. // 调用接口 getRoleMenuList 获取数据
  9. return getRoleMenuList().then(res=>{
  10. if(res.code === 0){
  11. // 接口返回成功后进行 业务处理,比如给组件的state 赋值 使用 this.setState({...})
  12. const treeData = [{
  13. name:'根目录',
  14. parentId:-1,
  15. url:'/',
  16. menuId:0,
  17. list:res.data,
  18. }];
  19. this.setState({treeData},()=>{
  20. return Promise.resolve()
  21. })
  22. }
  23. })
  24. }

事件调用 (点击事件 如:onClick为主还有组件的自定义事件 如:onSelect )

  1. onSelect = (selectedKeys) => {
  2. // 可能你这里需要调用数据接口
  3. updateMenu().then(res=>{
  4. if(res.code === 0){
  5. // ...
  6. }
  7. })
  8. };
  9. // onSelect 事件 调用你自己封装的 onSelect 方法
  10. // 如果onSelect不使用 箭头函数 则 需要this.onSelect.bind(this) 手动绑定当前的组件实例,
  11. // 否则会出现找不到 this 的错误
  12. ?<Tree
  13. defaultExpandedKeys={['0']}
  14. onSelect={this.onSelect}
  15. >
  16. {this.renderTreeNodes(treeData)}
  17. </Tree>
  1. 在 子组件 中调用(删除、清缓存等操作)
    一般的 table 都是一个组件,table 中使用到的时间如果和父组件的数据相关(如请求的参数,请求后需要更新组件)
  1. import Table from './table';
  2. // 删除 deleteRole
  3. deleteRole(roleId){
  4. const {filtercase} = this.state;
  5. // 调用数据接口
  6. deleteRole({roleId}).then(res=>{
  7. if(res.code === 0){
  8. this.setState({
  9. filtercase:filtercase+1,
  10. resetCurrent: null,
  11. });
  12. this.$addModal.hide();
  13. message.success('删除成功');
  14. }
  15. })
  16. }
  17. // 修改用户信息
  18. modifyRole(roleId){
  19. this.$editModal.show(roleId);
  20. }
  21. <Table
  22. // filtercase={filtercase}
  23. // resetCurrent={resetCurrent}
  24. modifyRole={this.modifyRole.bind(this)}
  25. deleteRole={this.deleteRole.bind(this)}
  26. // params={{ ...params }}
  27. />
  28. // table.js
  29. // Table 组件接收的 deleteRole,modifyRole 这两个方法
  30. const Table = ({ deleteRole,modifyRole }) => {
  31. const caseChangeDataTableProps = {
  32. scroll: { x: 900 }, // 小屏幕时,横滚长度
  33. resetCurrent,
  34. fetch: {
  35. // 略....
  36. // 具体绑定
  37. // <a onClick={()=>modifyRole(d.roleId)}>修改</a>
  38. {
  39. title: '操作',
  40. fixed: 'right',
  41. width: 150,
  42. dataIndex: 'action',
  43. key: 'action',
  44. render: (t, d) => {
  45. return (<div>
  46. {
  47. getPms('sys:role:update')
  48. ?<span>
  49. <a onClick={()=>modifyRole(d.roleId)}>修改</a>
  50. <Divider type="vertical" />
  51. </span>:null
  52. }
  53. {
  54. getPms('sys:role:delete')
  55. ?<Popconfirm title="确定要删除?" onConfirm={()=>deleteRole(d.roleId)}>
  56. <a>删除</a>
  57. </Popconfirm>:null
  58. }
  59. </div>);
  60. } },