实现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 相关文章推荐
关于viewport,Ext.panel和Ext.form.panel的关系
May 07 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
Jul 31 Javascript
formvalidator验证插件中有关ajax验证问题
Jan 04 Javascript
js遍历、动态的添加数据的小例子
Jun 22 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
Mar 13 Javascript
限制只能输入数字的实现代码
May 16 Javascript
浅析Javascript ES6新增值比较函数Object.is
Aug 24 Javascript
JS跨域请求外部服务器的资源
Feb 06 Javascript
通过 JS 判断页面是否有滚动条的实现方法
Apr 05 Javascript
微信小程序canvas实现刮刮乐效果
Jul 09 Javascript
JavaScript 截取字符串代码实例
Sep 05 Javascript
深入理解javascript中的this
Feb 08 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
MySQL授权问题总结
2007/05/06 PHP
php+javascript的日历控件
2009/11/19 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
JSQL SQLProxy 的 php 版本代码
2010/05/05 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
webstorm+vue初始化项目的方法
2018/10/18 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
Python的SQLAlchemy框架使用入门
2015/04/29 Python
python找出完数的方法
2018/11/12 Python
Python语言快速上手学习方法
2018/12/14 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
2021/01/27 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
担保书范文
2015/01/20 职场文书
2015年教学工作总结
2015/04/02 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android