详解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 相关文章推荐
JavaScript的parseInt 进制问题
May 07 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
Jan 06 Javascript
在新窗口打开超链接的方法小结
Apr 14 Javascript
jQuery中 prop() attr()使用详解
May 19 Javascript
在JSP中如何实现MD5加密的方法
Nov 02 Javascript
微信小程序之ES6与事项助手的功能实现
Nov 30 Javascript
webpack学习笔记之优化缓存、合并、懒加载
Aug 24 Javascript
vuex提交state&amp;&amp;实时监听state数据的改变方法
Sep 16 Javascript
echarts统计x轴区间的数值实例代码详解
Jul 07 Javascript
vue登录以及权限验证相关的实现
Oct 25 Javascript
ES6中new Function()语法及应用实例分析
Feb 19 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
Dec 05 Javascript
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
js下函数般调用正则的方法附代码
2008/06/22 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
2013/06/05 PHP
php中opendir函数用法实例
2014/11/15 PHP
laravel学习教程之存取器
2016/07/30 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
extjs tabpanel限制选项卡数量实现思路及代码
2013/04/02 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
Python字符转换
2008/09/06 Python
Python实现图像几何变换
2015/07/06 Python
21行Python代码实现拼写检查器
2016/01/25 Python
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
python使用tornado实现简单爬虫
2018/07/28 Python
python+mysql实现教务管理系统
2019/02/20 Python
python多进程并行代码实例
2019/09/30 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
python实现学生信息管理系统源码
2021/02/22 Python
佳能英国官方网站:Canon UK
2017/08/08 全球购物
当当网官方旗舰店:中国图书销售夺金品牌
2018/04/02 全球购物
医药营销个人求职信范文
2014/02/07 职场文书
大学新学期计划书
2014/04/28 职场文书
物流业务员岗位职责
2015/04/03 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
责任书范本大全
2015/05/11 职场文书