实现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 相关文章推荐
use jscript Create a SQL Server database
Jun 16 Javascript
jqgrid 表格数据导出实例
Nov 21 Javascript
JS实现的一个简单的Autocomplete自动完成例子
Apr 16 Javascript
jquery实现上下左右滑动的方法
Feb 09 Javascript
一览画面点击复选框后获取多个id值的方法
May 30 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
Jul 18 Javascript
JS获取鼠标选中的文字
Aug 10 Javascript
JavaScript实现单英文金山打字通
Jul 24 Javascript
jquery轻量级数字动画插件countUp.js使用详解
Oct 17 jQuery
Vue proxyTable配置多个接口地址,解决跨域的问题
Sep 11 Javascript
原生JS实现相邻月份日历
Oct 13 Javascript
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
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
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
玩转虚拟域名◎+ .
2006/10/09 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
JavaScript语言中的Literal Syntax特性分析
2007/03/08 Javascript
JS 分号引起的一段调试问题
2009/06/18 Javascript
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
vue-axios使用详解
2017/05/10 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
vue如何截取字符串
2019/05/06 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
python实现BackPropagation算法
2017/12/14 Python
通过Pandas读取大文件的实例
2018/06/07 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
澳大利亚制造的蜡烛和扩散器:Glasshouse Fragrances
2018/05/20 全球购物
数据库面试要点基本概念
2013/10/31 面试题
银行实习生自我鉴定范文
2013/09/19 职场文书
大学生活学习的自我评价
2013/12/03 职场文书
农村面貌改造提升实施方案
2014/03/18 职场文书
任命书模板
2014/06/04 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python