父子组件的通信

祖先组件

<template>
<div>
    <!-- 拿到子组件content的数据,通过自定义事件 -->
    <!-- 2.在父组件中,通过v-on监听子组件中自定义的事件 -->
    <p>祖先组件</p>
    <Content @injectMsg="getChildMsg"></Content>
    <h2>{{ message }}</h2>
    <p>----祖先组件-----</p>
  </div>
</template>
<script>
import Content from "./components/父子组件的通信-props-自定义事件.vue";
export default {
  data() {
    return {
      message: "",
    };
  },
  methods: {
    getChildMsg: function (value) {
      console.log(value);
      this.message = value;
    },
  },
components: {
    Content,
  },
};
</script>


父组件Content

<template>
  <div>
    <p>父组件</p>
    <!-- 组件是带有名称可复用的实例,单独功能模块的封装 -->
    <Hello :message="msg" :list="list" ref="hello"></Hello>
    <h2 ref="h2">我是content内容</h2>
    <h2>{{ msg }}</h2>
    <button @click="msg = '你好'" ref="button">改变msg</button>
    <button @click="sendParent">提交数据给父组件</button>
    <p>----父组件------</p>
  </div>
</template>
<script>
import Hello from "./子组件和父组件之间相互访问(子)Hello.vue";
export default {
  data() {
    //让每一个组件对象都返回一份新的对象,不会造成数据污染
    return {
      msg: "helloword",
      list: [1, 2, 3, 4],
    };
  },
  mounted() {
    console.log("父组件Content", this.$refs);//将打印当前组件中带ref属性的子组件
    console.log("父组件Content", this.$refs.hello.a);
  },
  components: {
    Hello,
  },
methods: {
    // 1.在子组件中,通过$emit来触发事件
    sendParent: function () {
      // this.$emit('自定义事件的名称','发送的事件参数');
      this.$emit("injectMsg", this.msg);
    },
  },
};
</script>

子组件Hello

<template>
  <div>
    <p>子组件</p>
    <h2>{{ message }}</h2>
    <p>----子组件------</p>
  </div>
</template>
<script>
export default {
  data() {
    return {
      a: 10,
    };
  },
   //字符串数组
  //   props: ["message"],
  props: {
    //1.类型的限制
    // message: Number,
    // 2.类型限制+默认值+必传值
    message: {
      type: String,
      default: "你好",
      required: true,
    },
    list: {
      // 对象或者数组应当用工厂函数返回。
      // 工厂函数会收到组件所接收的原始 props
      // 作为参数
      type: Array,
      default() {
        return [];
      },
    },
  },
  mounted() {
    console.log("子组件Hello", this.$parent);
    console.log("子组件Hello", this.$root);
  },
};
</script>

初始状态

初始状态

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

点击改变msg后的显示状态

在这里插入图片描述

点击提交数据给父组件后显示状态

在这里插入图片描述

总结

父组件获取子组件数据

1.在子组件中,通过$emit来触发事件
this.$emit(‘自定义事件的名称’,‘发送的事件参数’);
在父组件中,通过v-on监听子组件中自定义的事件

2.父组件访问子组件:$refs
ref:用来给元素或子组件注册引用信息,开发中常用

子组件获取父组件数据

1.在父组件中引用子组件,并传递参数
在子组件中定义props

<Hello :message="msg" :list="list"></Hello>
props: {
    //1.类型的限制
    // message: Number,
    // 2.类型限制+默认值+必传值
    message: {
      type: String,
      default: "你好",
      required: true,
    },
    list: {
      // 对象或者数组应当用工厂函数返回。
      // 工厂函数会收到组件所接收的原始 props
      // 作为参数
      type: Array,
      default() {
        return [];
      },
    },
  },

2.子组件访问父组件:$parent,在开发中尽量少用,组件的复用性很高
子组件访问根组件:$root

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值