这是一篇详细讲解vue父子组件之间通信的文章,初始学习vue的时候,总是搞不清楚几个情况

  • 通过props在父子组件传值时,v-bind:data="data",props接收的到底是哪个?
  • this.$emit提交的事件名称,v-on:handleChange="handleChange",和父组件监听时候创建的方法名是否一样?到底哪个才是v-on应该监听的事件名称?

你是否也有这样的疑惑呢?如果你跟我有一样的疑惑,那么继续往下看吧~~

1.创建一个父组件 Parent.vue,在data中添加一个parentAge

  1. <template>
  2. <div class="my-parent">
  3. <h3>我是父组件</h3>
  4. <p>父组件的年龄是:{parentAge}}</p>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. parentAge:
  13. };
  14. }
  15. };
  16. </script>
  17.  
  18. <style>
  19. .my-parent {
  20. text-align: left;
  21. text-indent: 1em;
  22. width: 1000px;
  23. height: 500px;
  24. border: 1px solid #;
  25. }
  26. </style>

2.创建子组件,在data中添加一个childAge

  1. <template>
  2. <div class="my-child">
  3. <h3>我是子组件</h3>
  4. <p>子组件的年龄是:{{childAge}}</p>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. childAge:
  13. };
  14. }
  15. };
  16. </script>
  17.  
  18. <style>
  19. .my-child {
  20. margin: 20px;
  21. width: 760px;
  22. height: 200px;
  23. border: 1px solid red;
  24. }
  25. </style>

3.把父子组件关联起来,并通过v-bind(即简写“:”)将父组件中的parentAge值,传递给子组件

  1. v-on绑定的属性名称deliverParentAgedata中定义的parentAge名称可以不一样
  1. 属性deliverParentAge通过v-bind绑定的,也是子组件中通过props接收的,而parentAge是要传递给子组件的数值,它是一个值
  1.  
  1. <template>
  2. <div class="my-parent">
  3. <h3>我是父组件,我想告诉我的子组件,我的年龄值是:{{parentAge}}</h3>
  4. <h3>我要通过v-bind(即简写":")语法糖绑定一个属性deliverParentAge,将父组件的值传递到子组件中</h3>
  5. <!-- 下面就是我的子组件 -->
  6. <my-child :deliverParentAge="parentAge"></my-child>
  7.  
  8. </div>
  9. </template>
  10.  
  11. <script>
  12. import MyChild from "./Child";
  13. export default {
  14. components: { MyChild },
  15. data() {
  16. return {
  17. parentAge:
  18. };
  19. }
  20. };
  21. </script>

4.子组件通过props属性,在子组件中接收父组件传过来的值

  1. <template>
  2. <div class="my-child">
  3. <h5>我是子组件,我可以通过属性props来接收父组件传过来的年龄值是:{{deliverParentAge}}</h5>
  4. </div>
  5. </template>
  6.  
  7. <script>
  8. export default {
  9. data() {
  10. return {
  11. childAge:
  12. };
  13. },
  14. props: {
  15. deliverParentAge: Number
  16. }
  17. };
  18. </script>

5.现在来修改父组件的值(这个不是真的修改而是通过this.$emit提交一个事件,将子组件的行为告诉父组件)

  1. <template>
  2. <div class="my-child">
  3. <h5>我是子组件,我可以通过属性props来接收父组件传过来的年龄值是:{{deliverParentAge}},这是一个数字类型</h5>
  4. <h5>并且,我要告诉他,他今年生日已经过了,所以他的年龄应该<button @click="AddAge">加1</button></h5>
  5. 下面我要通过this.$emit方法提交一个事件addParentAge,告诉我的父组件,他的实际年龄
  6. </div>
  7. </template>
  8.  
  9. <script>
  10. export default {
  11. data() {
  12. return {
  13. childAge:
  14. };
  15. },
  16. props: {
  17. deliverParentAge: Number
  18. },
  19. // 新建一个计算属性,将父组件原来的值加1
  20. computed: {
  21. parentActualAge() {
  22. return this.deliverParentAge + ;
  23. }
  24. },
  25. methods: {
  26. AddAge() {
  27. this.$emit("addParentAge", this.parentActualAge);
  28. }
  29. }
  30. };
  31. </script>

