来源 | juejin.im/user/870468939940184

作者 | 前端小月月

背景

最近的你有没有接手的新项目,对这个有什么感觉?我最近接手了一个项目,先不论是否代码行数的多少,仅是思路就很混乱,像是一件衣服在打补丁,而衣服上还有混乱的线网,数据绕来绕去,和断掉的线头,举例说明下

关于补丁

  • 没有对数据进行扩展处理,一个值一个变量。例如:获取数据详情返回的多个对象,便依次存储多个对象,这样在参数变更时,便要不停地补充参数,如果你使用的是react,就会发现大量的state还没有注释它是用来干什么的,不管对于维护者,还是初入者都是不友好的,其实我们可以存储在一个变量里,在使用时直接调用对象的参数
  • 列表的列表项[1,2,3,4,5]的展示,可能会根据权限展示不同的列表,刚开始是1,2,3,根据==1,==2,==3,后来变成1,2,3,4,就。。。。
  • 其实我们根据业务场景是否可以传入一个数组arr=[1,2,3,4],根据includes判断是否在数组内(此处会在列表展示区做详细解释)

关于线网

  • 把父级组件的静态数据number=3,和回调方法传给子类,回调方法里使用的却是,子类传回来的父类的静态数据number

关于断掉的线头

  • 例如使用antd的Tabs:如果只是单纯的点击切换模块,没有进行模块的特殊处理,则不需要onChange的方法,和状态存储 ,确定我们想要的,避免无效代码

关于以上的问题,我基于以往的项目,整理了一下管理系统的组件结构思路,希望可以在你的项目开发中提供一些帮助

#概述

公共结构

关于一个管理系统,使用最多的便是增删改查,主要的逻辑是对数据的操作,基于以往的项目可以提取以下部分的公共结构


数据流向

  • 搜索排序分页通过操作的参数获取,列表的展示数据
  • 列表操作区会根据删除或者修改后,重新获取列表数据

零 · 项目准备

  • 此次针对 搜索 列表 分页 区域
  • 使用react作范例,版本号如下

壹 · 存储搜索参数数据+列表展示区

搜索和分页数据需要统一存储


顶端组件代码和效果展示

搜索组件SearchForm.js

import React from "react";import { Form, Input, Button } from "antd";

const SearchDemo = (props) => {const [form] = Form.useForm();

const onFinish = (values) => {console.log(values);    props.getListBySearch(values);  };return (<Formlayout="inline"form={form}name="control-hooks"style={{ width: 400 }}onFinish={onFinish}    ><Form.Item name="nameKey" label="姓名"><Input placeholder="请输入姓名关键字" />Form.Item><div><Button type="primary" htmlType="submit">          SubmitButton>div>Form>  );};export default SearchDemo;复制代码

列表及分页组件

import React from "react";import { Button, Table } from "antd";import EditContent from "./EditContent";export default function TableList(props) {const { list = [], total, getListByPage, pageConfig } = props;const columns = [    {title: "姓名",dataIndex: "name",key: "name"    },    {title: "年龄",dataIndex: "age",key: "age"    },    {title: "住址",dataIndex: "address",key: "address"    },  ];

function changPage(page, pageSize) {    getListByPage({ current: page, pageSize });  }return (<Tablestyle={{ marginTop: 20 }}size="small"dataSource={list}columns={columns}pagination={{...pageConfig,total: total,onChange: changPage      }}    />  );}复制代码

贰·列表操作区+列表展示区

列表操作可能同时存在多个弹窗,需对弹窗组件做统一参数处理,利用数据柯里化把父级参数运输到子组件内

数据统一管理

业务逻辑层指index.js组件:负责整个页面的结构和逻辑处理


效果展示

数据存储统一管理

  • 弹窗数据统一管理
 const [modalProps, setModalProps] = useState(dataSource.length);复制代码
  • 使用柯里化父级传递参数统一管理
    footer={null}    {...modalProps}    maskClosable={false}    onCancel={() => setModalProps({ visible: false })} >    {modalProps.content && modalProps.content(commonProps)} {/* 使用柯里化对数据传递进行处理*/}</Modal>复制代码

