实现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 处理HTML元素必须避免使用的一种方法
Jul 30 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
Apr 01 Javascript
Jquery getJSON方法详细分析
Dec 26 Javascript
javascript 原型链维护和继承详解
Nov 26 Javascript
理解js对象继承的N种模式
Jan 25 Javascript
Js获取当前日期时间及格式化代码
Sep 17 Javascript
AngularJS 防止页面闪烁的方法
Mar 09 Javascript
iframe高度自适应及隐藏滚动条的实例详解
Sep 29 Javascript
mui back 返回刷新页面的实例
Dec 06 Javascript
angular4中引入echarts的方法示例
Jan 29 Javascript
9102年webpack4搭建vue项目的方法步骤
Feb 20 Javascript
JavaScript如何操作css
Oct 24 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中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
php_pdo 预处理语句详解
2016/11/21 PHP
javascript倒计时功能实现代码
2012/06/07 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
Javascript 获取鼠标当前的位置实现方法
2016/10/27 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
Node.js搭建小程序后台服务
2018/01/03 Javascript
Nuxt升级2.0.0时出现的问题(小结)
2018/10/08 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
详解javascript void(0)
2020/07/13 Javascript
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
python 字符串和整数的转换方法
2018/06/25 Python
对python判断是否回文数的实例详解
2019/02/08 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
python求前n个阶乘的和实例
2020/04/02 Python
Python爬虫爬取糗事百科段子实例分享
2020/07/31 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
3个CCIE对一个工程师的面试题
2012/05/06 面试题
C# Debug和Testing相关面试题
2015/10/25 面试题
小学捐书活动总结
2014/07/05 职场文书
课内比教学心得体会
2014/09/09 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
2016年寒假生活小结
2015/10/10 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python