详解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 相关文章推荐
JS中==与===操作符的比较
Mar 21 Javascript
对采用动态原型方式无法展示继承机制得思考
Dec 04 Javascript
javascript 获取函数形参个数
Jul 31 Javascript
Javascript数组循环遍历之forEach详解
Nov 07 Javascript
深入理解Angular4订阅(Subscribe)与取消
Nov 22 Javascript
基于datepicker定义自己的angular时间组件的示例
Mar 14 Javascript
linux 后台运行node服务指令方法
May 23 Javascript
Vue Router去掉url中默认的锚点#
Aug 01 Javascript
微信小程序中使用wxss加载图片并实现动画效果
Aug 13 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
May 15 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
Jul 06 Javascript
Vue页面渲染中key的应用实例教程
Jan 12 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
2014/12/04 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
vue 使用html2canvas将DOM转化为图片的方法
2018/09/11 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
python编写爬虫小程序
2015/05/14 Python
Python中线程编程之threading模块的使用详解
2015/06/23 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
python实现图片筛选程序
2018/10/24 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
2020/05/11 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
详解anaconda安装步骤
2020/11/23 Python
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
校园十佳歌手策划书
2014/01/22 职场文书
英语通知范文
2015/04/22 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript