Vue.js中使用Vuex实现组件数据共享案例


Posted in Javascript onJuly 31, 2020

当组件中没有关联关系时,需要实现数据的传递共享,可以使用Vuex

Vue.js中使用Vuex实现组件数据共享案例

先不管图片

一、安装

在vue cli3中创建项目时勾选这个组件就可以了 或者手动安装

npm install store --save

二、使用

main.js

Vue.js中使用Vuex实现组件数据共享案例

store.js

Vue.js中使用Vuex实现组件数据共享案例

.vue文件

Vue.js中使用Vuex实现组件数据共享案例

图片中的js文件中有 三部分 分别与图片上对应

1. state中存储数据

2. 而数据的修改需要先经过action的dispatch方法 (不需要异步获取的数据可以不经过这一步,如上图)

3. 然后经过matations的commit方法

将展示在页面上

{{ this.$store.state.city }}

还可以将数据保存到本地,使用

localStorage.city = city

补充知识:从vue文件中抽取出子组件的流程及过程中踩过的坑

流程:

1. 确保注册、引入子组件的正确性:

创建一个新的vue文件,包含基本的template,及export的内容,其中可简单包含空的data函数。暂时先不把子组件中的代码移出。在父组件中import进该子组件的.vue文件,要注意的是路径名要正确,“../”表示的是当前文件所在目录的上层目录,“./”表示的是当前文件夹下。所以,如果子组件和父组件在同一个目录下,只需在父组件中加上:

import ChildComponent from './ChildComponent.vue‘;

引入子组件后,需要在父组件中注册子组件,主需要在父组件的components属性中注册该子组件:

components: {
'child-component': ChildComponent
}

这样就注册成功了,不需要调用new ChildComponent()

2.移出组件相关的template,及method,定义好父组件及子组件的接口:props{},props在子组件中定义,父组件中传入。父组件中若需传入动态值,则在父组件中可以用v-bind绑定传入的值。

踩过的坑(比较细碎):

1.属性的绑定问题:

:property="variable"与property="variable"的区别:如果使用v-bind:property则默认后面的值是一个变量,在编译器解析到这句话时,解析器会去data中寻找该变量,而若使用第二种定义的属性的方法,则解析器会默认后面的值为一个字符串。意味着:如果传入一个布尔值,则第一种方法会传入布尔值,第二种只是简单的传入字符串。

2.父组件与子组件的通信接口——props:

定义的props中的各属性需尽量是地位平等的一系列属性,尽量不要将所有属性放入一个对象中传入。因为后者从父组件传入子组件的对象,只要对象中少传了一个值就会报错,而且当传入的是个对象时,维护的成本也会变大,整个代码的复杂度也会增加。可是这次项目中由于这些参数确实都是作为一个整体的,所以就封装成了一个对象进行绑定了,变成对象,坑就多啦。子组件中的props需要定义对象中各属性的类型。

3.子组件向父组件传递数据——$emit:

当子组件中的值发生了改变,或触发了某个事件时,我们需要手动$emit,将变化告知父组件。语法是vm.$emit(event, [args])。然后在父组件中监听该event,然后当监听到该event时,触发父组件中定义的某个方法。在template中绑定这个事件监听时,我们并不需要显示的写出传入的参数的形参,因为在template中直接写出形参,解析器会以为这是已经定义好的变量,会去data中寻找。若寻找不到则会报错。所以,在template中我们只要写:@event = "anotherEvent",然后在methods中定义anotherEvent方法时,写上形参。一定要分清形参和实参!!!

4. 父组件与子组件定义的props需双向绑定的问题(父、子组件的双向绑定并不是必需的,只是本项目中有次需求):

若需要双向绑定,需在data中也定义需双向绑定的值,然后将props中的值赋值给data中的对应值。然后在template中通过v-model绑定该data值。为什么不在v-model中直接绑定props中的值呢?因为props最好是单项数据流。然后当我们需同时监听data中的对象和props中的对象,可能会导致死循环。因为,我们前提是data中的对象是由props赋给的。所以props值的变化,会导致data的变化,data的变化,又会导致props的变化。

此外,要注意的是,当我们监听的是对象时,直接用watch,是浅层的监听,因为对象本质是只是一个指向内存某个地址的指针,只要地址不变,就不会触发更新,那我们希望对象中的内容变化了,也触发更新,则我们需使用以下方式:

watch: {
propA: {
handler: function(){},
deep: true

}
}

(props的双向绑定会使得逻辑很复杂,其实也可以使用.sync修饰符,但是该修饰符在Vue 2.0版本中被移除了,但在2.3.0+中又被重新引入了。所以,要使用.sync要先看看package.json中配置的版本)

以上这篇Vue.js中使用Vuex实现组件数据共享案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery实现多级下拉菜单的实例代码
Oct 02 Javascript
node.js中的console.assert方法使用说明
Dec 10 Javascript
Javascript基础教程之关键字和保留字汇总
Jan 18 Javascript
javascript中apply、call和bind的使用区别
Apr 05 Javascript
js将滚动条滚动到指定位置的简单实现方法
Jun 25 Javascript
深入浅出ES6之let和const命令
Aug 25 Javascript
jQuery+正则+文本框只能输入数字的实现方法
Oct 07 Javascript
Bootstrap面板学习使用
Feb 09 Javascript
小程序图片剪裁加旋转的示例代码
Jul 10 Javascript
微信小程序实现的动态设置导航栏标题功能示例
Jan 31 Javascript
VUE 解决mode为history页面为空白的问题
Nov 01 Javascript
vue实现下拉菜单树
Oct 22 Javascript
原生JS实现记忆翻牌游戏
Jul 31 #Javascript
js实现跳一跳小游戏
Jul 31 #Javascript
js实现翻牌小游戏
Jul 31 #Javascript
Vue 请求传公共参数的操作
Jul 31 #Javascript
vue2.0 解决抽取公用js的问题
Jul 31 #Javascript
vue实现公共方法抽离
Jul 31 #Javascript
js实现无缝轮播图插件封装
Jul 31 #Javascript
You might like
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
js 链式延迟执行DOME
2012/01/04 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
JavaScript常用脚本汇总(三)
2015/03/04 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
2019/08/09 Javascript
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
基于Python在MacOS上安装robotframework-ride
2018/12/28 Python
python tkinter窗口最大化的实现
2019/07/15 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
体育专业个人的求职信范文
2013/09/21 职场文书
科室工作的个人自我评价
2013/10/30 职场文书
初中政治教学反思
2014/01/17 职场文书
婚内房产协议书范本
2014/10/02 职场文书
党校毕业个人总结
2015/02/28 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技