实现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 强制设为首页的代码
Jan 31 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
Feb 11 Javascript
Jquery 实现table样式的设定
Jan 28 Javascript
jquery中validate与form插件提交的方式小结
Mar 26 Javascript
AngularJs实现聊天列表实时刷新功能
Jun 15 Javascript
vue的状态管理模式vuex
Nov 30 Javascript
解决Vue不能检测数组或对象变动的问题
Feb 24 Javascript
详解angularjs跨页面传参遇到的一些问题
Nov 01 Javascript
nvm、nrm、npm 安装和使用详解(小结)
Jan 17 Javascript
一些手写JavaScript常用的函数汇总
Apr 16 Javascript
javascript移动端 电子书 翻页效果实现代码
Sep 07 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
Oct 12 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修改数组键名的方法示例
2017/04/15 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
vue自动化路由的实现代码
2019/09/30 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
[03:48]2014DOTA2 TI专访71DK夺冠不靠小组赛高排名
2014/07/11 DOTA
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
适合Python初学者的一些编程技巧
2020/02/12 Python
django 读取图片到页面实例
2020/03/27 Python
如何用 Python 制作 GitHub 消息助手
2021/02/20 Python
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
机电一体化应届生求职信范文
2014/01/24 职场文书
大学开学计划书
2014/04/30 职场文书
经销商年会策划方案
2014/05/29 职场文书
研究生求职自荐书
2014/06/23 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
小学班主任研修日志
2015/11/13 职场文书
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python
MySQL普通表如何转换成分区表
2022/05/30 MySQL