组件自定义事件 和 解绑事件

news/2024/7/9 23:59:30 标签: 前端, javascript, vue

组件自定义事件 和 解绑事件

组件自定义事件

  • 功能:父组件绑定数据,子组件触发事件。(父绑子触发)
    在这里插入图片描述
  • 实现步骤(前三步在父组件实现,第四步在子组件实现):
    • 第一步:提供事件(组件)源
    • 第二步:给组件绑定事件(v-on:)
    • 第三步:编写回调函数,并和事件进行绑定
    • 第四步:等待事件的触发,只要事件触发,则执行回调函数。

使用方法:

vm.$emit(event, arg) //触发当前实例上的时间

第一种方式:在组件标签上绑定事件

javascript">// 父组件
<template>
    <div>
        // 第一步:提供事件(组件)源
        // 第二步:给组件绑定事件(v-on:简写 => @)
        <User @event="eventBinding"></User>
    </div>
</template>
<script>
    import User from './components/User.vue'
    export default {
        name : 'App',
        methods: {
            // 第三步:编写回调函数,并和事件进行绑定
            eventBinding(name, age){
                console.log(name, age)
            }
        },
        components : {User}
    }
</script>
// 子组件
<template>
    <div>
        <button @click="triggerEvent">触发事件</button>
    </div>
</template>
<script>
    export default {
        name : 'User',
        data() {
            return {
                name : '张三',
                age : 20
            }
        },
        methods: {
            // 第四步:等待事件的触发,只要事件触发,则执行回调函数。
            triggerEvent(){
                this.$emit('event', this.name, this.age)
            }
        }
    }
</script>

第二种方式(常用):使用refs给组件绑定事件

javascript">// 父组件
<template>
    <div>
        <User ref="user"></User>
    </div>
</template>

<script>
    import User from './components/User.vue'
    export default {
        name : 'App',
        mounted() {
            this.$refs.user.$on('event', this.eventBinding)
        },
        methods: {
            eventBinding(name, age){
                console.log(name, age)
            }
        },
        components : {User}
    }
</script>
// 子组件
<template>
    <div>
        <button @click="triggerEvent">触发事件</button>
    </div>
</template>
<script>
    export default {
        name : 'User',
        data() {
            return {
                name : '张三',
                age : 20,
            }
        },
        methods: {
            triggerEvent1(){
                this.$emit('event', this.name, this.age)
            }
        }
    }
</script>

第一种 和 第二种有什么区别?

  • 其实并没有多大区别,两个用法其实都很多相同的地方,只是放的位置不同而已
javascript">第一种:<User @event="eventBinding"></User>
第二种(常用):<User ref="user"></User>
       this.$refs.user.$on('event', this.eventBinding)
  • ref=“user” 调用时,使用this.$refs.user
  • @event="eventBinding" == $on('event', this.eventBinding)

第二种的函数形式(不常用)

  • 普通函数
javascript">// 父组件
<template>
    <div>
        <User ref="user"></User>
    </div>
</template>

<script>
    import User from './components/User.vue'
    export default {
        name : 'App',
        mounted() {
            /*
                function函数是被this.$refs.user调用的,
                而this.$refs.user调用的是User标签,
                User标签是User组件的,
                所以这里的this调的是User实例
            */
            this.$refs.user.$on('event', function(){
                // 这里的this是子组件的实例,也就是User组件实例
                console.log(this)
            })
        },
        methods: {
            eventBinding(name, age){
                console.log(name, age)
            }
        },
        components : {User}
    }
</script>
  • 箭头函数
javascript">// 父组件
<template>
    <div>
        <User ref="user"></User>
    </div>
</template>

<script>
    import User from './components/User.vue'
    export default {
        name : 'App',
        mounted() {
            /*
                箭头函数没有this,
                所以只能往上找mounted,
                而mounted是App父组件的,
                所以this调的是App组件实例
            */
            this.$refs.user.$on('event', () => {
                // 这里的this是父组件的实例,也就是App组件实例
                console.log(this)
            })
        },
        methods: {
            eventBinding(name, age){
                console.log(name, age)
            }
        },
        components : {User}
    }
