Vue——组件监听

本文介绍了Vue组件中的事件监听,包括自定义事件的绑定和原生事件的处理。自定义事件可以创建并绑定到组件内部,通过Vue的内建方法操作。同时,文章详细讲解了如何使用`.native`修饰符将原生事件绑定到组件的根标签,以及如何将原生事件传递到组件的子标签,并解决了如何选择性绑定单一原生事件的问题,利用Vue生命周期钩子函数筛选并绑定所需事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用处

我们在创建组件后,如果想给组件里面的标签绑定事件,就需要用到组件监听了。

自定义事件绑定到组件中

也就是给自定义标签建一个非原生事件,然后将这个事件绑定到主键里。需要用到 Vue的内建方法$emit 来操作

    <div id="father">
        <zyl-new @test="testClick"></zyl-new>
    </div>
    <script>
        Vue.component('zyl-new', {
            template: `
                <div>
                    <button @click="$emit('test')">点击</button>
                </div>
            `
        })

        let vm = new Vue({
            el:"#father",
            data:{
                count:0
            },
            methods:{
                testClick(){
                    this.count++;
                    console.log(this.count);
                }
            }
        })
    </script>

上述代码中的zyl-new自定标签有一个自定义事件test,然后我们在vue实例中编辑这个事件,最终通过$emit方法将其绑定到组件中.

点击8次按钮后:
在这里插入图片描述
也可以在$emit方法中传参

<button @click="$emit('test',4)">点击</button>
testClick(data){
                    this.count+=data;
                    console.log(this.count);
                }

可以通过传参,然后在绑定的方法中去建一个实参接收这个值

原生事件绑定到组件中

    <div id="father">
        <zyl-new @blur.native="testBlur" @focus.native="testFocus"></zyl-new>
    </div>

    <script>
        Vue.component('zyl-new', {
            template: `
                    <input/>
            `
        })

        let vm = new Vue({
            el:"#father",
            methods:{
                testBlur(){
                    console.log("失焦");
                },
                testFocus(){
                    console.log("聚焦");
                }
            }
        })
    </script>

我们可以在自定义标签上定义原生事件后,通过.native修饰符来将原生事件传给组件的根标签
注意:通过native修饰符传输的事件只能传输给组件的根标签

传输原生事件到组件的子标签

    <div id="father">
        <zyl-new @blur="testBlur" @focus="testFocus"></zyl-new>
    </div>

    <script>
        Vue.component('zyl-new', {
            template: `
            <div>
                <input v-on="$listeners"/>
            </div>
            `
        })

        let vm = new Vue({
            el:"#father",
            methods:{
                testBlur(){
                    console.log("失焦");
                },
                testFocus(){
                    console.log("聚焦");
                }
            }
        })
    </script>

我们可以通过$listeners方法将自定义标签上的原生事件传输到子标签注意此时不能再用.native了

那么问题来了,如果我只需要上面的失焦事件怎么办呢
这里我们可以先通过钩子函数(Vue生命周期自带的),来看看$listeners里面装了些什么

Vue.component('zyl-new', {
            mounted() {//钩子函数
                console.log(this.$listeners);
            },
            template: `
            <div>
                <input v-on="$listeners"/>
            </div>
            `
        })

在这里插入图片描述
可以看到打印的$listeners里面有两个事件。由此我们可以通过选中其中的单个事件进行绑定,完成单一原生事件绑定。

   <div id="father">
        <zyl-new @blur="testBlur" @focus="testFocus"></zyl-new>
    </div>

    <script>
        Vue.component('zyl-new', {
            mounted() {
                console.log(this.$listeners);
            },
            template: `
            <div>
                <input @blur="$listeners.blur"/>
            </div>
            `
        })

        let vm = new Vue({
            el:"#father",
            methods:{
                testBlur(){
                    console.log("失焦");
                },
                testFocus(){
                    console.log("聚焦");
                }
            }
        })
    </script>

这样我们就可以只给组件绑定一个原生事件了

其实我个人觉得$emit更好用,因为不管是自定义事件还是原生事件。
我都能绑定到组件中去,并且可以在组件内部进行传参。

而$listenners只能原样将自定义标签上的事件绑定,不够灵活。
### Vue3 中子组件监听组件变化的方法 在 Vue3 的组合式 API (Composition API) 下,有多种方式可以让子组件监听来自父组件的数据变化。下面介绍几种常见的方式。 #### 使用 `watch` 函数监听 Props 变化 当父组件通过属性 (`props`) 向下传递数据时,可以在子组件内部利用 `watch` 来监视这些属性的变化。对于基本类型的 prop 或者浅层的对象/数组来说,默认情况下 `watch` 已经足够[^1]: ```javascript import { watch } from 'vue'; export default { props: ['parentData'], setup(props) { watch( () => props.parentData, (newValue, oldValue) => { console.log('Parent data changed:', newValue); } ); return {}; } } ``` 如果要监控深层嵌套结构中的更改,则可以设置 `{ deep: true }` 参数来启用深度监测[^3]: ```javascript watch( () => props.deepObject, (newVal, oldVal) => { // 处理深拷贝对象的变更... }, { immediate: true, deep: true } ); ``` #### 利用 `watchEffect` 自动追踪依赖项 另一种更简洁的选择是采用 `watchEffect`,它会自动跟踪其作用域内的响应式变量,并在其发生变化时重新运行闭包函数的内容[^4]: ```javascript import { watchEffect } from 'vue'; setup(props) { watchEffect(() => { console.log(`Current parent value is ${props.someProp}`); }); } ``` 这种方法不需要显式指定被观察的目标以及回调函数签名,因为任何访问到的响应式状态都会成为触发条件的一部分。 #### Provide 和 Inject 组合实现跨层级通信 除了直接监听 props 更新外,还可以考虑使用提供者模式——即 `provide/inject` 对象对,在不破坏层次关系的前提下完成多级嵌套组件间的通讯需求。这种方式特别适合于祖孙三代甚至更深级别的组件间共享状态管理。 ```javascript // ParentComponent.vue <template> <ChildComponent /> </template> <script> import { provide, ref } from 'vue'; export default { name: "ParentComponent", setup() { let sharedState = ref(0); provide('shared', sharedState); setInterval(() => { sharedState.value += 1; }, 1000); return {}; } }; </script> // ChildComponent.vue <template> <!-- ... --> </template> <script> import { inject, onMounted } from 'vue'; export default { name: "ChildComponent", setup() { const sharedValue = inject('shared'); onMounted(() => { console.log(sharedValue.value); }); return {}; } }; </script> ``` 以上就是在 Vue3 中不同场景下的子组件监听组件变化的技术方案概述。每种方法都有各自的适用范围和特点,开发者可以根据实际项目的需求灵活选用最合适的工具集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值