详解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实例教程(19) 使用HoTMetal(3)
Dec 23 Javascript
JavaScript进阶教程(第四课第一部分)
Apr 05 Javascript
jquery实现简单手风琴菜单效果实例
Jun 13 Javascript
jquery.map()方法的使用详解
Jul 09 Javascript
详解AngularJs中$resource和restfu服务端数据交互
Sep 21 Javascript
react native与webview通信的示例代码
Sep 25 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
Oct 09 jQuery
浅析vue深复制
Jan 29 Javascript
vue文件树组件使用详解
Mar 29 Javascript
详解vue-cli中模拟数据的两种方法
Jul 03 Javascript
layui获取选中行数据的实例讲解
Aug 19 Javascript
vue中引入第三方字体文件的方法示例
Dec 17 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
谈谈PHP语法(3)
2006/10/09 PHP
同时提取多条新闻中的文本一例
2006/10/09 PHP
PHP5+UTF8多文件上传类
2008/10/17 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
CentOS安装pillow报错的解决方法
2016/01/27 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
Python中格式化字符串的四种实现
2020/05/26 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
倩碧美国官网:Clinique美国
2016/07/20 全球购物
应聘英语教师求职信
2014/04/24 职场文书
应届毕业生求职信
2014/05/26 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
2014年消防工作总结
2014/11/21 职场文书
就业意向书范本
2015/05/11 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript