实现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 中document.URL 和 windows.location.href 的区别
Nov 11 Javascript
原始XMLHttpRequest方法详情回顾
Nov 28 Javascript
js调试系列 断点与动态调试[基础篇]
Jun 18 Javascript
jQuery构造函数init参数分析续
May 13 Javascript
JavaScript中eval函数的问题
Jan 31 Javascript
JavaScript提高加载和执行效率的方法
Feb 03 Javascript
Vue.js实战之Vuex的入门教程
Apr 01 Javascript
Vue生命周期示例详解
Apr 12 Javascript
jQuery选择器特殊字符与属性空格问题
Aug 14 jQuery
在小程序中使用canvas的方法示例
Sep 17 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
Nov 01 jQuery
Vue文本模糊匹配功能如何实现
Jul 30 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
使用无限生命期Session的方法
2006/10/09 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
php读取本地json文件的实例
2018/03/07 PHP
javascript实现密码验证
2015/11/10 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
2017/03/25 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
关于引入vue.js 文件的知识点总结
2020/01/28 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
python实现图片变亮或者变暗的方法
2015/06/01 Python
python类中super()和__init__()的区别
2016/10/18 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
2020/02/09 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
python如何建立全零数组
2020/07/19 Python
python各种excel写入方式的速度对比
2020/11/10 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
英文自荐信
2013/12/15 职场文书
八年级美术教学反思
2014/02/02 职场文书
信息技术培训感言
2014/03/06 职场文书
技术总监管理职责范本
2014/03/06 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
用人单位聘用意向书
2015/05/11 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers
JS ES6异步解决方案
2021/04/29 Javascript
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python