当前位置: 首页 > wzjs >正文

销售牛的网站广州网络推广公司有哪些

销售牛的网站,广州网络推广公司有哪些,电脑记事本做复杂网站,银行官方网站目录 一、Mock 数据服务 (mock.ts) 二、ProTable 组件 (ProTableWithModal.tsx) 三、关键特性说明 四、技术栈关系图 以下是对基于 Ant Design Pro v6 (TypeScript) 的 ProTable 组件的分析,包含代码注释和关键功能说明: 一、Mock 数据服务 (mock.ts…

目录

一、Mock 数据服务 (mock.ts)

二、ProTable 组件 (ProTableWithModal.tsx)

三、关键特性说明

四、技术栈关系图


以下是对基于 Ant Design Pro v6 (TypeScript) 的 ProTable 组件的分析,包含代码注释和关键功能说明:


一、Mock 数据服务 (mock.ts)

// 模拟数据源(内存数据库)
import type { Request, Response } from 'express';
const dataSource: any[] = [{id: '1',name: '初始数据',description: '系统初始数据',status: 'active',createTime: '2025-07-10T08:30:00Z'}
];// RESTful API 模拟
export default {// GET /api/data 分页查询'GET /api/data': (req: Request, res: Response) => {// 1. 解析查询参数const page = parseInt(req.query.page as string) || 1; // 当前页码const pageSize = parseInt(req.query.pageSize as string) || 5; // 页大小const { name, status } = req.query; // 搜索条件// 2. 过滤逻辑(按名称/状态)let filteredData = [...dataSource]; // 复制原始数据if (name) filteredData = filteredData.filter(item => item.name.includes(name));if (status) filteredData = filteredData.filter(item => item.status === status);// 3. 分页处理 (slice实现)const start = (page - 1) * pageSize;const pageData = filteredData.slice(start, start + pageSize);// 4. 返回标准响应格式res.send({success: true,data: pageData,     // 当前页数据total: filteredData.length // 总记录数});},// POST /api/data 创建数据'POST /api/data': (req: Request, res: Response) => {const newItem = {...req.body,   // 接收请求体数据id: `id-${Date.now()}`,    // 生成唯一IDcreateTime: new Date().toISOString() // 创建时间};dataSource.push(newItem); // 添加到数据源res.send({ success: true, data: newItem }); // 返回新建项},
// 更新数据'PUT /api/data/:id': (req: Request, res: Response) => {const { id } = req.params;const index = dataSource.findIndex(item => item.id === id);if (index !== -1) {dataSource[index] = { ...dataSource[index], ...req.body };res.send({ success: true });} else {res.status(404).send({ success: false, message: '数据未找到' });}},// 删除数据'DELETE /api/data/:id': (req: Request, res: Response) => {const { id } = req.params;const index = dataSource.findIndex(item => item.id === id);if (index !== -1) {dataSource.splice(index, 1);res.send({ success: true });} else {res.status(404).send({ success: false, message: '数据未找到' });}}
};

关键说明​:

  1. 使用内存数组 dataSource 模拟数据库
  2. 实现 RESTful 接口规范:
    • GET:分页查询 + 过滤
    • POST:创建资源
    • PUT:更新资源(通过ID定位)
    • DELETE:删除资源
  3. 分页逻辑:slice(start, start+pageSize) 实现内存分页
  4. 响应格式:标准 {success, data, total} 结构

二、ProTable 组件 (ProTableWithModal.tsx)

import React, { useRef, useState } from 'react';
import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons';
import { Button, Form, Input, Modal, Select, message, Popconfirm } from 'antd';
import { ProTable } from '@ant-design/pro-components';
import type { ActionType, ProColumns, ProFormInstance } from '@ant-design/pro-components';
import { request } from 'umi';// 定义数据类型
interface FormValues {name: string;description: string;status?: string;
}interface DataItem extends FormValues {id: string;createTime: string;
}const ProTableWithModal: React.FC = () => {const [form] = Form.useForm<FormValues>();const searchFormRef = useRef<ProFormInstance>();const [visible, setVisible] = useState(false);const [editingRecord, setEditingRecord] = useState<DataItem | null>(null);const actionRef = useRef<ActionType>();// 状态枚举值const statusEnum = {active: { text: '启用', status: 'Success' },inactive: { text: '停用', status: 'Error' },};// 处理编辑操作const handleEdit = (record: DataItem) => {setEditingRecord(record);form.setFieldsValue({name: record.name,description: record.description,status: record.status});setVisible(true);};// 处理删除操作const handleDelete = async (id: string) => {try {const response = await request(`/api/data/${id}`, {method: 'DELETE'});if (response.success) {message.success('删除成功');actionRef.current?.reload();}} catch (error) {message.error('删除失败');}};// 处理表格请求(带分页和搜索)const handleRequest = async (params: any & {pageSize?: number;current?: number;keyword?: string;}) => {const { current, pageSize, ...filters } = params;try {const response = await request('/api/data', {method: 'GET',params: {...filters,page: current,pageSize}});const tableData = Array.isArray(response.data)? response.data: response.data?.list || [];return {data: tableData,success: true,total: response.total,};} catch (error) {return {data: [],success: false,total: 0};}};// 表单提交处理(添加/编辑)const handleSubmit = async (values: FormValues) => {try {const method = editingRecord ? 'PUT' : 'POST';const url = editingRecord ? `/api/data/${editingRecord.id}` : '/api/data';const response = await request(url, {method,data: {...values,...(editingRecord ? {} : {id: `id-${Date.now()}`,createTime: new Date().toISOString()})}});if (response.success) {message.success(editingRecord ? '更新成功' : '添加成功');actionRef.current?.reload();setVisible(false);form.resetFields();setEditingRecord(null);}} catch (error) {message.error('操作失败');}};// 重置功能const handleReset = () => {if (searchFormRef.current) {searchFormRef.current.resetFields();}actionRef.current?.reset?.();actionRef.current?.reload();};// 表格列配置const columns: ProColumns<DataItem>[] = [{title: '名称',dataIndex: 'name',width: 120,search: true,fieldProps: { placeholder: '请输入名称搜索' },},{title: '描述',dataIndex: 'description',search: false,ellipsis: true,},{title: '状态',dataIndex: 'status',valueType: 'select',valueEnum: statusEnum,initialValue: 'active',search: {transform: (value) => ({ status: value }),},},{title: '创建时间',dataIndex: 'createTime',valueType: 'dateTime',hideInSearch: true,},{title: '操作',valueType: 'option',render: (_, record) => [<Buttonkey="edit"type="link"icon={<EditOutlined />}onClick={() => handleEdit(record)}/>,<Popconfirmkey="delete"title="确定要删除吗?"onConfirm={() => handleDelete(record.id)}><Button type="link" danger icon={<DeleteOutlined />} /></Popconfirm>],},];return (<div style={{ padding: 24 }}><ProTable<DataItem>actionRef={actionRef}formRef={searchFormRef}columns={columns}rowKey="id"pagination={{ pageSize: 5 }}request={handleRequest}toolBarRender={() => [<Buttonkey="add"type="primary"icon={<PlusOutlined />}onClick={() => {setEditingRecord(null);setVisible(true);}}>新建条目</Button>,]}search={{optionRender: (_, __, dom) => [...dom,<Buttonkey="global-reset"onClick={handleReset}style={{ marginLeft: 8 }}>全局重置</Button>]}}/>{/* 弹窗表单 */}<Modaltitle={editingRecord ? "编辑数据" : "添加新数据"}open={visible}onCancel={() => {setVisible(false);form.resetFields();setEditingRecord(null);}}onOk={() => form.submit()}destroyOnClose><Formform={form}layout="vertical"onFinish={handleSubmit}initialValues={{ status: 'active' }}><Form.Itemlabel="名称"name="name"rules={[{ required: true, message: '请输入名称' }]}><Input placeholder="请输入名称" /></Form.Item><Form.Itemlabel="描述"name="description"rules={[{ max: 100, message: '不超过100字符' }]}><Input.TextArea placeholder="请输入描述" rows={3} /></Form.Item><Form.Itemlabel="状态"name="status"><Select options={[{ value: 'active', label: '启用' },{ value: 'inactive', label: '停用' }]} /></Form.Item></Form></Modal></div>);
};export default ProTableWithModal;

三、关键特性说明

  1. ProTable 核心功能​:

    • 自动分页​:通过 request 属性绑定数据获取函数
    • 搜索集成​:search: true 开启列搜索
    • 值枚举映射​:valueEnum 实现状态→标签的转换
  2. Umi Request 使用​:

    // 统一请求方法
    request('/api/data', {method: 'GET',params: { page: 1, name: 'test' }
    });
    • 内置错误处理
    • 自动处理 loading 状态
  3. 表单管理最佳实践​:

    • 使用 Form.useForm() 管理表单状态
    • form.setFieldsValue() 实现数据回填
    • destroyOnClose 保证弹窗关闭时重置状态
  4. 全局重置功能​:

    const handleReset = () => {searchFormRef.current?.resetFields(); // 重置搜索表单actionRef.current?.reload();           // 重置表格数据
    };

四、技术栈关系图

此实现完整展示了 CRUD 操作的现代前端架构,结合了 Ant Design Pro 的 UI 组件能力和 Umi 的工程化优势,适合作为中后台系统的模板代码。


文章转载自:

http://RNZDHjSI.trrpb.cn
http://tsrMnP1q.trrpb.cn
http://ktPDlGl9.trrpb.cn
http://GdC69M4C.trrpb.cn
http://TYO6Mysm.trrpb.cn
http://QS1jvfCY.trrpb.cn
http://dqcA9jYS.trrpb.cn
http://a0EXde1x.trrpb.cn
http://YjnOlRAr.trrpb.cn
http://FYcaL6q8.trrpb.cn
http://D734L2qJ.trrpb.cn
http://6H4sW5qb.trrpb.cn
http://Y0Ss19yN.trrpb.cn
http://iCMVebkH.trrpb.cn
http://H8fzMYt6.trrpb.cn
http://WEYkp496.trrpb.cn
http://vnqeQcIJ.trrpb.cn
http://e4JZV6SN.trrpb.cn
http://6BSrMc04.trrpb.cn
http://YB4DHUmy.trrpb.cn
http://RB1ZNFNB.trrpb.cn
http://Eym6a43l.trrpb.cn
http://CTHzUFhS.trrpb.cn
http://GtmEfPhW.trrpb.cn
http://NpFWvgc9.trrpb.cn
http://V4nNh7Sw.trrpb.cn
http://xGpMZwqk.trrpb.cn
http://eGYy00VP.trrpb.cn
http://uyuyVhei.trrpb.cn
http://Ujk8Zvd6.trrpb.cn
http://www.dtcms.com/wzjs/768870.html

相关文章:

  • 潍坊企业网站郑州网站优化哪家专业
  • 怎样管理一个俄语网站网站 系统 区别
  • 怎么查网站的注册信息21世纪上海人才网官网
  • 绵阳市建设工程监督网站嘉祥网站建设哪家便宜
  • 广东建设监理协会网站个人账号十大网站建立公司
  • 四平市城乡建设局网站悟空建站是什么
  • 取消网站的通知书网站开发项目流程设计
  • 怎样查看网站是否被百度收录[8dvd]flash网站源文件 flash整站源码
  • 保定网站设计制作需要多少钱怎么做线上销售
  • 重庆云阳网站建设wordpress查询分页插件
  • 做网站的公司叫什么名字好跨境电商怎么做视频教程
  • 新网站备案查询中国建设银行个人登录查询入口
  • 如皋市城乡建设局网站ps 怎么做网站
  • 中山网站建设网站柳州做网站公司
  • 男女做暖暖的时候网站电子商务网站设计要求
  • 休闲食品网站建设策划书如何成立一家咨询公司
  • 免费的免抠图素材网站seo免费工具
  • 东莞产品网站建设公司网站设计制作开发方案
  • 西宁网站建设天锐科技徐州钢网架公司
  • 上市公司做网站有什么用番禺人才网招聘信恿
  • 西安晨曦e动网站建设dw创建网站导航栏菜单怎么做
  • 上海阿里巴巴网站建设外贸网站seo有哪些公司
  • 如何360收录网站阿里云中文域名建设网站
  • 仿淘宝电商网站开发报价html留言簿网站基本框架搭建
  • 珠海 网站 设计游戏网站搭建需要多少钱
  • 网站制作花多少钱什么是网络营销的第二层次
  • 网站建设kpi考核wordpress移动端编辑器
  • 网站制作的费用仿冒网站制作
  • 企业 网站设计收费网站怎么免费
  • 小型项目外包网站东莞网站建设品牌公司