实现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 相关文章推荐
form中限制文本字节数js代码
Jun 10 Javascript
JS获取当前日期和时间的简单实例
Nov 19 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
Dec 10 Javascript
javascript检查浏览器是否已经启用XX功能
Jul 10 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
Aug 05 Javascript
基于JavaScript如何制作遮罩层对话框
Jan 26 Javascript
如何防止INPUT按回车自动提交表单FORM
Dec 06 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
May 09 Javascript
详解服务端预渲染之Nuxt(介绍篇)
Apr 07 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
Jun 24 Javascript
vue中的v-if和v-show的区别详解
Sep 01 Javascript
layui 阻止图片上传的实例(before方法)
Sep 26 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中substr()函数参数说明及用法实例
2014/11/15 PHP
PHP实现文件下载详解
2014/11/27 PHP
最短的IE判断代码
2011/03/13 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
JavaScript用Number方法实现string转int
2014/05/13 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
详解Vue 方法与事件处理器
2017/06/20 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
python 输出上个月的月末日期实例
2018/04/11 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
住宅使用说明书
2014/05/09 职场文书
关爱留守儿童标语
2014/06/18 职场文书
借名购房协议书范本
2014/10/06 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
趣味运动会加油词
2015/07/18 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
php微信小程序解包过程实例详解
2021/03/31 PHP
如何正确理解python装饰器
2021/06/15 Python
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python