6.父组件通过语法糖v-on(即简写为“@”)来监听子组件提交的事件addParentAge

  1. this.$emit提交的事件名称addParentAge,与方法handleAddParentAge名称可以不一样
  1. addParentAge是子组件提交的事件名称,也是父组件通过v-on监听的事件名称,而handleAddParentAge是父组件自定义的方法名称
  1.  
  1. <template>
  2. <div class="my-parent">
  3. <h3>我是父组件,我想告诉我的子组件,我的年龄值是:{{parentAge}}</h3>
  4. <h3>我要通过v-bind(即简写":")语法糖绑定一个属性parentAge,告诉子组件我的年龄值是:{{parentAge}}</h3>
  5. <!-- 下面就是我的子组件 -->
  6. <my-child :deliverParentAge="parentAge"
  7. @addParentAge="handleAddParentAge"></my-child>
  8. <h3>通过监听子组件提交的事件addParentAge,我知道到了自己的实际年龄应该是:{{parentAge+}},并通过方法handleAddParentAge,在控制台打印出我的真实年龄</h3>
  9.  
  10. </div>
  11. </template>
  12.  
  13. <script>
  14. import MyChild from "./Child";
  15. export default {
  16. components: { MyChild },
  17. data() {
  18. return {
  19. parentAge:
  20. };
  21. },
  22. methods: {
  23. handleAddParentAge(actualAge) {
  24. console.log("父组件的实际年龄是:", actualAge);
  25. }
  26. }
  27. };
  28. </script>

现在来看控制台打印出来的内容

7.现在将子组件data中的值,提交给父组件来看看

  1. <template>
  2. <div class="my-child">
  3. <h5>我是子组件,我可以通过属性props来接收父组件传过来的年龄值是:{{deliverParentAge}},这是一个数字类型</h5>
  4. <h5>现在我要告诉父组件,我的年龄是{{childAge}},这样他就可以知道,我们<button @click="DiffAge">相差</button>多少岁</h5>
  5. <h5>并且,我要告诉他,他今年生日已经过了,所以他的年龄应该<button @click="AddAge">加1</button></h5>
  6. 下面我要通过this.$emit方法提交一个事件addParentAge,告诉我的父组件,他的实际年龄
  7. </div>
  8. </template>
  9.  
  10. <script>
  11. export default {
  12. data() {
  13. return {
  14. childAge:
  15. };
  16. },
  17. props: {
  18. deliverParentAge: Number
  19. },
  20. computed: {
  21. parentActualAge() {
  22. return this.deliverParentAge + ;
  23. }
  24. },
  25. methods: {
  26. AddAge() {
  27. this.$emit("addParentAge", this.parentActualAge);
  28. },
  29. DiffAge() {
  30. this.$emit("differAge", this.childAge);
  31. }
  32. }
  33. };
  34. </script>

8.父组件通过v-on监听子组件提交的事件differAge

  1. <template>
  2. <div class="my-parent">
  3. <h3>我是父组件,我想告诉我的子组件,我的年龄值是:{{parentAge}}</h3>
  4. <h3>我要通过v-bind(即简写":")语法糖绑定一个属性parentAge,告诉子组件我的年龄值是:{{parentAge}}</h3>
  5. <!-- 下面就是我的子组件 -->
  6. <my-child :deliverParentAge="parentAge"
  7. @differAge="handleDifferAge"
  8. @addParentAge="handleAddParentAge"></my-child>
  9. <h3>通过监听子组件提交的事件addParentAge,我知道到了自己的实际年龄应该是:{{parentAge+}},并通过方法handleAddParentAge,在控制台打印出我的真实年龄</h3>
  10. <h3>通过监听子组件提交的事件differAge,并通过方法handleDifferAge,在控制台打印出子组件的年龄</h3>
  11.  
  12. </div>
  13. </template>
  14.  
  15. <script>
  16. import MyChild from "./Child";
  17. export default {
  18. components: { MyChild },
  19. data() {
  20. return {
  21. parentAge:
  22. };
  23. },
  24. methods: {
  25. handleAddParentAge(actualAge) {
  26. console.log("父组件的实际年龄是:", actualAge);
  27. },
  28. handleDifferAge(child) {
  29. console.log("我们的年龄差是:", this.parentAge + - child);
  30. }
  31. }
  32. };
  33. </script>

现在来看看页面展示的效果和控制台打印出来的信息

下面贴上完整的代码

  1. // Parent.vue
  2. <template>
  3. <div class="my-parent">
  4. <h3>我是父组件,我想告诉我的子组件,我的年龄值是:{{parentAge}}</h3>
  5. <h3>我要通过v-bind(即简写":")语法糖绑定一个属性parentAge,告诉子组件我的年龄值是:{{parentAge}}</h3>
  6. <!-- 下面就是我的子组件 -->
  7. <my-child :deliverParentAge="parentAge"
  8. @differAge="handleDifferAge"
  9. @addParentAge="handleAddParentAge"></my-child>
  10. <h3>通过监听子组件提交的事件addParentAge,我知道到了自己的实际年龄应该是:{{parentAge+}},并通过方法handleAddParentAge,在控制台打印出我的真实年龄</h3>
  11. <h3>通过监听子组件提交的事件differAge,并通过方法handleDifferAge,在控制台打印出子组件的年龄</h3>
  12.  
  13. </div>
  14. </template>
  15.  
  16. <script>
  17. import MyChild from "./Child";
  18. export default {
  19. components: { MyChild },
  20. data() {
  21. return {
  22. parentAge:
  23. };
  24. },
  25. methods: {
  26. handleAddParentAge(actualAge) {
  27. console.log("父组件的实际年龄是:", actualAge);
  28. },
  29. handleDifferAge(child) {
  30. console.log("我们的年龄差是:", this.parentAge + - child);
  31. }
  32. }
  33. };
  34. </script>
  35.  
  36. <style lang="stylus" scoped>
  37. .my-parent {
  38. text-align: left;
  39. text-indent: 1em;
  40. width: 1000px;
  41. height: 500px;
  42. border: 1px solid #;
  43. }
  44. </style>
  1. // Child.vue
  2. <template>
  3. <div class="my-child">
  4. <h5>我是子组件,我可以通过属性props来接收父组件传过来的年龄值是:{{deliverParentAge}},这是一个数字类型</h5>
  5. <h5>现在我要告诉父组件,我的年龄是{{childAge}},这样他就可以知道,我们<button @click="DiffAge">相差</button>多少岁</h5>
  6. <h5>并且,我要告诉他,他今年生日已经过了,所以他的年龄应该<button @click="AddAge">加1</button></h5>
  7. 下面我要通过this.$emit方法提交一个事件addParentAge,告诉我的父组件,他的实际年龄
  8. </div>
  9. </template>
  10.  
  11. <script>
  12. export default {
  13. data() {
  14. return {
  15. childAge: 27
  16. };
  17. },
  18. props: {
  19. deliverParentAge: Number
  20. },
  21. computed: {
  22. parentActualAge() {
  23. return this.deliverParentAge + 1;
  24. }
  25. },
  26. methods: {
  27. AddAge() {
  28. this.$emit("addParentAge", this.parentActualAge);
  29. },
  30. DiffAge() {
  31. this.$emit("differAge", this.childAge);
  32. }
  33. }
  34. };
  35. </script>
  36.  
  37. <style>
  38. .my-child {
  39. margin: 20px;
  40. width: 760px;
  41. height: 200px;
  42. border: 1px solid red;
  43. }
  44. </style>

希望对你有用,欢迎提问与指正,一起学习前端呀!

