系统总结vue组件间通信、数据传递(父子组件,同级组件)

总结一下对vue组件通信的理解和使用。

一、组件目录结构

  • 父组件:app.vue
  • 子组件:page1.vue
  • 子组件:page2.vue

父组件 app.vue

<template><div id="app"><p>请输入单价: <input type="text" v-model="price"></p><page1 :price="price" @downPrice="downPrice"></page1><page2></page2></div>
</template><script>
import Page1 from "./components/page1";
import Page2 from "./components/page2";
export default {name: "App",data() {return {price: ""};},components: {Page1,Page2},methods: {downPrice() {this.price = (this.price - 1).toString();}}
};
</script>

子组件 page1.vue

<template><div><p><span>单价:</span><span>{{price}}</span> <button @click="downPrice">降价1元</button></p><p>数量: {{count}} </p></div>
</template>
<script>
import bus from  '../eventBus.js'
export default {props:{price:{type:String,default:''}},data(){return{count:10}},methods:{downPrice(){this.$emit('downPrice')}},watch:{price(newPrice){bus.$emit('priceChange',newPrice,this.count) } }
}
</script>

子组件 page2.vue

<template><div><p><span>总金额:{{totalMoney}}元 </span>剩余金额:<span>{{balance}}元</span></p></div>
</template>
<script>
import bus from "../eventBus.js";
export default {data() {return {balance: 1000,totalMoney: 1000};},mounted() {bus.$on("priceChange", (price, count) => {this.balance = this.totalMoney - price * count;});}
};
</script>

 

二、通信过程介绍

 

1.父组件向子组件传值

1.1在父组件中引入需要通信的子组件

import Page1 from "./components/page1";

1.2 在父组件的components中注册该子组件

components: {Page1}

1.3 在父组件的template中使用子组件

<page1></page1>

1.4 将需要传递给子组件的值通过v-bind(如果传递的是固定值,则不需要v-bind,直接属性名,属性值传递即可)

<page1 :price="price"></page1>//  此处的price则是传递给子组件的值

1.5 在对应的子组件中,通过props属性接收传递过来的值

props:{price:{type:String,default:''}}

1.6 在子组件中使用该值

<p><span>单价:</span><span>{{price}}</span></p>

 

2.子组件向父组件中传值

2.1 在page1.vue中,通过触发子组件的方法(这里是自定义的downPrice方法),

 <p><span>单价:</span><span>{{price}}</span> <button @click="downPrice">降价1元</button></p>

2.2 在子组件的methodsdownPrice中,通过this.$emit(),将事件和参数传递给父组件

downPrice(count){this.$emit('downPrice',count)}// downPrice 是传递给父组件的事件,父组件触发并相应这个方法
// count 传递给父组件的参数,在父组件中,可以对和这个参数进行相应操作

2.3 在父组件中接受子组件传递的事件downPrice和数据

<page1 :price="price" @downPrice="downPrice"></page1>

2.4 父组件对接收到的事件和数据做出响应

