实现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 相关文章推荐
cookie在javascript中的使用技巧以及隐私在服务器端的设置
Dec 03 Javascript
jQuery实现html元素拖拽
Jul 21 Javascript
简单实现JS对dom操作封装
Dec 02 Javascript
BootStrap3学习笔记(一)之网格系统
May 20 Javascript
简单了解JavaScript操作XPath的一些基本方法
Jun 03 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
Sep 20 Javascript
Form表单按回车自动提交表单的实现方法
Nov 18 Javascript
JS实现身份证输入框的输入效果
Aug 21 Javascript
JavaScrip关于创建常量的知识点
Dec 07 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
Feb 08 Javascript
JavaScript变量作用域及内存问题实例分析
Jun 10 Javascript
20多个小事例带你重温ES10新特性(小结)
Sep 29 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
基于PHP输出缓存(output_buffering)的深入理解
2013/06/13 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
vue按需加载实例详解
2019/09/06 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
python判断字符串是否纯数字的方法
2014/11/19 Python
python print输出延时,让其立刻输出的方法
2019/01/07 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
Python切图九宫格的实现方法
2019/10/10 Python
Python面向对象编程基础实例分析
2020/01/17 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
2014全国两会学习心得体会2000字
2014/03/10 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
开展读书活动总结
2014/06/30 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
学生检讨书如何写
2014/10/30 职场文书
运动会加油稿50字
2015/07/21 职场文书
2019广播稿怎么写
2019/04/17 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书
JavaScript分页组件使用方法详解
2021/07/26 Javascript