前端小白46134002 2022-07-25 12:13 采纳率: 33.3%
浏览 32
已结题

关于 子组件给父组件通过这种自定义事件传递数据

学习Vue2 脚手架部分,目前这个子组件给父组件传递信息这块有一个问题,求大家指教

App组件中有两个子组件 一个使用 自定义事件 还有一个使用这个 refs 找到这个这个组件 然后再通过$on自定义绑定事件
这个是App组件

<template>
  <div>
    <student ref="stu"></student>
    <school v-on:Atguigu="getSchoolMess"></school>
  </div>
</template>


```javascript
<script>
import Student from "./components/Student.vue";
import School from "./components/School.vue";
export default {
  components: {
    Student,
    School,
  },
  methods: {
    callback() {
      console.log("我是这个Atguigu");
    },
    getSchoolMess(address) {
      console.log(address);
    },
  },
  mounted() {
    this.$refs.stu.$on("Atguigu", () => {
      console.log("我是这个Atguigu");
    });
    this.$refs.stu.$on("Atguigu", this.callback);
  },
};
</script>
**这个是school一个子组件**

```html
<template>
  <div>
    学校地址:{{ address }}
    <br />
    学校名称::{{ name }}
  </div>
</template>



```javascript
<script>
export default {
  data() {
    return {
      address: "北京",
      name: '尚硅谷',
    };
  },
  mounted() {
    this.$emit('Atguigu',this.address)
  },
};
</script>

**这个是一个student组件**

```html
<template>
  <div>
    学生姓名:{{ name }}
    <br />
    学生年龄:{{ age }}
  </div>
</template>


<script>
export default {
  data() {
    return {
      name: "zhangsan",
      age: 18,
    };
  },
  mounted() {
    this.$emit('Atguigu')
  },
};


直接在组件上 直接定义一个自定义事件 在这个子组件中 通过这个 this.$emit('自定义事件名')触发这个自定义事件
回调函数 在这个app组件中执行 this.$emit('自定义事件名' )也可以传递参数 可以完成 这个子组件给父组件传递参数
另一种方法 通过 $this.refs.'定义的名称' 获取这个组件 然后通过

    this.$refs.stu.$on("Atguigu", () => {
      console.log("我是这个Atguigu");
    });

给这个组件写一个 自定义事件名 this.$refs.stu.这个不就是 获取这个组件吗 然后在子组件里通过这个 this.$emit('自定义事件名' )
触发这个自定义事件 不知道为什么这个回调函数 没有执行

难道说 这个 $on 这个不能用了 我之前看弹幕说 vue3这个$on 不能使用了

所以我想问 这个

    this.$refs.stu.$on("Atguigu", () => {
      console.log("我是这个Atguigu");
    });

这个方法 的回调为什么没有执行

  • 写回答

2条回答 默认 最新

  • 前端不释卷leo 前端领域新星创作者 2022-07-25 12:50
    关注

    有可能是生命周期执行先后顺序问题,子组件的mounted会比父组件的mounted先执行,因此在子组件执行emit的时候,父组件还没有创建事件监听,因此监听不到,你可以试试在子组件mounted中使用异步setTimeout的方式触发emit试试。

    setTimeout(()=>{
        this.$emit('Atguigu')
    },200)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月2日
  • 已采纳回答 7月25日
  • 创建了问题 7月25日

悬赏问题

  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大