详解vuex commit保存数据技巧


Posted in Javascript onDecember 25, 2018

vuex 单向数据流,推荐的commit 改变state数据,写起来非常繁琐,因为改数据可能要写很多commit函数。

依据我的理解,单向数据流主要是为了避免数据混乱,便于调试。 说白了,就是一个数据改变了,是什么促使他改变的。

数据流向永远都是一个方向,下游是没有权利改变数据的,所以需要数据发放中心同一级的方法来改变数据。

单项数据流,对于react来说,的确是必要的,但对于vue来说,是那么有必要吗?

vue采用数据依赖更新,必要的数据都采用Object.defineProperty处理。给数据赋值时,本来就会通知所有采用此数据的dom更新,不管是不是父级还是子级组建的dom。

使用vuex时 官方推荐使用commit才修改state数据。

优点

  • 便于调试,当数据变化时,可以在vuetools工具中看到是哪个函数修改了state值。

缺点

  • 采用commit修改数据,可能会写很多mutations函数。
  • 会上丧失掉一部分性能。因为新数据需要重新配置watcher。

优化

对于采用commit保存state数据的,可以采用如下方式:

传一个字符串的path和需要修改的值,如果path='a.b.c'就换算成 state.a.b.c = 'needsave', 这就达到了一个commit 解决所有保存的问题。

// mutations中的函数
save(state, { path, data }) {
 if (!path ) {
 throw new Error('need path')
 }
 const keyPath = path.split('.')
 let needSave = state
 for (let i = 0; i < keyPath.length - 1; i++) {
 needSave = needSave[keyPath[i]]
 if(!needSave) {
 throw new Error(`error path: ${keyPath[i]}`)
 }
 }

 needSave[keyPath[keyPath.length - 1]] = data
},
// 使用
vuex.commit('save', {path:'a.b.c', data:val})
// 结果
state.a.b.c = '我是需要保存的数据'

在组件中

//如果要双向绑定某个vuex中的值。
<input v-model="c">
 
//script
 
computed: {
 c: {
  get(){
   return vuex.state.a.b.c
  }, 
  set(val) {
   vuex.commit('save', {path:'a.b.c', data:val})
  }
 } 
}
// 这样就做到了在组件中双向绑定,并且使用commit改变state中的值,vuex使用严格模式也不会报错了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用正则xmlHttp实现的偷(转)
Jan 22 Javascript
jQuery右键菜单contextMenu使用实例
Sep 28 Javascript
利用jQuery实现可以编辑的表格
May 26 Javascript
javascript的正则匹配方法学习
Feb 24 Javascript
基于js实现的限制文本框只可以输入数字
Dec 05 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
Sep 07 jQuery
vue实现商品加减计算总价的实例代码
Aug 12 Javascript
js根据需要计算数组中重复出现某个元素的个数
Jan 18 Javascript
微信小程序实现手势滑动卡片效果
Aug 26 Javascript
react实现移动端下拉菜单的示例代码
Jan 16 Javascript
开发Node CLI构建微信小程序脚手架的示例
Mar 27 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
Dec 02 Vue.js
bootstrap table实现合并单元格效果
Dec 24 #Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
Dec 24 #Javascript
Windows下支持自动更新的Electron应用脚手架的方法
Dec 24 #Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
Dec 24 #Javascript
Vue.js组件高级特性实例详解
Dec 24 #Javascript
JavaScript模板引擎原理与用法详解
Dec 24 #Javascript
jQuery实现的简单日历组件定义与用法示例
Dec 24 #jQuery
You might like
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
jquery动态添加删除(tr/td)
2015/02/09 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
javascript针对不确定函数的执行方法
2015/12/16 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
jQuery中的for循环var与let的区别
2018/04/21 jQuery
微信小程序API—获取定位的详解
2019/04/30 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
老生常谈Python进阶之装饰器
2017/05/11 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
护士自荐信
2013/10/25 职场文书
创伤外科专业推荐信范文
2013/11/19 职场文书
会计系中文个人求职信
2013/12/24 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
地质灾害防治方案
2014/05/14 职场文书
英语系毕业生求职信
2014/07/13 职场文书
初中学校对照检查材料
2014/08/19 职场文书
2015年教师新年寄语
2014/12/08 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python