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>
posted @ 2021-02-08 23:55  孤夏  阅读(1049)  评论(0编辑  收藏  举报