• 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>
  • 相关阅读:
    bzoj 2483: Pku2279 Mr. Young's Picture Permutations -- 钩子公式
    bzoj 3940: [Usaco2015 Feb]Censoring -- AC自动机
    bzoj 1059: [ZJOI2007]矩阵游戏 -- 二分图匹配
    bzoj 1911: [Apio2010]特别行动队 -- 斜率优化
    bzoj 1433: [ZJOI2009]假期的宿舍 -- 最大流
    bzoj 3944: Sum -- 杜教筛
    bzoj 3872: [Poi2014]Ant colony -- 树形dp+二分
    bzoj 1115: [POI2009]石子游戏Kam -- 博弈论
    (三)shiro的认证
    (二)spring初次遇见shiro
  • 原文地址:https://www.cnblogs.com/guxia/p/14391578.html
Copyright © 2020-2023  润新知