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

答案就是在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: '', // 店铺logo
name: '', // 店铺名称
}
},
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
}
} = result
if (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 // 存state
Object.assign(state.initData.shop, {
isCollected: Boolean(favorited), // 是否收藏
id: shopId,
logo: logoImgUrl ? formatImg(logoImgUrl) : state.defaultData.defaultShopLogo, // 店铺logo
name: 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:可根据业务模块的需要,将初始化数据放在合适的位置[如业务进入页面的位置等]

vuex数据管理-数据适配的更多相关文章

  1. 为什么Vuex内数据改变了而组件没有进行更新?

    这两天在进行一个首页的制作,结果就碰到了标题上所述的问题了,用了一天的时间在网上查资料.终于找出了问题所在 Vuex的数据写在store里,在组件中需要用到this.$store.commit() 来 ...

  2. 关于mvvm:UI、数据、绑定、状态、中间变量、数据适配、数据处理

    绑定: UI控件 --> VM    VM -> UI控件 关于mvvm:UI.数据.绑定.状态.中间变量.数据适配.数据处理: https://github.com/zzf073/Log ...

  3. vue render函数使用jsx语法 可以使用v-model语法 vuex实现数据持久化

    render函数使用jsx语法: 安装插件  transform-vue-jsx 可以使用v-model语法安装插件 jsx-v-model .babelrc文件配置: vuex实现数据持久化 安装插 ...

  4. 简述vuex的数据传递流程

    简述vuex的数据传递流程 当组件进行数据修改的时候我们需要调用dispatch来触发actions里面的方法.actions里面的每个方法中都会有一个commit方法,当方法执行的时候会通过comm ...

  5. 解决vuex的数据刷新(F5)后会被初始化的问题

    介绍一个vuex的数据刷新(F5)后会被初始化的问题处理的插件:vuex-localstorage 实现的原理大概就是监听浏览器的刷新,关闭事件,把vuex的值存储到本地localstorage,刷新 ...

  6. 关于vuex的数据不直接给data而要通过computed

    # 为什么vuex的数据不直接给data而要通过computed计算 ## 疑惑 其实一直以来使用vue的状态管理vuex都有一个疑惑,文档中介绍,vue的状态数据`$store.state.xx`的 ...

  7. vuex数据管理-数据模块化

    对于vue这类mvvm框架来说,其核心就是组件与数据,因此做好相应的数据管理极为重要.这里分享下vuex数据模块化管理的方法,有利于搭建便于维护.协作的vue项目. vuex管理基本方法和使用 模块化 ...

  8. vue进阶:vuex(数据池)

    非父子组件传值 vuex 一.非父子组件传值 基于父子组件通信与传值实现非父子组件传值的示例关键代码: <template> <div> <!-- 学员展示 --> ...

  9. vuex数据管理-数据共享

    应用场景 提供一个地址省市区地址联动操作的应用场景:在地址管理的地址修改.地址添加.选择送货区域等逻辑中,会用到该联动picker.在地址picker操作中,需要请求省份列表,下面以省份列表的操作为例 ...

随机推荐

  1. Delphi for iOS开发指南(5):在iOS应用程序中使用Calendar组件来选择日期

    http://blog.csdn.net/delphiteacher/article/details/8923519 在FireMonkey iOS应用程序中的Calendar FireMonkey使 ...

  2. Git提取两次提交的差异文件

    1. 创建清单文件 获取两次提交之间的文件差异,并将文件清单保存到diff.txt文件中 Git diff --name-only 173d3010 18586360 > diff.txt 2. ...

  3. Mac iTerm2登陆CentOS提示warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

    [报错原因]:没有utf-8这个语系(没添加语言_国名前缀),LC_ALL又没设定值. 服务端解决方法: 在远程系统上, /etc/environment 加入以下两行,重新登陆即可. LANG=en ...

  4. ASP.NET MVC学习之模型验证详解

    ASP.NET MVC学习之模型验证篇 2014-05-28 11:36 by y-z-f, 6722 阅读, 13 评论, 收藏, 编辑 一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们 ...

  5. C# 基础篇

    全篇依据 C#高级编程(第9版) 内容记录: 基础知识C# 5.0 基础 分为15章内容来介绍 核心C# 对象和类型 继承 泛型 数组 运算符和类型强制转换 委托和lambda表达式,事件 字符串和正 ...

  6. BitAdminCore框架应用篇:(四)核心套件querySuite按钮功能

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...

  7. 微信小程序开发教程(一)—介绍和准备

    前言: 因为客户需要,也为了更好的发展我们公司的产品,所以决定扩展移动端.但是由于公司没有原生安卓开发人员,而且开发安卓成本比较高,所以公司一致决定开发微信小程序,也是由于微信小程序最近的火热. 后台 ...

  8. 根据已有的Jar包 一键生成对应的mavenpom.xml信息

    根据已有的jar包信息一键生成对应的maven坐标信息 .想一个问题 假如 我有一个SSH的项目, jar包是配置在lib中, 我现在想把它做成maven格式的SSH项目  ,那么这些jar包在mav ...

  9. uiautomator2

    uiautomator2    该项目正在火热的开发中 uiautomator2 是一个可以使用Python对Android设备进行UI自动化的库.其底层基于Google uiautomator,Go ...

  10. eclipse常见使用方法

    1.修改字体大小,字符类型(设置为中欧字符) window-preferences-General-Appearance-Colors and Fonts-Basic-Text Font修改 2.展示 ...