美文网首页Vue3Vue3.X基础入门
第十二讲、Vue3.x组件自定义事件 以及mitt 实现非父子组

第十二讲、Vue3.x组件自定义事件 以及mitt 实现非父子组

作者: 我爱张智容 | 来源:发表于2021-01-10 19:33 被阅读0次

一、父子组件介绍

二、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>

相关文章

  • 第十二讲、Vue3.x组件自定义事件 以及mitt 实现非父子组

    一、父子组件介绍 二、Vue3.x组件自定义事件实现子组件给父组件传值 注意: Vue官方推荐你始终使用 keba...

  • Vuex 入门

    组件的关系: 父子关系:父传子:自定义属性 props; 子传父:自定义事件 $emit 非父子关系:vuex ...

  • 前端面试必问的

    vue组件通讯的原则 1、父子通讯 props。2、子到父,用自定义事件。非父子组件,就用vuex,就行了

  • 详解如何实现一个简单的 vuex

    首先我们需要知道为何要使用 vuex。父子组件通信用 prop 和自定义事件可以搞定,简单的非父子组件通信用 bu...

  • vue使用v-model实现父子组件间通信

    前言 vue父子组件之间的通信方式: 父组件到子组件:通过props传递数据; 子组件到父组件:通过自定义事件实现...

  • vue组件的使用

    props和$emit 组件间通讯和自定义事件 父子通讯 props $emit兄弟组件或者隔代组件使用自定义事件...

  • VUE03

    Vue组件 组件的创建 组件的指令以及事件绑定 父子组件创建 父子组件通信 兄弟组件的传值 动态组件

  • vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例

    vue2中废弃了broadcast广播和分发事件的方法。父子组件中可以用props和$emit()。如何实现非父子...

  • 使用JavaScript手写一个事件总线功能

    事件总线 事件总线主要是实现一些任意的或非父子关系的组件之间的数据通信 实现一个事件总线功能需要: 事件派发 $...

  • vue 组件通信

    组件关系可分为父子组件通信、兄弟组件通信、跨级组件通信。自定义事件:当子组件需要向父组件传递数据时,就要用到自定义...

网友评论

    本文标题:第十二讲、Vue3.x组件自定义事件 以及mitt 实现非父子组

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