downPrice(count) {this.price = (this.price - 1).toString();// this.price = (this.price - count).toString();}

 

3、父组件调用子组件方法

方法一:

3.1 在使用子组件时,给子组件加一个ref引用

<page1 :price="price" @downPrice="downPrice" ref="page1"></page1>

3.2 父组件通过this.$refs即可找到该子组件,也可以操作子组件的方法

this.$refs.page1.子组件方法

打印出获取到的子组件信息:

clipboard.png

方法二:

3.3 通过$children,可以获取到所有子组件的集合

this.$children[0].某个方法

 

4、子组件调用父组件方法

4.1 通过 $parent可以找到父组件,进而调用其方法

this.$parent.父组件方法

打印出的父组件信息
clipboard.png

 

5、平级组件通信

同级组件不能直接传值,需要一个中间桥梁,可以先将数据传递给公共的父组件,然后父组件再将数据传递给需要的子组件。

5.1 定义一个公共文件 eventBus.js

代码很简单(就2句),只是创建一个空的vue实例

import Vue from 'vue'
export default new Vue()

5.2 在需要通信的同级组件中分别引入eventBus.js文件

import bus from '../eventBus.js'

5.3 在page1.vue中,通过$emit将事件和参数传递给page2.vue

price(newPrice){bus.$emit('priceChange',newPrice,this.count) 
} 

5.4 在page2.vue 中,通过$on接收接收参数和相应事件

bus.$on("priceChange", (price, count) => {this.balance = this.totalMoney - price * count;});
参考文章:https://segmentfault.com/a/1190000011882494
一般大型的项目,推荐使用Vuex来管理组件之间的通信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1224. 最大相等频率(哈希)

文章目录1. 题目2. 解题1. 题目 给出一个正整数数组 nums&#xff0c;请你帮忙从该数组中找出能满足下面要求的 最长 前缀&#xff0c;并返回其长度&#xff1a; 从前缀中 删除一个 元素后&#xff0c;使得所剩下的每个数字的出现次数相同。 如果删除这个元素后没有剩余元素…

从零开始,手把手交给你vue如何新建一个项目

vue创建项目&#xff08;npm安装→初始化项目&#xff09; 第一步npm安装 首先&#xff1a;先从nodejs.org中下载nodejs 图1 双击安装&#xff0c;在安装界面一直Next 图2 图3 图4 直到Finish完成安装。 打开控制命令行程序&#xff08;CMD&#xff09;,检查是否正常 图5 …

数学图形(1.33) 棕子曲线

#http://www.mathcurve.com/courbes2d/vasques/vasques.shtml vertices 10000 t from 0 to (8*PI) a rand_int2(1, 30) b rand_int2(1, 4) n 8 x cos(n*t - t)*cos(n*t) y cos(n*t)^2 a 10 x x*a y y*a 相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生…

LeetCode 1278. 分割回文串 III(区间DP)

文章目录1. 题目2. 解题1. 题目 给你一个由小写字母组成的字符串 s&#xff0c;和一个整数 k。 请你按下面的要求分割字符串&#xff1a; 首先&#xff0c;你可以将 s 中的部分字符修改为其他的小写英文字母。接着&#xff0c;你需要把 s 分割成 k 个非空且不相交的子串&…

原生态HTML文件上传与下载

文件下载 传统的文件下载有两种方法&#xff1a; 使用<a/>标签&#xff0c;href属性直接连接到服务器的文件路径window.location.href"url" 这两种方法效果一样。但有个很大的问题&#xff0c;如果下载出现异常&#xff08;连接路径失效、文件不存在、网络问…

Jquery 常用总结

获取元素的宽度: 如果用$(ele).attr("width")获取的值不带px 如果用$(ele).css("width")获取的值带px //获取鼠标坐标 $(function() { $("#Button2").click(function(event) { alert(event.p…

LeetCode 1187. 使数组严格递增(DP)*

文章目录1. 题目2. 解题1. 题目 给你两个整数数组 arr1 和 arr2&#xff0c;返回使 arr1 严格递增所需要的最小「操作」数&#xff08;可能为 0&#xff09;。 每一步「操作」中&#xff0c;你可以分别从 arr1 和 arr2 中各选出一个索引&#xff0c;分别为 i 和 j&#xff0c…

用Python进行屏幕截图,只用两行代码搞定

一、计算机中如何进行屏幕截图呢&#xff1f; 1、全屏截图 按下键盘中的‘PRTSC’或者‘Print Screen’键&#xff0c;即可实现全屏截图&#xff08;不同键盘位置和名称可能不同&#xff09;。此时&#xff0c;并不能看到效果&#xff0c;只是将截图保存在粘贴板中&#xff0…

POJ 2075 Tangled in Cables (c++/java)

http://poj.org/problem?id2075 题目大意&#xff1a; 给你一些人名&#xff0c;然后给你n条连接这些人名所拥有的房子的路&#xff0c;求用最小的代价求连接这些房子的花费是否满足要求。 思路&#xff1a; 昨天20分钟的题&#xff0c;输入不小心写错了- -|||||看世界杯半场休…

利用nginx建立windows软连,实现IP访问文件

一、运行nginx 1、首先下载nginx&#xff0c;下载地址&#xff1a;https://www.lanzous.com/ianm7tg 2、解压文件如图&#xff1a; 3、运行nginx.exe&#xff0c;浏览器运行电脑ip地址&#xff0c;如图&#xff1a; 二、cmd管理员权限 运行中输入“cmd”&#xff0c;按住shi…

LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)

文章目录1. 题目2. 解题2.1 超时解2.2 BFS DFS1. 题目 「推箱子」是一款风靡全球的益智小游戏&#xff0c;玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 n * m 的网格 grid 表示&#xff0c;其中每个元素可以是墙、地板或者是箱子。 现在你将作为玩家参与游戏&a…

深入浅出Java回调机制

前几天看了一下Spring的部分源码&#xff0c;发现回调机制被大量使用&#xff0c;觉得有必要把Java回调机制的理解归纳总结一下&#xff0c;以方便在研究类似于Spring源码这样的代码时能更加得心应手。 注&#xff1a;本文不想扯很多拗口的话来充场面&#xff0c;我的目的是希望…

前端:实现div等块元素添加X轴滚动显示(Y轴不滚动)

一、建立外盒子与内盒子 原生态代码&#xff1a; <div class"tol_dev"><div class"dev_li"></div><div class"dev_li"></div><div class"dev_li"></div><div class"dev_li"…

2020年学习总结

文章目录1. CSDN 博客数据2. 基础算法练习3. 机器学习4. 深度学习5. MySQL6. 总结和展望时间过得很快&#xff0c;2020结束了&#xff01; 写个流水账&#xff0c;记录一下。 1. CSDN 博客数据 截个图对比下&#xff1a; 2019年终2020年终 2. 基础算法练习 LeetCode 刷题 …

npm全局环境变量配置及解决VsCode使用时遇到的问题

一、npm全局环境变量配置 1、我们要先配置npm的全局模块的存放路径以及cache的路径 例如我希望将以上两个文件夹放在NodeJS的主目录下&#xff0c;便在NodeJs下建立”node_global”及”node_cache”两个文件夹。如下图 2、cmd 中输入如下命令 npm config set prefix “d:\no…

Android菜鸟如何学习Android系统开发?

如何做好Android学习前的准备? 如果你已经确定了学习Android的目标&#xff0c;那么&#xff0c;应该提前做好哪些工作、先打下哪些基础呢? 首先&#xff0c;你最好先熟悉一门编程语言&#xff0c;现在大学里面和计算机相关的专业甚至理工类专业一般都会开设C语言课程&#x…

关于Django中JsonResponse返回中文字典编码错误的解决方案

遇到这样一个问题&#xff0c;返回的json不是中文 def get_json(request):return JsonResponse({"res": "成功"}) 结果&#xff1a; {"res": "\u6210\u529f"} 解决方案&#xff1a;JsonResponse(data, json_dumps_params{ensure_a…

LeetCode 668. 乘法表中第k小的数(二分查找)

文章目录1. 题目2. 解题1. 题目 几乎每一个人都用 乘法表。但是你能在乘法表中快速找到第k小的数字吗&#xff1f; 给定高度m 、宽度n 的一张 m * n的乘法表&#xff0c;以及正整数k&#xff0c;你需要返回表中第k 小的数字。 例 1&#xff1a; 输入: m 3, n 3, k 5 输出…

获取类类型

//获得类类型的两种方式 1、 Class cls1 Role.class; 2、 Class cls2 Class.forName("yui.Role"); 注意第二种方式中&#xff0c;forName中的参数一定是完整的类名&#xff08;包名类名&#xff09;&#xff0c;并且这个方法需要捕获异常。 现在得到cl…

VUE:解决判断网页端与手机端情况下,横竖屏无法判断的问题

一、需求&#xff1a; 第一步&#xff1a;判断是网页端还是手机端 第二步&#xff1a;判断手机端&#xff0c;手机是横屏显示还是竖屏显示 二、解决方法&#xff1a; 监听网页端还是手机端 监听显示页面宽高变化 三、代码如下&#xff1a; methods: {_isMobile() {let f…