详解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 相关文章推荐
jquery事件机制扩展插件 jquery鼠标右键事件
Dec 21 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
Jun 18 Javascript
js判断上传文件的类型和大小示例代码
Oct 18 Javascript
Javascript基础教程之比较操作符
Jan 18 Javascript
JS实现的另类手风琴效果网页内容切换代码
Sep 08 Javascript
详解JS正则replace的使用方法
Mar 06 Javascript
jQuery图片轮播插件——前端开发必看
May 31 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
Aug 05 Javascript
vue跨域解决方法
Oct 15 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
Jan 08 Javascript
vue项目动态设置页面title及是否缓存页面的问题
Nov 08 Javascript
详解基于node.js的脚手架工具开发经历
Jan 28 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
一个简洁的多级别论坛
2006/10/09 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
PHP的PDO大对象(LOBs)
2019/01/27 PHP
利用javascript/jquery对上传文件格式过滤的方法
2009/07/25 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
jQuery利用sort对DOM元素进行排序操作
2016/11/07 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
EasyUI 数据表格datagrid列自适应内容宽度的实现
2019/07/18 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
运行Python编写的程序方法实例
2020/10/21 Python
Python 多进程原理及实现
2020/12/21 Python
致百米运动员广播稿
2014/01/29 职场文书
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
食堂标语大全
2014/06/11 职场文书
技术员岗位职责范本
2015/04/11 职场文书
java基础——多线程
2021/07/03 Java/Android