美文网首页
vue中的父子组件

vue中的父子组件

作者: beizi | 来源:发表于2021-04-13 20:59 被阅读0次

    什么是父子组件

    • 在脚手架项目中,单文件组件的父子组件关系可以简单的认为是使用关系,如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;
        });
      },
    

    相关文章

      网友评论

          本文标题:vue中的父子组件

          本文链接:https://www.haomeiwen.com/subject/udnclltx.html