前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ant Design

Ant Design

作者头像
P轴
发布2022-11-18 17:17:13
2.7K0
发布2022-11-18 17:17:13
举报
文章被收录于专栏:P轴

# 新建项目

ts项目

代码语言:javascript
复制
npx create-react-app my-app --template typescript
yarn add antd
yarn add axios

# 表单

提交表单可以直接用回调函数里面的values获取值 重置表单数据 form.resetFields()

# 表格Table

  1. 默认key往往不是,需要自定义rowKey,否则控制台报错
代码语言:javascript
复制
 <Table columns={columns} dataSource={data.list} rowKey="id" pagination={false} />

# 单元格数据再处理

如下图权限展示,是一个对象数组,需要再处理,展示为tag

image
image
  1. render里面参数可以用_,表示不用该参数
  2. value !== undefined 先判断下是否有值
  3. ts可以直接用?表示有值的情况再执行
代码语言:javascript
复制
render: (value) => {
    return (<>{value?.map((sysRole: any) => <Tag color="blue" key={sysRole.name}>{sysRole.name}</Tag>)}
    </>)
}
代码语言:javascript
复制
import { Space, Table, Button, Form, Input, Pagination, message, Modal, Popconfirm, Tag, Tree } from 'antd';
import type { TreeProps } from 'antd/es/tree';
import React, { useEffect, useState } from 'react';
import { pxRequest } from '../service/userService'
import './Role.css'

