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

分页列表,删除最后一页的最后一条数据的场景该怎么处理

  •  
  •   rizon ·
    othorizon · 2019-09-10 19:09:09 +08:00 via iPhone · 5301 次点击
    这是一个创建于 1902 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不知道行业里通用方案怎么处理。删除最后一条数据后,由于前端请求传的页码已经是不存在的页码了,所以会返回空白。
    期望的效果是自动返回真实的最后一页的数据,也就是页码自动-1。
    这东西后台处理还是前端处理?
    后台是 java。
    第 1 条附言  ·  2019-09-25 11:19:18 +08:00
    哎 这问题逃不掉啊。 现在前端不做只能我后端做了。 但关键是怎么写可以更通用一些,,写 aop 去拦截方法,然后重新调用一次方法去返回? 还是有什么更好的办法。。
    28 条回复    2022-08-04 07:47:11 +08:00
    paodange
        1
    paodange  
       2019-09-10 19:33:10 +08:00 via Android
    后台不是会返回 pagecount 吗?跟当前页码比较一下,如果小于当前页码,就把当前页码设置为 pagecount
    limuyan44
        2
    limuyan44  
       2019-09-10 20:00:09 +08:00
    服务端查不到就返回最后一页吧,前端哪知道你还有没有新的数据了。
    ayonel
        3
    ayonel  
       2019-09-10 20:39:16 +08:00
    每次切换页面的时候也给前端返回总数据量,让前端根据这个数字动态分页
    chinvo
        4
    chinvo  
       2019-09-10 20:42:37 +08:00
    count: xxx
    amount: xxx
    offset: xxx
    data
    - obj
    - obj

    count 为 0 的时候现实一个占位符

    一定要前一页的话前端重新请求 offset = offset - count
    optional
        5
    optional  
       2019-09-10 20:53:07 +08:00 via Android
    relay 分页
    optional
        6
    optional  
       2019-09-10 20:53:42 +08:00 via Android
    看错了。
    xuanbg
        7
    xuanbg  
       2019-09-10 21:53:47 +08:00
    当然是前端处理咯,这个不是分页控件应该实现的功能么?
    shintendo
        8
    shintendo  
       2019-09-10 22:03:12 +08:00
    后端好一点吧,前端处理的话要多请求一次
    hyyou2010
        10
    hyyou2010  
       2019-09-11 03:20:18 +08:00
    恰好我前不久碰到这个问题了。最初的想法是后端处理,后端送回最后一页,也送回总数等等,但是发现这个好心帮忙反而容易导致前端状态系统紊乱。后来改成前端处理,也就是后端返回空内容及文档总数,由客户端根据情况再次请求数据。改成前端处理虽然多了一次访问,但是状态流程顺畅了,舒服。

    不仅仅是你删除最后一条或一页数据,还可能其他用户删除该数据也导致同样的问题。
    pinews
        11
    pinews  
       2019-09-11 07:42:06 +08:00
    这个东西,就是通用性与便捷性的冲突,如果你知道根本不存在数据为 0 的情况,你可以不必处理,如果你要预期这个结果,而且具有通用性,就要数据为 0 的时候就返回数据为 0 的状态,正常数据的时候也要返回额外的正常状态。不管怎么样,前端都要先检查状态,再处理数据。
    pinews
        12
    pinews  
       2019-09-11 07:45:15 +08:00
    @hyyou2010 关于这个可以看各大网站的 api 是怎么描述的,确实如 @chinvo 所言。
    LeeSeoung
        13
    LeeSeoung  
       2019-09-11 09:30:03 +08:00
    后端接口不用设计太复杂 按照当前分页、当前页数据数量作为参数就行,其他的前端处理。
    ssvfdn
        14
    ssvfdn  
       2019-09-11 10:32:27 +08:00
    删除最后一页的最后一条数据的时候,自动-1 请求。如果当前页只有 1 页就不用请求了。
    aguesuka
        15
    aguesuka  
       2019-09-11 10:41:01 +08:00 via Android
    删除以后刷新页面,pageindex=min(pagesize,querypagesize)
    hyyou2010
        16
    hyyou2010  
       2019-09-11 10:47:12 +08:00
    @ssvfdn 自动减 1 可能不行,设想你正浏览第 3 页,版主恰好把第 2 及 3 页都删除了
    mamahaha
        17
    mamahaha  
       2019-09-11 12:11:30 +08:00
    路由上带后缀的,如果数据发生了变化,那返回时肯定不能是 return back()了。
    shintendo
        18
    shintendo  
       2019-09-11 12:28:00 +08:00
    @hyyou2010 但是可能有这种情况:前端第一次请求之后,第二次请求之前,有另一个用户加了一条数据,结果就是数据总数没变,页码却往前翻了一页
    CEBBCAT
        19
    CEBBCAT  
       2019-09-11 12:42:37 +08:00
    据一个普通网民的经验:有的网站 只有 28 个 page,但?page=99 时也有内容,只不过内容是最后一页的
    lithium4010
        20
    lithium4010  
       2019-09-11 13:08:54 +08:00
    列表接口要返回

    总条数
    当前页数
    总共页数

    其他前端处理就行
    lscho
        21
    lscho  
       2019-09-11 13:17:10 +08:00 via Android
    前后端分离,前端处理
    不分离,后端处理
    learnshare
        22
    learnshare  
       2019-09-11 13:39:22 +08:00 via Android
    如果前后端分离:
    删除要指定资源 ID,和是否分页无关
    最后一页数据不存在的话,返回 404 或者空列表比较合适
    分页错误的问题是前端逻辑,前端处理就可以了
    hyyou2010
        23
    hyyou2010  
       2019-09-11 14:02:54 +08:00
    @shintendo 嗯,有这个可能,这点还真不容易想到。不过这样的结果我觉得还可以接受。
    markgor
        24
    markgor  
       2019-09-11 14:05:17 +08:00
    那个,好奇问问,删除操作后前端不会重新加载列表吗?
    后端必须有总分页数,
    当前端提交的当前页数>总分页数,就直接把当前页数设置为总分页数。
    passerbytiny
        25
    passerbytiny  
       2019-09-11 14:27:30 +08:00
    前端后端处理都是一样的。你所说的场景,实际上是两个连续但相对独立的场景:删除一条数据;重新计算总数和计算分页参数,然后重新加载当前页或最后页(不止是删除后,并发修改的时候,也会出现当前页已经不存在的情况)。

    不负责 /没时间负责的前端控件经常丢弃或忽略“重新计算分页参数”。
    水平搓 /不负责任 /没时间负责的后端,会用一个函数,就完成“删除,查询当前页数据,然后返回”的整套流程——既然是一个函数处理,那自然就超大概率忘了“数据变动后分页页码要重新计算”的场景。
    markgor
        26
    markgor  
       2019-09-23 14:34:15 +08:00
    @passerbytiny 不是很认同这个说法。

    首先前端如何都是要处理的,无非是怎么处理罢了(试问前端不处理,后端如何处理前端的事?
    “删除,查询当前页数据,然后返回” <---基本分前後端后都是接口调用取数据吧?后端没必要在删除操作后再执行一次查询数据吧?后端直接提供->新增、修改、删除、读取四个接口,如果前端删除完,直接调用讀取 即可了吧?
    rizon
        27
    rizon  
    OP
       2019-09-25 11:19:54 +08:00
    这东西,,谁有更好的办法吗。。。前端不做 后端要做这个了。。
    nmsn
        28
    nmsn  
       2022-08-04 07:47:11 +08:00
    这个后端处理吧,前端不是知道数据的具体变动,后端才知道真正的最后一页是啥
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3740 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:19 · PVG 12:19 · LAX 20:19 · JFK 23:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.