V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xjepiaojiangu
V2EX  ›  程序员

前端同学看过来能否看看怎么实现

  •  
  •   xjepiaojiangu · 2020-08-03 20:24:11 +08:00 · 3649 次点击
    这是一个创建于 1572 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个这样的需求。

    为了更好的表达,我画了一个示意图 https://www.jianguoyun.com/p/DS8pKhwQodW9BhilkrID

    想把数据库中的查出来的每次考试成绩,按照考试成绩条目中的学号归并到一个个的文件夹列表显示出来。双击文件夹列表中的某个文件夹就可以进入这个学号的历次考试成绩一览表里。点击返回按钮又可以返回到文件夹列表。这种控件咋实现?目前的项目中没有用到任何架构,只有 jquery 。我以前做 wpf 的对这里不熟,有两个不知道怎么办:

    1.这种文件夹列表控件我是不是完全用 div 套 div 实现哇。一行是一个 div 对象,然后分成几列,点击行对象跳到下一层级。还是有专门的 grid 什么之类的好轮子本身就支持这种模式可以拿来改改用呢?

    2.文件夹列表行数多的话,我觉得得滚动加载显示吧。这个滚动加载是不是要给后端同事提提需求,比如我前端滚动到某一个值时给后端要另外的数据,一页一页的要,后端同学会不会嫌我烦?一般正规点都是咋实现的哇?

    3.还有从数据库查出来的是一条条的考试信息,还要按考试信息里的学号聚合起来,做成文件夹显示,这个数据按照学号聚合是不是后端同学要做的,我只朝他要文件夹的数据就可以?用户点击文件夹某一列想正反排序时我觉得不是前端来排序,应该是想后端请求排序的结果,然后我再按照新顺序刷新一遍数据吧?还是前端直接排序,会不会前端一下子卡住哇。

    谢谢大家的指教。刚做前端没多少时间,小白一个,只能为了快做项目向大家求指导。

    22 条回复    2020-08-04 19:22:11 +08:00
    musi
        1
    musi  
       2020-08-03 20:48:41 +08:00
    1. 可以参考下百度网盘之类的是怎么实现的
    2. 后端分页不是正常操作么
    3. 量大就后端排序
    gqbre
        2
    gqbre  
       2020-08-03 20:53:47 +08:00
    字写的不错
    px920906
        3
    px920906  
       2020-08-03 21:15:23 +08:00
    现成的有 datatables https://datatables.net/examples/api/row_details.html
    不过看了下文档的示例只是预先渲染然后简单控制下面一行的显示隐藏,这样的话还不如自己实现,样式什么的都好自己控制:
    点击文件夹图标获取考试数据(不管是之前从 api 获取好处理好还是现调 api 获取),获取成功后在当前行下面新增一个 tr,里面只有一个 td[colspan=总表列数],然后把考试数据渲染到这个 td 里。当然还有触发隐藏 /移除这个 tr 的逻辑。

    后端返回列表分页不是应该的么,不过话说长表格还是分页好吧,性能先不说,不是每个用户都会 ctrl+f 的啊…

    数据聚合谁做,emmm,你们打一架谁输了谁做。我个人倾向是后端做,除非特殊需求比如前端同一个页面还有别的地方用聚合前的数据更方便些。
    排序前端“一下子卡住”是什么意思…数据就一页的话前后端都行,如果分页了那就得后端了
    seki
        4
    seki  
       2020-08-03 21:22:24 +08:00
    1.div 之类的元素就是一个个控件,可以在上面绑定 onClick 之类的监听方法
    2.数据多的时候可以按需加载,但是一般分页加载更好实现
    3.你的数据量有多少?一般普通几千上万条的排序是没什么问题的。先实现再优化吧

    建议立刻开始使用 vue 或者 react
    murmur
        5
    murmur  
       2020-08-03 21:25:23 +08:00
    不加过度美化的列表,几千行渲染根本不是问题,随便撸
    murmur
        6
    murmur  
       2020-08-03 21:27:25 +08:00
    我们大概试过直接用 vue 渲染 5000*10 左右的表格,一点问题都没有,至于双击只是交互问题,排序给后台个 sort,或者前台 sort 都没事,这数据真的不叫大

    下面是危险组件的级别:日期选择器>下拉框>单选 /复选框,避开这些随便渲染,带 css 都不怕
    zxlzy
        7
    zxlzy  
       2020-08-03 21:29:34 +08:00
    排序这个一般是前端做
    PainAndLove
        8
    PainAndLove  
       2020-08-03 21:37:01 +08:00
    @gqbre 哈哈,水都喷出来了
    AmosAlbert
        9
    AmosAlbert  
       2020-08-03 21:42:23 +08:00
    分页可以在后端做,用开源的 PageHelper 插件,排序前端就行了
    robinlovemaggie
        10
    robinlovemaggie  
       2020-08-03 21:54:46 +08:00
    jQuery 足够了,别折腾那些什么乱七八糟的,不值得~
    nnnToTnnn
        11
    nnnToTnnn  
       2020-08-03 22:41:58 +08:00
    @murmur 几千行的渲染不好说。 如果表格编辑中存在组件控件,就刚才你说的 日期选择器>下拉框>单选 /复选框 ,这些是不可能避免渲染的。大概 300 条数据左右的把。 具体的可以考虑虚拟滚动。 编辑器,用一个 div 来进行 cell 的定位。这样的话,加上 h5 的 work,几亿行都不是问题了。
    xjepiaojiangu
        12
    xjepiaojiangu  
    OP
       2020-08-04 07:30:18 +08:00 via iPhone
    @all 谢谢大家的指导,了解了好多。

    @nnnToTnnn 图 1 的文件夹列表每一行的文件夹行头确实会有一个复选框,用户可以点击每行前的复选框选中文件夹,然后统一删除。能再具体说下您说的虚拟滚动,编辑器的思路么。不剩感谢。

    另外,我的字儿就是太丑了,啊啊啊啊啊啊。没练好字。
    lisilisicn2
        13
    lisilisicn2  
       2020-08-04 10:33:58 +08:00
    比我写的好
    madpecker009
        14
    madpecker009  
       2020-08-04 10:42:02 +08:00
    layui 也有类似的 datatables 也有这样的
    bruceczk
        15
    bruceczk  
       2020-08-04 10:44:27 +08:00
    palmers
        16
    palmers  
       2020-08-04 11:38:18 +08:00
    我记得 ztree 挺好用的
    lithbitren
        17
    lithbitren  
       2020-08-04 11:58:09 +08:00
    基本上哪个框架都有这种动态表格的处理吧,分页后端,页内排序前端,大排序还是得后端。
    不过如果像学生信息这种访问量数据量不大的话,后端可以直接返回所有数据,排序分页全部前端处理都可以
    nnnToTnnn
        18
    nnnToTnnn  
       2020-08-04 13:06:42 +08:00
    @xjepiaojiangu 你可以看一下这个 https://rwpjs.vercel.app/components/base/table 这个是基于 React Data Grid 的封装
    duan602728596
        19
    duan602728596  
       2020-08-04 13:11:26 +08:00
    给你的建议:
    1 、列表可以用 table 。
    2 、不要用滚动加载(这种系统最好不要加一些自以为能让用户体验更好的效果)!!!用分页,每页显示固定条数。而且你的表格头还有排序。后加载的数据排序排到了前面,用户体验就很不好。而且用滚动加载,以后功能扩展,做查询什么的就会很麻烦。
    3 、排序让后端来做,点击排序后,刷新当前分页的数据。
    4 、建议用 vue + vue-router 来做这块的功能。原因是因为你点击文件夹,渲染了一个新的表格,这种用切换路由控制 html 渲染的方式,比你用 jquery 修改 html 改来改去方便多了。而且 vue + vue-router 还可以直接通过<script></script>接入项目。
    5 、系统开发建议用 vue 替换 jquey 。你用 vue 相比用 jquery 开发,代码内少了一大堆 DOM 操作的代码。你只要改改数据,vue 自动帮你修改界面、绑定方法,岂不美哉。
    lzk50136
        20
    lzk50136  
       2020-08-04 16:53:11 +08:00
    这是平板吗?
    fengmumu
        21
    fengmumu  
       2020-08-04 19:19:34 +08:00
    首先表格之类的可以用 grid 或者 tabl 实现,考虑是就能用 jq,估计应该不能跑新的了,找好 jq 本身有啥轮子或者自己用 tab 标签实现一个,这个难度表示不大
    争议有下面几个:
    1. 要不要分页,这个表示后端要做啊,全给前端光等待时间就很长了,当然后端如果用一些 redis 一类的数据库这个肯定后端做,如果后端每次都只能一遍一遍查,分页也是基于查询的所有结果做的,那就全给前端,前端分页
    2.滚动分页还是不要了,用户是看数据的不是随便浏览的,没有办法复原现场,还是不要分页好
    3.后端信息的聚合,如果后端可以统一给最好,如果不能或者返回时间过长可以考虑前端做聚合

    嗯,看你是想好好做还是做好,做好就是能后端就后端,好好做就是从体验入手,一些以更好的交互更快的加载为核心搞,前后端负责哪一部分就看具体的实际情况哈
    fengmumu
        22
    fengmumu  
       2020-08-04 19:22:11 +08:00
    还有个排序,这个先看是前端还是后端做分页,然后还要看产品是要本页做排序还是所有数据做排序哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   908 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:56 · PVG 05:56 · LAX 13:56 · JFK 16:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.