12. Vue3组件自定义事件 以及mitt 实现非父子组件传值


一、父子组件介绍

二、Vue3.x组件自定义事件实现子组件给父组件传值

注意: Vue官方推荐你始终使用 kebab-case 的事件名

子组件DatePicker.vue

<template> <button @click="run">通过广播方式实现子组件给父组件传值</button> </template> <script> export default { // 建议定义所有发出的事件,以便更好地记录组件应该如何工作。 emits: ["run-parent"], data() { return {} }, methods: { run() { this.$emit("run-parent", "这是子组件穿过来的值") } } } </script>

父组件Home.vue

<template> <div> <date-picker @run-parent="getChild"> </date-picker> </div> </template> <script> import DatePicker from "./DatePicker" export default { data() { return { title: "你好vue" } }, components: { DatePicker }, methods: { getChild(data) { alert(data) } } } </script> <style lang="scss"> </style>

三、Vue3.x组件自定义事件验证

子组件:

<template> <input type="text" v-model="username" /> <br> <br> <input type="text" v-model="password" /> <br> <br> <button @click="run">通过广播方式实现子组件给父组件传值</button> </template> <script> export default { // 建议定义所有发出的事件,以便更好地记录组件应该如何工作。 emits: { submit: ({ username, password }) => { if (username && password) { return true } else { console.warn('传入的参数不能为空!') return false } } }, data() { return { username: "张三", password: "" } }, methods: { run() { this.$emit("submit", { username: this.username, password: this.password }) } } } </script>

父亲组件:

<template> <div> <login @submit="getChild"> </login> </div> </template> <script> import Login from "./Login" export default { data() { return { title: "你好vue" } }, components: { Login }, methods: { getChild(data) { alert(data) } } } </script> <style lang="scss"> </style>

四、vue3.x第三方插件mitt 实现非父子组件传值

https://github.com/developit/mitt

Vue3.x以后从实例中移除了 $on$off$once 方法,$emit 仍然是现有 API 的一部分,只能实现子组件触发父组件的方法。

使用mitt之前先安装mitt模块

 npm install --save mitt

3.1、新建model/event.js

import mitt from 'mitt' const VueEvent = mitt(); export default VueEvent;

3.2、Header组件

<template> <div> <button @click="doLogin">非父子组件传值</button> </div> </template> <script> import VueEvent from '../model/event' export default { data() { return {} }, methods: { doLogin() { VueEvent.emit("login"); } } } </script>

3.3、Login组件

<template> 我是用户登录组件 </template> <script> import VueEvent from '../model/event' export default { mounted() { VueEvent.on("login", () => { alert("doLogin") }) } } </script>


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM