由于接口在上线前,不可避免的会出现变动,小则属性名变,大则结构变化。如果处理不当,结构变化时,视图的代码也需要做相应的更改,然后就是容错方法的变动,接着重新自测等,这样,变化成本随着结构的复杂度大大加深。如何适应这种变化,从而提供一种稳定的数据结构供视图使用,提升开发、协作效率呢?

答案就是在vuex当中增加适配层。因为vuex可提供异步请求、数据存取的能力,甚至可以进行数据的统一格式化(getters),从而提供给视图稳定的数据结构。

下面以页面中的shop模块为例,看看整个数据适配的流程及优点,该模块的视图如下:

图一 shop视图在页面中的展现

该业务模块动态加载,加载逻辑:当后台数据返回了相应的shopInfo属性时,展现,否则不展现。看看原始的数据结构:

{result: {productAllVo: {productReal: {shopInfo: {productNum: 123,logoImgUrl: '149179710440827259.jpg',favorited: false},shopName: '\u5e97\u94fa\u540d\u79f0'},shopId: '123'}}
}

发现shop视图所需的数据,并没有完全在一个数据结构当中,而是分散的。

shop模块的数据适配过程

  • step1:定义视图所需的原始数据结构,并进行初始化;
// vuex a.js
const state = {initData: {shop: {isShow: false, // 是否展现店铺isCollected: false, // 是否收藏id: 0,productTotal: 0,logo: '', // 店铺logoname: '', // 店铺名称}},interactData: {}
}

vuex的state属性,提供initData与interactData两个部分,其中的initData存储页面初始化数据,而interactData存储页面的交互状态。初始化数据一般设置叶子属性的默认值,从而避免多级调用的时候,报错。如调用state.initData.shop.id,在不确定的情况下需要一级一级的进行空值判断,代码又臭又长:

    if (state && state.initData && state.initData.shop) {let id = state.initData.shop.id}

而经过叶子属性默认值设置的调用,将省去层层判断。特别是vue数据驱动的视图情况下,视图中调用,常常会发生空值调用错误,如此操作,便可避免。

通过定义初始化数据结构,将容错、展现判断逻辑融入数据结构当中,相应视图组件,只需要关注初始化定义中的数据结构,从而简化了数据流的来源和处理。

  • step2:使用action获取后台原始数据;
// actions 数据接口管理
const actions = {// 获取初始化的产品数据getProductData({commit}, params) {return new Promise((resolve, reject) => {getReactDetailInfo(params).then(({success, result}) => {if (success) {let {productAllVo: {productType}} = resultif (productType == 'real') {// mutation方法,存入state中commit('initShop', result)resolve(data)} else {resolve(productType)}} else {reject()}})})}

通过调用action中的方法,获取后台数据,并通过mutations的方法,将数据存入state中。

  • step3: 使用mutations将数据存入state中
// mutations 状态转换 和 数据适配
const mutations = {// 初始化数据处理 店铺数据initShop(state, product) {let {productAllVo: {shopId,productReal: {shopName,shopInfo}}} = product// shopInfo为非必需let isShow = Boolean(shopInfo)let {logoImgUrl,favorited,productNum} = !shopInfo ? {} : shopInfo// 存stateObject.assign(state.initData.shop, {isCollected: Boolean(favorited), // 是否收藏id: shopId,logo: logoImgUrl ? formatImg(logoImgUrl) : state.defaultData.defaultShopLogo, // 店铺logoname: shopName, // 店铺名称type: extType, // JD京东商品isShow,productTotal: toNumber(productNum)})}
}

如此,便实现了数据的适配,当数据结构发生变化时,只需在step3当中,修改获取数据结构,和数据赋值部分便可。如数据结构及数据名称发生调整,
shopIdresult.productAllVo.shopId -> result.productAllVo.productReal.shopInfo.id
则step3变成:

图2 数据结构变化对应的数据提取变化
其中,仅id的提取位置,名称,赋值名称发生变化。而对应视图,完全可以不用改变,容错,测试更是省略。so easy~~~

总结:

数据适配的流程:

  • step1:数据初始化定义;
  • step2:原始数据请求;
  • step3:数据提取与容错处理;
  • step4:数据调用。最后的数据调用方法省略,在视图中,可随意调用,结合getters可以实现多处调用的格式化(数据共享),结合mapState等方法,可以使代码更为简洁。

优点:

  • a、数据初始化结构与视图所需结构完全吻合,命名由前端自定义规范,不受后端数据的影响;
  • b、可简化视图数据的容错过程,在数据适配中调整;
  • c、当接口发生变化时,只需非常少的成本调整数据,不在需要反复的确认、测试等等;
  • d、便于数据结构新老交替,当组件升级或者数据结构升级时,可很方便提供兼容数据结构。

tips:可根据业务模块的需要,将初始化数据放在合适的位置[如业务进入页面的位置等]

转载于:https://www.cnblogs.com/hity-tt/p/7795288.html

vuex数据管理-数据适配相关推荐

  1. NR 5G SDAP业务数据适配协议

    SDAP业务数据适配协议 Service Data Adaptation Protocol 功能 传输用户数据: 为上下行数据进行QoS流到数据无线承载的映射,一个或者多个QoS流可以映射到同一个DR ...

  2. 工作总结10:解决vuex刷新数据消失

    解决vuex刷新数据消失

  3. vue--如何使用vuex储存数据

    vue--如何使用vuex储存数据 1.定义 2.需要定义三个地方 3.往里面添加数据 4.取数据 1.定义 最后形成这样的结构,system.js为自定义储存的地方 2.需要定义三个地方 1.sto ...

  4. vant 项目_vueCli4+vant+router+vuex+移动端适配

    教程的开始 各位同学请先安装node.npm.vuecli4 巴拉巴拉... 废话不多说立即开始 随便找个地方 cmd,powerShell也可以 命令行走起 1. 创建vue项目 随便起个名字就叫m ...

  5. 用uniapp做电商项目时使用vuex实现数据的全局共享来做购物车页面

    一.配置vuex: 1.在项目根目录中创建store文件夹,专门用来存放vuex相关的模块 2.在store目录中新建store.js文件 3.在store.js初始化store的实例对象 //1.导 ...

  6. Vue--- VueX基础 (Vuex结构图数据流向)1.1

    Vuex基础 https://vuex.vuejs.org/zh-cn state --> view --> action -> state 多组件共享状态, 之前操作方式,由父组件 ...

  7. vuex清掉数据_解决vuex state数据刷新清空的几种方法

    vuex state刷新配置的数据会刷新 作为一个vue小白,刚接触到vue,很多技术都是慢慢摸索着前行的. 1.最近要做一个前端,菜单和导航都要在json中配置,看了一天vue官网,发现可以在vue ...

  8. vuex存储数据的几种方法

    一.Vuex是什么 Vuex是专门为Vuejs应用程序设计的状态管理工具.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 1.Vuex的构成 1)stat ...

  9. watch监听vuex内部数据变化

    2019独角兽企业重金招聘Python工程师标准>>> //使用计算属性连接vuex的变量,在用watch去监听,变相的实现监听vuex内部state变化 <template& ...

最新文章

  1. Linux那些事儿 之 戏说USB(31)驱动的生命线(三)
  2. 1.2 学习笔记之数据类型
  3. java通过commons-fileupload实现多张图片的上传(servlet)
  4. 【转】4.2使用jQuery.form插件,实现完美的表单异步提交
  5. java long的包,long longValue()
  6. hbuilderx版本怎么更新到新版本_2.9版本快雪迎春更新公告
  7. Android移植之自定义ProgressBar
  8. flume与log4j的整合
  9. Pascal VOC 2012数据集下载(速度很快)
  10. windows录屏_电脑是怎么录屏的呢?推荐三个录屏实用方法!
  11. java 链表 插入_Java链表中添加元素的原理与实现方法详解
  12. 酒店宾馆wifi无线上网认证,手机认证方式详解
  13. 定位CPU飙升问题点
  14. RTSP流媒体播放器实现
  15. 在Swift中使用dispatch_once单例模型
  16. JAVA分解与合并文件函数_Windows WIM文件的分割,合并,瘦身操作
  17. 多签名基础——General forking lemma(分叉引理)
  18. 如何使计算机每隔X秒按一次键
  19. java 字符串转换成map_java中string类型转换成map
  20. 使用js、php制作99乘法表

热门文章

  1. 卡拉OK效果的实现-iOS音乐播放器
  2. 读《人,绩效和职业道德》有感
  3. 几个书本上不常见到的C语言函数
  4. Selenium常用API的使用java语言之7-控制浏览器操作
  5. 微信小程序实现图片是上传、预览功能
  6. Gradle Build Tool
  7. 【洛谷P1381】单词背诵
  8. BeautifulSoup库的使用
  9. git学习——四git版本管理
  10. Java反射研究(2)