列表组件新增操作项

 {title: "操作",dataIndex: "operation",key: "operation",render: (text, record) => {return (<ButtononClick={() =>              setModalProps({                visible: true,                content: (commonProps) => (/*跨级传递父级参数*/<EditContent record={record} {...commonProps} />                )              })            } >            修改Button>        );      }    }复制代码

修改组件

import React from "react";import { Button } from "antd";export default function EditContent(props) {const { record, editItem, setModalProps } = props;const item = { name: "修改后的名字" };return (<div>      {item.name}<ButtononClick={() => {          editItem({ ...record, ...item });          setModalProps({ visible: false });        }}  >        修改Button>div>  );}复制代码

叁 · 列表权限控制

根据不同的权限配置,展示不同的列表项

效果展示

权限配置

使用对象roleObj的权限配置方案,比if(){}else{}更简介直观

const [roleArr, setRoleArr] = useState([]);const roleObj = {0: [],1: ["address", "operation"],2: ["name", "age"]  };。。。
<Radio.GrouponChange={(e) => setRoleArr(roleObj[e.target.value])}
defaultValue={0}
><Radio value={0}>展示全部Radio><Radio value={1}>不展示操作和地址Radio><Radio value={2}>不展示姓名和年龄Radio>Radio.Group>div>复制代码

列表控制

根据传过来的数组,进行列表项的过滤

style={{ marginTop: 20 }}
size="small"
dataSource={list}
columns={columns.filter((item) => !roleArr.includes(item.key))}
pagination={{
...pageConfig,
total: total,
onChange: changPage
}}
/>
复制代码

肆 · 总结

针对前期的痛点,我们一一进行总结 完整代码[1]

关于补丁

在处理查询参数时,我们对查询数据进行了搜索和分页的分类存储,但是都保存在一个变量里,如果后期加排序或者其他参数,不会影响之前的逻辑,可以在原有基础上进行扩展,有效减少补丁的数量对弹窗参数数据的统一存储,可以拓展弹窗的title或者其他属性,不需要在添加state来打补丁,直接增加modalProps属性即可

关于线网

把数据的加工都统一放在了业务逻辑层指index.js进行数据处理,提供给其他组件相应的处理函数对弹窗组件进行柯里化处理,不仅可以避免给列表传递非必要的参数,减少组件的刷新,还可以方便的跨级传递父级参数

关于断线

在进行权限的处理时,我们并不需要存储单选框的值,直接对数据进行处理即可(有的猿可能会存个state,通过state去更新选中的value)

写代码之前一定要让自己的思路清晰,进行思维碰撞后的你开发起来会更小的得心应手

最后

期许每个项目组猿们写代码都有一个统一清晰规范的思路,那无论你的换项目,还是交接给其他人都是可以无缝衔接

点个在看支持下 

antd table排序会触发到分页怎么解决_多年管理系统开发经验总结~代码解决方案...相关推荐

  1. antd table排序 vue_ant-design-vue中的table取消默认不排序的状态

    ant-design-vue中的table组件具有排序的属性,该排序属性有三种状态:升序.降序和不排序.在项目开发中,有时产品经理会要求排序时只能有升序或降序两种状态,而table组件中却没有相应的A ...

  2. antd table 排序如何使用_antd table按表格里的日期去排序操作

    表格内容 根据票据日期升序(这里是已经排序后的效果) 上代码 代码中data的内容如下 根据paper_date排序,因为目前这种格式不支持比较,需要先转换成时间戳 new Date(aTimeStr ...

  3. antd table 排序如何使用_Antd Table列字符串排序+数字排序

    在中后端WEB app开发过程中经常遇到table列排序的问题,Antd table 提供了sorter的接口,我们可以根据各自项目特点拓展即可. 1.Number类型数据排序,官方提供了number ...

  4. antd table排序 vue_商品品牌业务之Vue编写前端页面

    今天是刘小爱自学Java的第145天. 感谢你的观看,谢谢你. 学习计划安排如下: 打算从前端页面到后台服务器代码完整地写一遍,但显然我高估了自己的实力,几个小时的时间根本不够用. 并且因为教程和vu ...

  5. antd table排序 vue_antd of Vue 之table组件踩坑记

    需求:页面里有个table,点击编辑可以编辑该table,保存数据并展示到页面上来 第一种方法就是把编辑态的table做成子组件(且叫editeTable),通过v-show判断是否进入编辑态来显示隐 ...

  6. antd table 时间搜索_antd table按表格里的日期去排序操作

    表格内容 根据票据日期升序(这里是已经排序后的效果) 上代码 代码中data的内容如下 根据paper_date排序,因为目前这种格式不支持比较,需要先转换成时间戳 new Date(aTimeStr ...

  7. bootstrap table排序php,BootStrap+Table排序分页序号

    这次给大家带来BootStrap+Table排序分页序号,BootStrap+Table排序分页序号的注意事项有哪些,下面就是实战案例,一起来看一下. 前言在使用bootstrap table的时候难 ...

  8. antd表格显示分页怎么取消_react antd分页后,表格筛选后不能触发重新分页

    如图,参照官网表格demo,为表格添加分页的total(图一),当按Age为32进行筛选后,分页没进行刷新,实际筛选出来的应该是7条而不是16条(图二),如果把表格的pagination属性去掉使用a ...

  9. antd 设置表头属性_解决react使用antd table组件固定表头后,表头和表体列不对齐以及配置fixed固定左右侧后行高度不对齐...

    一.固定表头后表体列和表头不对齐 此问题可能在antd3.24.0版本之前都存在,反正3.16.2版本是存在这个问题的,如果是3.24.0之前的版本估计只能通过修改css样式解决. 按照官网说的: 1 ...

最新文章

  1. python selenium 浏览器设置_python+selenium webdriver.firefox()方式配置浏览器设置
  2. Oracle 11g r2 安装
  3. 深度学习用途广:Nvidia工程师机智赶跑草坪上撒野的邻家喵星人
  4. 简单网页制作html语言,html基本操作,看了这些你就能做简易网页
  5. (非原)如何让.net开发的Winform程序快速释放内存
  6. 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)
  7. 图像马赛克原理及实现
  8. 跟我学Windows7的33个技巧(二)
  9. 编译 php mysql 依赖包_MySQL 5.5.15源码包编译安装
  10. 1971旗舰cpu intel_CPU的历史
  11. 如何在 Java 中正确使用 wait, notify 和 notifyAll?
  12. 使用ISAPI_Rewrite对asp.net实现URL重写伪静态
  13. 文件夹去掉git版本控制_git 从版本控制中删除文件及.gitignore的用法
  14. xm文件转换为mp3_怎么才能将M4A转换为MP3?秘籍公开
  15. 几个常用的shell脚本
  16. Atitit java onvif 开源类库 getProfiles getStreamUri
  17. java值传递人体自_请大家帮帮我这个初学者
  18. 矩阵标准型的系数是特征值吗_「线性代数」根据特征值,将二次型化为标准形、规范形...
  19. 云知声语音语义识别,语音唤醒和语音合成简单工具类封装
  20. javascript 域名合法性检测

热门文章

  1. 在Saas发展的黄金时代里带你理解SaaS设计
  2. Nacos服务发现控制台预览
  3. k8s 集群居然可以图形化安装了?
  4. 新型数据中心需要什么样的存储
  5. 大数据,从青铜到王者
  6. 共筑全场景智慧生态,华为HMS全球应用创新大赛火热开启
  7. 德勤2021技术趋势:繁琐、点状的匠人AI时代将终结,MLOps时代来临
  8. 全球权威MLPerf基准测试再发榜,浪潮AI服务器创18项AI性能纪录
  9. 深度剖析数据库国产化迁移之路
  10. 云+X案例展 | 民生类:京东云突破数据中心光互联瓶颈