详解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 相关文章推荐
超级有用的13个基于jQuery的内容滚动插件和教程
Jul 31 Javascript
JS调用CS里的带参方法实例
Aug 01 Javascript
javascript制作的cookie封装及使用指南
Jan 02 Javascript
jQuery模拟黑客帝国矩阵效果实例
Jun 28 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
Jan 27 Javascript
详解微信小程序 wx.uploadFile 的编码坑
Jan 23 Javascript
Angular多选、全选、批量选择操作实例代码
Mar 10 Javascript
微信小程序选择图片和放大预览图片功能
Nov 02 Javascript
解决bootstrap-select 动态加载数据不显示的问题
Aug 10 Javascript
解决JS表单验证只有第一个IF起作用的问题
Dec 04 Javascript
Promise扫盲贴
Jun 24 Javascript
如何通过javaScript去除字符串两端的空白字符
Feb 06 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 spl_autoload_register实现自动加载研究
2011/12/06 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
Web层改进II-用xmlhttp 无声息提交复杂表单
2007/01/22 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
jQuery实现获取h1-h6标题元素值的方法
2017/03/06 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
了解JavaScript表单操作和表单域
2019/05/27 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
详解React 元素渲染
2020/07/07 Javascript
Python 数据结构之堆栈实例代码
2017/01/22 Python
解读! Python在人工智能中的作用
2017/11/14 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
分析经典Python开发工程师面试题
2019/04/08 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
python计算导数并绘图的实例
2020/02/29 Python
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
应聘收银员个人的求职信
2013/11/30 职场文书
小学美术教学反思
2014/02/01 职场文书
电力公司个人求职信范文
2014/02/04 职场文书
幼儿教师研修感言
2014/02/12 职场文书
师德师风个人反思
2014/04/28 职场文书
道歉情书大全
2015/05/12 职场文书
找规律教学反思
2016/02/23 职场文书
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript