实现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 相关文章推荐
JScript 脚本实现文件下载 一般用于下载木马
Oct 29 Javascript
javascript window.opener的用法分析
Apr 07 Javascript
用Javascript实现Windows任务管理器的代码
Mar 27 Javascript
jquery处理页面弹出层查询数据等待操作实例
Mar 25 Javascript
javascript点击按钮实现隐藏显示切换效果
Feb 03 Javascript
ES6学习笔记之Set和Map数据结构详解
Apr 07 Javascript
ES5 ES6中Array对象去除重复项的方法总结
Apr 27 Javascript
vue、react等单页面项目应该这样子部署到服务器
Jan 03 Javascript
使用express+multer实现node中的图片上传功能
Feb 02 Javascript
JS简单添加元素新节点的方法示例
Feb 10 Javascript
微信小程序实现无限滚动列表
May 29 Javascript
Vue切换div显示隐藏,多选,单选代码解析
Jul 14 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 图片水印类代码
2012/08/27 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
2019/10/16 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
js编码、解码函数介绍及其使用示例
2013/09/05 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
python的socket编程入门
2018/01/29 Python
Django uwsgi Nginx 的生产环境部署详解
2019/02/02 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
初中生期末考试的自我评价
2013/12/17 职场文书
会计职业生涯规划书
2014/01/13 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
小学作文评语大全
2014/04/21 职场文书
团拜会策划方案
2014/06/07 职场文书
群众路线党员个人整改措施
2014/10/27 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
主婚人致辞精选
2015/07/28 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
python实战之用emoji表情生成文字
2021/05/08 Python
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js