前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多年管理系统开发经验总结~代码解决方案

多年管理系统开发经验总结~代码解决方案

作者头像
zz_jesse
发布2020-10-09 15:47:14
8430
发布2020-10-09 15:47:14
举报
文章被收录于专栏:前端技术江湖前端技术江湖

来源 | 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

代码语言:javascript
复制
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 (
    <Form
      layout="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">
          Submit
        </Button>
      </div>
    </Form>
  );
};
export default SearchDemo;

复制代码

列表及分页组件

代码语言:javascript
复制
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 (
    <Table
      style={{ marginTop: 20 }}
      size="small"
      dataSource={list}
      columns={columns}
      pagination={{
        ...pageConfig,
        total: total,
        onChange: changPage
      }}
    />
  );
}

复制代码

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

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

数据统一管理

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

效果展示

数据存储统一管理

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

列表组件新增操作项

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

修改组件

代码语言:javascript
复制
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}
      <Button
        onClick={() => {
          editItem({ ...record, ...item });
          setModalProps({ visible: false });
        }}  >
        修改
      </Button>
    </div>
  );
}
复制代码

叁 · 列表权限控制

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

效果展示

权限配置

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

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

列表控制

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

代码语言:javascript
复制
<Table
      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)

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

最后

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

点个在看支持下

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端技术江湖 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于补丁
  • 关于线网
  • 关于断掉的线头
  • 公共结构
  • 数据流向
  • 零 · 项目准备
  • 壹 · 存储搜索参数数据+列表展示区
    • 搜索和分页数据需要统一存储
      • 顶端组件代码和效果展示
        • 搜索组件SearchForm.js
          • 列表及分页组件
          • 贰·列表操作区+列表展示区
            • 数据统一管理
              • 效果展示
                • 数据存储统一管理
                  • 列表组件新增操作项
                    • 修改组件
                    • 叁 · 列表权限控制
                      • 效果展示
                        • 权限配置
                          • 列表控制
                          • 肆 · 总结
                            • 关于补丁
                              • 关于线网
                                • 关于断线
                                • 最后
                                相关产品与服务
                                对象存储
                                对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档