实现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 相关文章推荐
[原创]保存的js无法执行的解决办法
Feb 25 Javascript
setInterval计时器不准的问题解决方法
May 08 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
Jun 03 Javascript
JS获取当前日期时间并定时刷新示例
Mar 04 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
Dec 08 Javascript
jQuery编写textarea输入字数限制代码
Mar 23 jQuery
获取当前按钮或者html的ID名称实例(推荐)
Jun 23 Javascript
JS canvas绘制五子棋的棋盘
May 28 Javascript
基于layui table返回的值的多级嵌套的解决方法
Sep 19 Javascript
JavaScript实现模态对话框实例
Jan 13 Javascript
jQuery 选择方法及$(this)用法实例分析
May 19 jQuery
JavaScript闭包原理与用法学习笔记
May 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中文字符串截取方法实例总结
2014/09/30 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
PHP中使用mpdf 导出PDF文件的实现方法
2018/10/22 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
Prototype使用指南之selector.js说明
2008/10/26 Javascript
jQuery技巧总结
2011/01/01 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
Python实现的购物车功能示例
2018/02/11 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
简历自我评价模版
2014/01/31 职场文书
总裁助理岗位职责
2014/02/17 职场文书
五一劳动节慰问信
2015/02/14 职场文书
小组组名及励志口号
2015/12/24 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL