vue中的父子组件

什么是父子组件

  • 在脚手架项目中,单文件组件的父子组件关系可以简单的认为是使用关系,如A组件中使用了B组件,那么就可以认为A是父组件,B是子组件
  • 所谓父组件和子组件都是单独的单文件组件,它们更多是的引入使用关系

在脚手架中创建和渲染父子组件

  1. 创建父组件与两个子组件


  2. 在父组件中引入,注册,使用这两个子组件
<template>
  <div>
    <p>我是爸爸</p>
  <!-- 使用子组件 -->
    <son :mymoney="'money'"></son>
    <sister></sister>
  </div>
</template>

<script>
// 引入两个子组件
import son from "./son";
import sister from "./sister";
export default {
  data() {
    return {};
  },
// 注册子组件
  components: {
    son,
    sister,
  },
};
</script>
  1. 渲染父组件
    注意:由于父组件中使用了子组件,所以只需要渲染父组件就可以了

实现父组件向子组件传递数据

实现方式:父组件通过 v-bind 属性绑定向子组件共享数据。同时,子组件需要使用 props 接收数据

  1. 子组件props的声明
    • 数组形式
    • 对象形式
  props: {
    //   值为类型,也不能加引号
    // mymoney: Number,
    mymoney: {
      // 通过type属性指定类型
      type: [Number, String],
      //   添加必填项设置,如果值为true,说明这个属性父组件一定要传递
      required: true,
      //   设置默认值,在没有传值的情况下使用默认值
      default: 1000,
    },
  },
  1. 父组件中在使用子组件的位置为props成员赋值
    • 可以直接赋值固定值
    • 如果赋值变量,则需要使用v-bind
    <!-- 在父组件中使用子组件的位置为子组件的prop成员赋值 -->
    <son :mymoney="money"></son>

组件的 props

  • 数组类型:通过数组的方式定义props成员,用于接收父组件传递的数据
  //   添加props 用于接收父组件中传递的数据
  // 1. 定义为数组,里面就是定义的用于接收父组件数据的成员名称,字符串类型
  props: ["mymoney"],

它的缺点:无法为每个 prop 指定具体的数据类型,也无法进行相应的校验

  • 对象类型:通过对象的方式定义props成员,可以为每个prop成员制定规则(类型,校验...),常用的如下:
    ① 基础的类型检查
    ② 多个可能的类型
    ③ 必填项校验
    ④ 属性默认值
    ⑤ 自定义验证函数
  props: {
    //   值为类型,也不能加引号
    // mymoney: Number,
    mymoney: {
      // 通过type属性指定类型
      type: [Number, String],
      //   添加必填项设置,如果值为true,说明这个属性父组件一定要传递
      //   required: true,
      //   设置默认值,在没有传值的情况下使用默认值
      default: 1000,
      //    自定义验证函数:在封装组件时,
      //    可以为 prop 属性指定自定义的验证函数,
      //    从而对 prop 属性的值进行更加精确的控制

      validator(value) {
        if (value < 0 || value > 1000000) {
          return false;
        } else {
          return true;
        }
      },
    },
  },

详细的 props 验证方案,请参考 vue 的官方文档:
https://v3.vuejs.org/guide/component-props.html#prop-validation

实现子组件向父组件传递数据

  1. 子组件使用this.$emit发出事件并传递数据
    • 语法:this.$emit(自定义事件类型,传递的数据)
  methods: {
    tellname() {
      //   通过this.$emit函数发出一个事件,并传递数据
      //   this.$emit(自定义事件类型,数据)
      //   通过this所发出的事件,只能由父组件监听
      this.$emit("getName", this.mygfname);
    },

  },
  1. 父组件中在使用子组件的位置监听子组件所发出的事件
    • 监听事件,调用函数处理
    • 处理函数的参数就是子组件所传递的数据
    <!-- 在父组件中使用子组件的位置,监听子组件所发出的事件,并调用函数处理 -->
    <!-- 如果子组件发出的事件 和内置事件同名,
         那么在父组件中优先监听子组件所发出的同名事件 -->
    <son :mymoney="money" @getName="getname"></son>
  methods: {
    //   子组件发出的事件的处理函数有一个参数,就是子组件所传递的数据
    getname(data) {
      this.mysongfname = data;
    },
  },

兄弟组件之间的数据传递

1. 创建全局的事件总线

  • 全局Vue实例的创建
  • 暴露全局的Vue实例


    创建全局的事件总线

2. 子组件A使用 事件总线.$emit 发出事件并传递数据

  • 引入事件总线
// 引入事件总线 , 用于两个事件之间的数据传递
import bus from "../../../utils/eventBus.js";
  • 发出事件并传递数据
  methods: {
    tellnameToo() {
      bus.$emit("getgfname", this.mygfname);
    },
  },

3. 子组件B中在mounted钩子函数中使用 事件总线.$on 监听子组件A所发出的事件

  • 监听事件,调用函数处理
  • 处理函数的参数就是组件A所传递的数据
  // 组件已加载完成就监听事件的发出
  mounted() {
    // 当监听到其他组件所发出的事件,调用指定的回调函数进行处理,
    // 回调函数的参数就是其他组件发出事件时所传递的参数
    // bus.#on(组件所发出的事件类型,处理函数)
    // 处理函数一定要定义为箭头函数
    bus.$on("getgfname", (data) => {
      console.log(data);
      this.mybtgfname = data;
    });
  },
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容