</script>

解绑事件 this.$off()

javascript"><template>
    <div>
        <button @click="triggerEvent">触发事件</button>
        <button @click="unbinding">解绑事件</button>
    </div>
</template>

<script>
    export default {
        name : 'User',
        data() {
            return {
                name : '张三',
                age : 20,
            }
        },
        methods: {
            triggerEvent(){
                this.$emit('event', this.name, this.age)
            },
            // 解绑事件
            unbinding(){
                // 解绑指定的事件
                this.$off('event')
                
                // 解绑多个事件,数组形式
                this.$off(['event', '', ''])
                
                // 解绑全部事件
                this.$off()
            }
        }
    }
</script>
       this.$off('event')
                
                // 解绑多个事件,数组形式
                this.$off(['event', '', ''])
                
                // 解绑全部事件
                this.$off()
            }
        }
    }
</script>

http://www.niftyadmin.cn/n/5099525.html

相关文章

SLAM算法中状态估计的算法有哪些?

状态估计 在SLAM(Simultaneous Localization and Mapping)中,状态估计是核心组件之一,其主要目的是估计机器人的轨迹(或姿态)和地图特征的位置。针对不同的传感器、场景和应用,已经发展出了多种状态估计方法。以下是一些主要的状态估计方法: 扩展卡尔曼滤波(Extended…

小型气象站的分类和选型要点

小型气象站根据用途可分为农业气象站&#xff0c;校园气象站&#xff0c;森林气象站&#xff0c;公园气象站&#xff0c;防火气象站等。 主控制器技术参数 数据存储空间&#xff1a;40000条&#xff08;视通道数量而定&#xff09; 记 录 间 隔&#xff1a;30分-24小时可调…

全流程TOUGH系列软件应用

TOUGH系列软件是由美国劳伦斯伯克利实验室开发的&#xff0c;旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH系列软件采用模块化设计和有限积分差网格剖分方法&#xff0c;通过配合不同状态方程&#xff08;EOS模…

AI工具在工作中的“大作用”

现如今科技的发展让我们的生活越来越便利&#xff0c;一些AI工具的出现&#xff0c;更对我们的工作有莫大的帮助。 AI工具的辅助就像给上班族提供了一种更加高级的“摸鱼方法”&#xff0c;大大提高了打工人的工作效率。如果有一种什么都能回答你&#xff0c;甚至能帮助你完成…

[Python进阶] 监听键鼠:Pynput

6.8 监听键鼠&#xff1a;Pynput 6.8.1 监听鼠标 from pynput import mousedef on_move(x, y):print(f鼠标移动到&#xff1a;{x, y})def on_click(x, y, button, pressed):if pressed:print(f按下了鼠标按键&#xff0c;位置&#xff1a;{x, y}&#xff0c;按键为&#xff1…

Qt中绘图框架介绍

绘图框架类 父窗口继承1继承2QGraphicsSceneQGraphicsViewQGraphicsItemQAbstractGraphicsShapeItemQGraphicsEllipseItemQGraphicsPathItemQGraphicsPolygonItemQGraphicsRectItemQGraphicsSimpleTextItemQGraphicsItemGroupQGraphicsLineItemQGraphicsObjectQGraphicsSvgIte…

ROS2的cv_bridge库opencv版本不匹配问题

1. 问题 /usr/bin/ld: warning: libopencv_imgcodecs.so.4.2, needed by /opt/ros/foxy/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.4.5/usr/bin/ld: warning: libopencv_core.so.4.2, needed by /opt/ros/foxy/lib/libcv_bridge.so, may conflict with …

代码随想录算法训练营第二十五天丨 回溯算法part03

39. 组合总和 思路 题目中的无限制重复被选取&#xff0c;提示&#xff1a;1 < candidates[i] < 200。 本题和77.组合 (opens new window)&#xff0c;216.组合总和III (opens new window)的区别是&#xff1a;本题没有数量要求&#xff0c;可以无限重复&#xff0c;但…