实现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 相关文章推荐
jquery 表单验证之通过 class验证表单不为空
Nov 02 Javascript
JQuery 设置checkbox值二次无效的解决方法
Jul 22 Javascript
JavaScript中子对象访问父对象的方式详解
Sep 01 Javascript
深入理解bootstrap框架之第二章整体架构
Oct 09 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
Apr 13 Javascript
Angular2使用Augury来调试Angular2程序
May 21 Javascript
微信小程序 监听手势滑动切换页面实例详解
Jun 15 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
Jul 11 Javascript
js模拟百度模糊搜索的实例
Aug 04 Javascript
vue组件与复用详解
Apr 08 Javascript
VUE 3D轮播图封装实现方法
Jul 03 Javascript
layui lay-verify form表单自定义验证规则详解
Sep 18 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 多维数组排序(usort,uasort)
2010/06/30 PHP
浅谈ThinkPHP的URL重写
2014/11/25 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
JavaScript对象的property属性详解
2014/04/01 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
JavaScript数组操作函数汇总
2016/08/05 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
原生js获取left值和top值的三种方法
2017/08/02 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
python cookielib 登录人人网的实现代码
2012/12/19 Python
Python中的jquery PyQuery库使用小结
2014/05/13 Python
python进行TCP端口扫描的实现
2018/12/21 Python
Python while循环使用else语句代码实例
2020/02/07 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
Python3开发环境搭建详细教程
2020/06/18 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
python 实现简易的记事本
2020/11/30 Python
为你的html5网页添加音效示例
2014/04/03 HTML / CSS
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
大二学生职业生涯规划书
2014/02/05 职场文书
怎样写好创业计划书的内容
2014/02/06 职场文书
工程建设实施方案
2014/03/14 职场文书
教师节促销方案
2014/03/22 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
竞选纪律委员演讲稿
2014/09/13 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python