关于对象里面有很多参数需要处理的问题

2019-12-13 14:26:58 +08:00
 zzlit

比如说这种情况,从后端请求一个接口,然后返回的值里面有部分需要重新组装成前端需要的格式,而有部分又不需要,这时就会有很长的一段代码,如下:

const data = await getShopDetail({id})
let detail = {}
// 下面只给出了几种情况,实际是有更多的情况的
// 不需要改动
detail.name = data.name

// 这里处理时间
detail.created_at = day(data.created_at)

// 一些判断处理
detail.status = data.status.toString() ? data.status.toString() : ''

// 判断有没有时间然后再处理
if (data.cosume_times) {
  const [start, end] = data.cosume_times.split('-')
  detail.cosume_times_start = day(start, 'HH:mm')
  detail.cosume_times_end = day(end, 'HH:mm')
}

// 做图片处理
detail.img = data.img ? JSON.parse(data.img) : []
detail.img.forEach((item, index) => {
  ...
})

// 数组里面做一些运算处理
data.info.forEach(item => {
  if (item.type === 1) {
    detail.count = item.count
    detail.rate = NP.divide(item.rate, 100)
    if (item.food_type === 1) {
      detail.price = NP.divide(item.price, 100)
      detail.weight = NP.divide(item.weight, 100)
    } else {
      ...
    }
  } else {
    ...
    if (item.food_type === 1) {
      ...
    } else {
      ...
    }
  }
})

// 做一些运算处理
detail.profit = data.profit !== '' ? NP.divide(data.profit, 100) : ''

this.setState({
  detail
})

相应的获取详情之后编辑提交的时候肯定也会有如上类似的处理组装成后端需要的格式,同样也是一大段类似的代码,请问大佬这种该怎么优化呢?

3031 次点击
所在节点    JavaScript
12 条回复
guyeu
2019-12-13 15:46:32 +08:00
有一大堆名称很像的工具库:BeanUtils,其实没办法解决真正的痛点。。。
kiracyan
2019-12-13 15:49:30 +08:00
前端最好不处理数据 都是让后端处理的..
rain0002009
2019-12-13 15:52:56 +08:00
我很好奇 data.img 返回的是个字符串吗 竟然需要 JSON.parse 这不应该呀
a570295535
2019-12-13 15:55:28 +08:00
对不起,找不到对象!
KuroNekoFan
2019-12-13 15:55:43 +08:00
dirty work 逃得掉吗?逃不掉!其实就是比较烦人,不一定会耗费很多时间。
我比较推荐前端定义自己的 view model,然后和后台交互的时候转换一下,这样比较 flexible
lihongjie0209
2019-12-13 16:08:39 +08:00
你写后端也会有这个问题, 在前端看来是一个接口, 其实后端调用了 N 个外部接口+N 个数据库查询然后再组装计算出来的。 只要是系统集成对接就会有这个问题, 所以, 慢慢写喽。

至于说让后端把数据处理好给前端??一个接口写 N 次就是为了小程序和安卓 UI 上一个字段的格式不同???


后端接口要具有一定的抽象, 把一些共性的东西确定好, 把一些通用的东西规范化, 这样才能足够灵活。


比如说一个日期格式, 小程序端需要显示 20190101, 安卓端需要显示 2019/01/01, 后端需要把这个抽象出来,然后规范化: 返回一个日期 2019-01-01,至于说怎么展示, 那么每个客户端都按照自己的需要去格式化就好了,后端只需要保证数据是能够覆盖客户端的需求就好了
zzlit
2019-12-13 16:28:41 +08:00
@guyeu 但我觉得引入工具库又额外增加成本了。。
@kiracyan 但是后台传过来的数据总还是需要进行处理,可能没有我例子那么多罢了
@rain0002009 就是字符串。。。
@KuroNekoFan 其实根本的解决方法的确是这样的,只是就目前来看是不可能了,所以就想看看有没有什么好一点的写法
@lihongjie0209 谢谢指点!
Light3
2019-12-13 16:35:13 +08:00
是这样的 看你和后端能不能沟通了...
反正至少要有一方的代码是这样的
或者两方都是
因为后端 很多的数据也是 数据库查询拼接 然后转换给你的..
我之前写的接口 基本都是 让前端当傻瓜 直接拿值显示就行了..

不过作为成长 个人觉得还是 更多的学习处理数据 会带来提高 (因我认识个哥们 直接数据库查出来就抛出来了 前端自己想办法)
Greendays
2019-12-13 16:56:14 +08:00
如果后端没法改的话,这也是没办法的。我觉得后端应该尽可能简单一些,把该传的字段都传了就行了,至于怎么用那是前端的事情。
GzhiYi
2019-12-13 17:12:31 +08:00
后端返回基本而且通用的数据格式,前端进行处理。
Mutoo
2019-12-13 17:20:03 +08:00
一般我会把接口数据按后端给的结构放在 model 层,方便更新和提交,
然后在 viewModel 层转换成需要的格式用于显示和交互。
对 redux 来说 model 层就是 store,vm 就是 reselect
对 vue 来说就是 data / computed
wheatup
2019-12-23 15:14:06 +08:00
这种情况还是用`useMemo`的 hook 吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/628731

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX