详解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 序列化对象实现代码
Dec 18 Javascript
原生javascript模仿win8等待提示圆圈进度条
Apr 24 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
Jul 01 Javascript
jQuery如何使用自动触发事件trigger
Nov 29 Javascript
AngularJS实现全选反选功能
Dec 08 Javascript
JavaScript实现省市联动过程中bug的解决方法
Dec 04 Javascript
浅谈gulp创建完整的项目流程
Dec 20 Javascript
vue实现一拉到底的滑动验证
Jul 25 Javascript
详细分析React 表单与事件
Jul 08 Javascript
小程序实现可拖动的悬浮按钮
Sep 07 Javascript
梳理一下vue中的生命周期
Dec 30 Vue.js
JavaScript设计模式之原型模式详情
Jun 21 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
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
PHP远程连接MYSQL数据库非常慢的解决方法
2008/07/05 PHP
php session 错误
2009/05/21 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
javascript动态加载二
2012/08/22 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
微信小程序录音与播放录音功能
2017/12/25 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
详解python读取image
2019/04/03 Python
关于Python-faker的函数效果一览
2019/11/28 Python
用python解压分析jar包实例
2020/01/16 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
欧洲当代手工玻璃和瓷器的领先品牌:LSA International
2018/06/03 全球购物
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
水利学院求职自荐书
2014/02/01 职场文书
应聘英语教师求职信
2014/04/24 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
小石潭记导游词
2015/02/03 职场文书
爱的教育观后感
2015/06/17 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
创业计划书之旅游网站
2019/09/06 职场文书
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python