实现vuex与组件data之间的数据同步更新方式


Posted in Javascript onNovember 12, 2019

问题

我们都知道,在Vue组件中,data部分的数据与视图之间是可以同步更新的,假如我们更新了data中的数据,那么视图上的数据就会被同步更新,这就是Vue所谓的数据驱动视图思想。

当我们使用Vuex时,我们也可以通过在视图上通过 $store.state.[DataKey] 来获取Vuex中 state 的数据,且当 state 中的数据发生变化时,视图上的数据也是可以同步更新的,这似乎看起来很顺利。

但是当我们想要通过将 state 中的数据绑定到Vue组件的 data 上,然后再在视图上去调用 data ,如下:

<template>
 <div>{{userInfo}}</div> 
</template>

<script>
export default {
 data() {
 return {
  userInfo: this.$store.state.userInfo;
 };
 }
};
</script>

那么我们就会发现,当我们去改变 state 中的 userInfo 时,视图是不会更新的,相对应的 data 中的 userInfo 也不会被更改,因为这种调用方式是非常规的。

当Vue在组件加载完毕前,会将 data 中的所有数据初始化完毕,之后便只会被动改变数据。然而等组件数据初始化完毕之后,即使 state 中的数据发生了改变, data 中的数据与其并非存在绑定关系,data 仅仅在数据初始化阶段去调用了 state 中的数据,所以 data 中的数据并不会根据 state 中的数据发生改变而改变。

所以如果想在视图上实现与 state 中的数据保持同步更新的话,只能采用以下方式:

<template>
 <div>{{$store.state.userInfo}}</div> 
</template>

解决

那么如果我们必须想要在 data 上绑定 state 中的数据,让 state 去驱动 data 发生改变,那我们该如何做呢?

我们可以尝试以下两中方法:

1. 使用computed属性去获取state中的数据

这种方式其实并非是去调用了 data 中的数据,而是为组件添加了一个计算 computed 属性。computed 通常用于复杂数据的计算,它实际上是一个函数,在函数内部进行预算后,返回一个运算结果,同时它有一个重要的特性:当在它内部需要进行预算的数据发生改变后,它重新进行数据运算并返回结果。 所以,我们可以用 computed 去返回 state 中的数据,当 state 中的数据发生改变后,computed 会感知到,并重新获取 state 中的数据,并返回新的值。

<template>
 <div>{{userInfo}}</div> 
</template>

<script>
export default {
 computed: {
 userInfo(){
  return this.$store.state.userInfo;
 }
 }
};
</script>

2. 使用watch监听state中的数据

这种方式就很好理解了,就是通过组件的 watch 属性,为 state 中的某一项数据添加一个监听,当数据发生改变的时候触发监听事件,在监听事件内部中去更改 data 中对应的数据,即可变相的让 data 中的数据去根据 state 中的数据发生改变而改变。

<template>
 <div>{{userInfo}}</div> 
</template>

<script>
export default {
 data() {
 return {
  userInfo: this.$store.state.userInfo;
 };
 },
 watch: {
 "this.$store.state.userInfo"() {
  this.userInfo = this.$store.getters.getUserInfo; // 按照规范在这里应该去使用getters来获取数据
 }
 }
};
</script>

以上这篇实现vuex与组件data之间的数据同步更新方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 对象的定义方法
Jan 10 Javascript
javascript编程起步(第三课)
Feb 27 Javascript
javascript 内存回收机制理解
Jan 17 Javascript
自己写的Javascript计算时间差函数
Oct 28 Javascript
JS将制定内容复制到剪切板示例代码
Feb 11 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
Jan 06 Javascript
layui弹出层效果实现代码
May 19 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
Nov 03 Javascript
js数组方法reduce经典用法代码分享
Jan 07 Javascript
详解Nuxt.js部署及踩过的坑
Aug 07 Javascript
node.js的Express服务器基本使用教程
Jan 09 Javascript
vue使用原生swiper代码实例
Feb 05 Javascript
uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能
Nov 12 #Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
Nov 12 #Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
Nov 11 #Javascript
vuex实现数据状态持久化
Nov 11 #Javascript
vue 更改连接后台的api示例
Nov 11 #Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 #Javascript
vue在路由中验证token是否存在的简单实现
Nov 11 #Javascript
You might like
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
php两种无限分类方法实例
2015/04/21 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
jquery each()源代码
2011/02/14 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
动态内存分配导致影响Javascript性能的问题
2018/12/18 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
Python正则表达式介绍
2012/08/06 Python
python动态性强类型用法实例
2015/05/09 Python
深入解析Python中的上下文管理器
2016/06/28 Python
Python序列操作之进阶篇
2016/12/08 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
Python单向链表和双向链表原理与用法实例详解
2018/08/31 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
html5 标签
2009/07/16 HTML / CSS
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
JAVA和C++区别都有哪些
2015/03/30 面试题
大学学习个人的自我评价
2014/02/18 职场文书
cf战队收人广告词
2014/03/14 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书