const Role: React.FC = () => {
  const [data, setData] = useState<API.PageInfo>({})
  const getList = (values: any) => {
    pxRequest("sys/role/list", values).then(res => {
      if (res.data.success) {
        setData(res.data.object)
      } else {
        message.info(res.data.message)
      }
    }).catch(err => {
      console.log(err)
    })
  }
  useEffect(() => {
    getList({})
  }, [])
  // 获取权限列表
  const [authList, setAuthList] = useState([])
  const [checkedKeys, setCheckedKeys] = useState<React.Key[]>([]);
  useEffect(() => {
    getRoleList()
  }, [])
  const getRoleList = () => {
    pxRequest("sys/auth/list", {}).then(res => {
      if (res.data.success) {
        setAuthList(res.data.object)
      } else {
        message.info(res.data.message)
      }
    }).catch(err => {
      console.log(err)
    })
  }

  //搜索用的form
  const [form] = Form.useForm();
  const onChange = (pageNum: number, pageSize: number) => {
    let queryForm = { ...form.getFieldsValue() }
    queryForm.pageNum = pageNum
    queryForm.pageSize = pageSize
    getList(queryForm)
  }

  const onFinish = (values: any) => {
    getList(values)
  };

  // 新增及编辑
  const [addForm] = Form.useForm();
  const [isModalOpen, setIsModalOpen] = useState(false);
  const [isAdd, setIsAdd] = useState(false);

  const handleOk = () => {
    let api = isAdd ? "sys/role/add" : "sys/role/edit"
    addForm.validateFields().then((res) => {
      pxRequest(api, addForm.getFieldsValue()).then(res => {
        if (res.data.success) {
          setIsModalOpen(false);
          getList({})
          message.info(res.data.message)
        } else {
          message.error(res.data.message)
        }
      }).catch(err => {
        console.log(err)
      })
    }).catch((err) => {
      console.log(err)
    })
  };
  const handleCancel = () => {
    setIsModalOpen(false);
  };
  const showAdd = () => {
    setIsAdd(true)
    addForm.resetFields()
    setCheckedKeys([])
    setIsModalOpen(true);
  }
  //编辑
  const showEdit = (record: any) => {
    setIsAdd(false)
    addForm.resetFields()
    addForm.setFieldsValue(record)
    setCheckedKeys([])
    if (record.sysAuthList !== undefined) {
      let keys = []
      for (let sysAuth of record.sysAuthList) {
        keys.push(sysAuth.id)
      }
      setCheckedKeys(keys)
    }
    setIsModalOpen(true);
  }

  //权限信息
  const onSelect: TreeProps['onSelect'] = (selectedKeys, info) => {
  };

  // @ts-ignore 
  const onCheck: TreeProps['onCheck'] = (checkedKeys: React.Key[], info) => {
    setCheckedKeys(checkedKeys);
    addForm.setFieldValue("sysAuthList", info.checkedNodes);
  };

  //删除角色
  const showDel = (id: any) => {
    console.log(id)
    pxRequest("sys/role/delete/" + id, {}).then(res => {
      if (res.data.success) {
        message.info(res.data.message)
        getList({})
      } else {
        message.error(res.data.message)
      }
    }).catch(err => {
      console.log(err)
    })
  }

  const columns = [
    {
      title: '角色名称',
      dataIndex: 'name',
      key: 'name',

    },
    {
      title: '角色备注',
      dataIndex: 'mark',
      key: 'mark',
    },
    {
      title: "权限",
      dataIndex: "sysAuthList",
      key: "sysAuthList",
      render: (value: any) => {
        if (value !== undefined) {
          return (<>{value.map((sysRole: any) => <Tag color="blue" key={sysRole.name}>{sysRole.name}</Tag>)}
          </>)
        }
      }

    },
    {
      title: '新增人员',
      dataIndex: 'createId',
      key: 'createId',
    },
    {
      title: '新增时间',
      dataIndex: 'createTime',
      key: 'createTime',
    },
    {
      title: '修改人员',
      dataIndex: 'modifyId',
      key: 'modifyId',
    },
    {
      title: '修改时间',
      dataIndex: 'modifyTime',
      key: 'modifyTime',
    },
    {
      title: '操作',
      key: 'action',
      render: (_: any, record: any) => (
        <Space size="middle">
          <Button type="link" onClick={() => { showEdit(record) }}>编辑</Button>
          <Popconfirm title={`确定删除 ${record.name} 么?`} onConfirm={() => showDel(record.id)} placement="topRight">
            <Button type='link'>删除</Button>
          </Popconfirm>
        </Space>
      ),
    },
  ];

  return (<div className='userTable'>
    <Form className='search' form={form} name="horizontal_login" layout="inline" onFinish={onFinish} >
      <Form.Item
        name="sysAuthList"
        label="权限"
        rules={[{ required: false, message: '权限' }]}
        hidden={true}
      >
        <Input placeholder="权限" />
      </Form.Item>
      <Form.Item
        name="name"
        label="角色名称"
        rules={[{ required: false, message: '角色名称' }]}
      >
        <Input placeholder="角色名称" />
      </Form.Item>

      <Form.Item shouldUpdate>
        {() => (
          <Button type="primary" htmlType="submit"  > 查询 </Button>
        )}
      </Form.Item>
      <Form.Item shouldUpdate>
        {() => (
          <Button type="primary" onClick={showAdd}  > 新增 </Button>
        )}
      </Form.Item>
    </Form>
    <Modal
      title={isAdd ? "新增" : "编辑"}
      open={isModalOpen}
      onOk={handleOk}
      onCancel={handleCancel}
    >
      <Form className='addUser' form={addForm} autoComplete="off" initialValues={{
        status: "0"
      }}
        labelCol={
          { span: 5 }
        }
        wrapperCol={
          { span: 19 }
        }
      > <Form.Item
        name="id"
        rules={[{ required: !isAdd, message: 'id' }]}
        hidden
      >
          <Input />
        </Form.Item>
        <Form.Item
          name="name"
          label="角色名称"
          rules={[{ required: true, message: '角色名称' }]}
        >
          <Input placeholder="角色名称" allowClear={true} />
        </Form.Item>
        <Form.Item
          name="mark"
          label="角色备注"
          rules={[{ required: false, message: '角色备注' }]}
        >
          <Input
            placeholder="角色备注" allowClear={true} />
        </Form.Item>
        <Form.Item
          name="sysAuthList"
          label="拥有权限"
        >
          <Tree
            checkable
            onSelect={onSelect}
            onCheck={onCheck}
            treeData={authList}
            checkedKeys={checkedKeys}
            fieldNames={{ title: "name", key: "id", children: "pSysAuth" }}
            defaultExpandAll={true}
          />
        </Form.Item>
      </Form>
    </Modal>
    <Table columns={columns} dataSource={data.list} rowKey="id" pagination={false} />
    <Pagination onChange={onChange} showTotal={(total) => `共${total}条`} current={data.pageNum} total={data.total} showSizeChanger={true} />
  </div>)
};

export default Role;

# 树形控件Tree

效果如下: onCheck是勾选前面的选择框 onSelect是点击后面的汉字,如系统管理

image
image

注意:

  1. 嵌套在表单里面时,addForm.getFieldsValue(),提交请求时不会抓取tree的值
  2. 提交数据方法,在onCheck方法里面对表单赋值
  3. 新建及编辑时先清空上一次选中的keys
  4. keys可以时字符串数组也可以时number数组,与关联的数据对应即可
代码语言:javascript
复制
<Tree
    checkable
    onSelect={onSelect}
    onCheck={onCheck}
    treeData={authList}
    checkedKeys={checkedKeys}
    fieldNames={{ title: "name", key: "id", children: "pSysAuth" }}
    defaultExpandAll={true}
/>
代码语言:javascript
复制
// 获取权限列表
const [authList, setAuthList] = useState([])
const [checkedKeys, setCheckedKeys] = useState<React.Key[]>([]);
const onCheck: TreeProps['onCheck'] = (checkedKeys: React.Key[], info) => {
    setCheckedKeys(checkedKeys);
    addForm.setFieldValue("sysAuthList", info.checkedNodes);
};
const onSelect: TreeProps['onSelect'] = (selectedKeys, info) => {
  };
代码语言:javascript
复制
const handleOk = () => {
    let api = isAdd ? "sys/role/add" : "sys/role/edit"
    addForm.validateFields().then((res) => {
      pxRequest(api, addForm.getFieldsValue()).then(res => {
        if (res.data.success) {
          setIsModalOpen(false);
          getList({})
          message.info(res.data.message)
        } else {
          message.error(res.data.message)
        }
      }).catch(err => {
        console.log(err)
      })
    }).catch((err) => {
      console.log(err)
    })
  };

# Select

# axios

# 配置全局header

ts里面注释也是起作用的

代码语言:javascript
复制
import axios from 'axios'

axios.interceptors.request.use(
    (config) => {
        // @ts-ignore 
        config.headers.Authorization = localStorage.getItem("token")
        return config
    },
    (error) => {
        return Promise.reject(error)
    }
)

# api.d.ts

接口文档

  1. 规定了数据格式,注意接口只有在ts中存在
  2. 其它文件可以直接使用,eg: API.IUser
代码语言:javascript
复制
declare namespace API {
    interface IUser {
        id: number,
        userId: string,
        userName: string,
        password: string,
        status: string,
        createId: string,
        createTims: Date,
        modifyId: string,
        modifyTime: Date
    }
    interface TableParams {
        pagination?: TablePaginationConfig;
        sortField?: string;
        sortOrder?: string;
        filters?: Record<string, FilterValue>;
    }
    interface PageInfo {
        total?: number,
        pageSize?: number,
        pageNum?: number,
        list?: any[]
    }
}

# 赋值

defualt开头的只能赋值一次,后续不会跟着改变,例如: defaultChecked 初始是否选中,如果要改变应该使用checked

# 参考

  1. material-ui: http://www.material-ui.com/#/
  2. github: https://github.com/callemall/material-ui
  3. https://ant.design/components/overview-cn/
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 新建项目
  • # 表单
  • # 表格Table
    • # 单元格数据再处理
    • # 树形控件Tree
    • # Select
    • # axios
      • # 配置全局header
      • # api.d.ts
      • # 赋值
        • # 参考
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档