一、对 uniapp 使用 setData 的思考

我最近在重写我们的小程序,使用 uniapp写的百度小程序,写出了这样一段代码

  1. this.loadNextWaterFall({
  2. ...this.basePageInfo,
  3. page:page+1
  4. })
  5. setData.call(this,{
  6. basePageInfo:{
  7. ...this.basePageInfo,
  8. page:page+1
  9. },
  10. })
  • 这里的 setData 是一个函数,引入之后,就能够想微信小程序同样的设置值,后来我觉得,这很不优雅。
  • 想一想,React 和 Vue 是目前的主流框架,微信小程序借鉴了 React 和 Vue,出了 setData。uniapp 使用的是 Vue,我完全可以用 Vue 的语法习惯啊,为什么还要重新造一个 API 去借鉴微信小程序呢?

所以,这段代码代码可以这样改写,两行搞定

  1. this.basePageInfo.page += 1
  2. this.loadNextWaterFall(this.basePageInfo)

在 Vue 中,改变 data 中变量的值后

  • 在 JS 中,它是立即变化,并且立即生效的
  • 在 UI 渲染中,它是异步渲染的

这是一个小知识点

对比 React 给 data 中变量重新赋值

  • 变量的老值一直还是那个值,新值异步后再赋值上去(和Vue不同,不是立即生效!)

二、代码修改记录

在此记录一下,修改前后的代码比较:

  1. // 改写前
  2. this.loadNewWaterFall({
  3. ...this.basePageInfo,
  4. level2:id,
  5. level3:0,
  6. sortId: '',
  7. ratioId: -1
  8. })
  9. setData.call(this,{
  10. navSwitch:{
  11. ...this.navSwitch,
  12. mainTitleId:id,
  13. minorTitleIdList:[0,'',-1]
  14. },
  15. basePageInfo:{
  16. ...this.basePageInfo,
  17. level2:id,
  18. level3:0,
  19. sortId: '',
  20. ratioId: -1
  21. }
  22. })
  23. //**********************************************************************************
  24. // 改写后
  25. this.basePageInfo.level2 = id
  26. this.basePageInfo.level3 = 0
  27. this.basePageInfo.sortId = ''
  28. this.basePageInfo.ratioId = -1
  29. this.loadNewWaterFall(this.basePageInfo)
  30. this.navSwitch.mainTitleId = id
  31. this.navSwitch.minorTitleIdList = [0,'',-1]
  1. // 改写前
  2. this.loadNewWaterFall({
  3. ...this.basePageInfo,
  4. level3:idList[0],
  5. sortId:idList[1],
  6. ratioId:idList[2]
  7. })
  8. setData.call(this,{
  9. 'navSwitch.minorTitleIdList':idList,
  10. basePageInfo:{
  11. ...this.basePageInfo,
  12. level3:idList[0],
  13. sortId:idList[1],
  14. ratioId:idList[2]
  15. }
  16. })
  17. //**********************************************************************************
  18. // 改写后
  19. this.basePageInfo.level3 = idList[0]
  20. this.basePageInfo.sortId = idList[1]
  21. this.basePageInfo.ratioId = idList[2]
  22. this.navSwitch.minorTitleIdList = idList
  23. this.loadNewWaterFall(this.basePageInfo)
  1. // 改写前
  2. if(keyword !== this.basePageInfo.keyword){
  3. this.loadNewWaterFall({
  4. ...this.basePageInfo,
  5. keyword
  6. })
  7. }
  8. setData.call(this,{
  9. navSearch:{
  10. ...this.navSearch,
  11. contentShow:false,
  12. keyword
  13. },
  14. })
  15. //**********************************************************************************
  16. // 改写后
  17. if(keyword !== this.basePageInfo.keyword){
  18. this.basePageInfo.keyword = keyword
  19. this.navSearch.keyword = keyword
  20. this.loadNewWaterFall(this.basePageInfo)
  21. }
  22. this.navSearch.contentShow = false
  1. // 改写前
  2. if(this.basePageInfo.keyword){
  3. this.loadNewWaterFall({
  4. ...this.basePageInfo,
  5. keyword:''
  6. })
  7. }
  8. setData.call(this,{
  9. navSearch:{
  10. ...this.navSearch,
  11. keyword:'',
  12. contentShow:false
  13. },
  14. basePageInfo:{
  15. ...this.basePageInfo,
  16. keyword:''
  17. }
  18. })
  19. //**********************************************************************************
  20. // 改写后
  21. if(this.basePageInfo.keyword){
  22. this.basePageInfo.keyword = ''
  23. this.loadNewWaterFall(this.basePageInfo)
  24. }
  25. this.navSearch.keyword = ''
  26. this.navSearch.contentShow = false
  1. // 改写前
  2. if(keyword !== this.basePageInfo.keyword){
  3. this.loadNewWaterFall({
  4. ...this.basePageInfo,
  5. keyword
  6. })
  7. }
  8. setData.call(this,{
  9. navSearch:{
  10. ...this.navSearch,
  11. contentShow:false,
  12. keyword
  13. },
  14. basePageInfo: {
  15. ...this.basePageInfo,
  16. keyword,
  17. }
  18. })
  19. //**********************************************************************************
  20. // 改写后
  21. if(keyword !== this.basePageInfo.keyword){
  22. this.basePageInfo.keyword = keyword
  23. this.loadNewWaterFall(this.basePageInfo)
  24. }
  25. this.navSearch.contentShow = false
  26. this.navSearch.keyword = keyword

这种写法,可读性和可维护性大大增加啊,感觉很 nice!
用 Vue 的时候,不要以 React 的思维方式写代码,使用什么工具,就是好好使用该工具的特性,不然代码显得很呆。

三、小结

这次的修改记录即“消灭原来的setData”,原来 300 多行的 Vue 文件缩减到了 200 多行,可读性和可维护性大大增加了。

「@浪里淘沙的小法师」