vue 父子组件通信详解的更多相关文章

  1. Vue父子组件通信(父级向子级传递数据、子级向父级传递数据、Vue父子组件存储到data数据的访问)

    Vue父子组件通信(父级向子级传递数据.子级向父级传递数据.Vue父子组件存储到data数据的访问) 一.父级向子级传递数据[Prop]: ● Prop:子组件在自身标签上,使用自定义的属性来接收外界 ...

  2. vue 父子组件通信

    算是初学vue,整理一下父子组件通信笔记. 父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息. 一.父组件向子组件下发数据: 1.在子组件中显式地用props选项声明它预期的数据 ...

  3. vue父子组件通信高级用法

    vue项目的一大亮点就是组件化.使用组件可以极大地提高项目中代码的复用率,减少代码量.但是使用组件最大的难点就是父子组件之间的通信. 子通信父 父组件 <template> <div ...

  4. vue父子组件通信

    一.父子组件间通信 vue.js 2.0提供了一个ref 的属性: 可以为子组件指定一个索引id 父组件: <template> <div id='user-login'> & ...

  5. vue 父子组件通信props/emit

    props 1.父组件传递数据给子组件 父组件: <parent> <child :childMsg="msg"></child>//这里必须要 ...

  6. beego+vue父子组件通信(父子页面传值、父子组件传值、父子路由传值)

    场景:有head和foot,为父组件 侧栏tree为子组件 点击tree,右侧孙组件根据点击tree的id,来更改表格内容. 首先是父子(本例中是子组件与孙组件)通信,目前是父传到子,暂时还没有子传到 ...

  7. vue父子组件通信传值

    父组件 -> 子组件 通过props来进行通信 父组件代码: <Children :dataName = "dataContent" /> //dataName: ...

  8. Vue 父子组件通信入门

    父组件向子组件传值 1.组件实例定义方式,注意:子组件一定要使用props属性来定义父组件传递过来的数据 <script type="text/javascript"> ...

  9. vue 父子组件通信-props

    父组件:引用了ComBack组件 ComBack组件:引用了BasicInfor组件 先使用props获取父组件的headInfo这个对象,这里注意(default)默认返回值要用工厂形式返回 Bas ...

随机推荐

  1. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理二 (二十)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  2. Spring boot 官网学习笔记 - logging

    commons-logging和slf4j是java中的日志门面,即它们提供了一套通用的接口,具体的实现可以由开发者自由选择.log4j和logback则是具体的日志实现方案. 比较常用的搭配是com ...

  3. 【ADO.NET基础】加密方法公共类

    各种加密方法集锦: using System; using System.Security.Cryptography; using System.Text; using System.IO; usin ...

  4. .net core 3.0 Signalr - 07 业务实现-服务端 自定义管理组、用户、连接

    Hub的管理 重写OnConnectedAsync 从连接信息中获取UserId.Groups,ConnectId,并实现这三者的关系,存放于redis中 代码请查看 using CTS.Signal ...

  5. .Net Core 商城微服务项目系列(九):使用Jenkins构建自动发布

    1.首先通过Docker运行Consul,并保证各个服务都成功注册: 然后运行jenkins,对MI.Web项目进行发布构建,至于怎么配置之前已经写过了,和上一篇一模一样,这里贴下批处理命令: cd ...

  6. Redis Cluster 原理相关说明

    背景 之前写的 Redis Cluster部署.管理和测试 和 Redis 5.0 redis-cli --cluster help说明 已经比较详细的介绍了如何安装和维护Cluster.但关于Clu ...

  7. 利用基本数据封装类(如:Integer,Float)等实现数据类型转换

    /** * 利用基本数据封装类进行数据类型转换 * @author dyh * */ public class TypeConversion { public static void main(Str ...

  8. Kylin构建Cube过程详解

    1 前言 在使用Kylin的时候,最重要的一步就是创建cube的模型定义,即指定度量和维度以及一些附加信息,然后对cube进行build,当然我们也可以根据原始表中的某一个string字段(这个字段的 ...

  9. LeetCode_933-Number of Recent Calls

    求最近3000毫秒内有多少次调用请求,每一次ping的时间一定比上一次的时间高:解法可以判断最后面一个数t1与最前一个数t2的差不大于3000毫秒,如果大于就直接舍弃,t1与t2之间的个数就是请求次数 ...

  10. Python玩转人工智能最火框架 TensorFlow应用实践 ☝☝☝

    Python玩转人工智能最火框架 TensorFlow应用实践 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 全民人工智能时代,不甘心只做一个旁观者,那就现在 ...