自定义事件与非父子组件间传值

简介: 《Vue实战》系列

API

在组件标签v-on绑定的事件是自定义事件

<div id="root">
    <child @click="handleClick"></child> <!--这里click是自定义事件-->
</div>
<script type="text/javascript">
    Vue.component('child', {
        template: '<button>Child</button>',
    })
    var vm = new Vue({
        el: '#root'
        methods: {
            handleClick() {
                alert('click')
            }
        }
    })
</script>

上面这种情况,当点击子组件时并不会触发handleClick()事件,因为此时的click并非原生的点击事件,而是一个自定义事件。

要想触发组件标签中的click事件需要通过子组件$emit来派发

<div id="root">
    <child @click="handleClick"></child>
</div>
<script type="text/javascript">
    Vue.component('child', {
        template: '<button @click="handleChildClick">Child</button>', // 这里的click是原生事件
        methods: {
            handleChildClick() {
                this.$emit('click')
            }
        }
    })
    var vm = new Vue({
        el: '#root'
        methods: {
            handleClick() {
                alert('click')
            }
        }
    })
</script>

上面代码中,子组件内的click是原生点击事件,通过$emit派发click自定义事件触发父组件的handleClick()

使自定义事件变为原生事件

使用.native修饰符把自定义事件变为原生事件

<div id="root">
    <child @click.native="handleClick"></child> <!--自定义事件添加了native修饰符变原生事件-->
</div>
<script type="text/javascript">
    Vue.component('child', {
        template: '<button>Child</button>',
    })
    var vm = new Vue({
        el: '#root'
        methods: {
            handleClick() {
                alert('click')
            }
        }
    })
</script>

上面代码中,自定义事件click添加了.native修饰符,使其变为原生事件,从而触发handleClick()

自定义事件名会自动变小写

当使用camelCase(驼峰)命名的自定义函数

this.$emit('myEvent')

则监听这个名字的 kebab-case(烤串) 版本是不会有任何效果的:

<!-- 没有效果 -->
<my-component v-on:my-event="doSomething"></my-component>

v-on 事件监听器在 DOM 模板中会被自动转换为全小写 (因为 HTML 是大小写不敏感的),所以 v-on:myEvent 将会变成 v-on:myevent——导致 myEvent 不可能被监听到。

因此,我们推荐你始终使用 kebab-case(烤串) 的事件名

非父子组件间传值

当组件的嵌套多时,非父子组件间传值就显得复杂,除了使用vuex实现之外,还可以通过Bus(或者叫 总线/发布订阅模式/观察者模式)的方式实现非父子组件间传值。


<div id="root">
    <child1 content="组件1:点我传出值"></child1>
    <child2 content="组件2"></child2>
</div>
<script type="text/javascript">
    Vue.prototype.bus = new Vue()
    // 每个Vue原型上都会有bus属性,而且指向同一个Vue实例
    Vue.component('child1', {
        props: {
            content: String
        },
        template: '<button @click="handleClick">{{content}}</button>',
        methods: {
            handleClick(){
                this.bus.$emit('change', '我是组件1过来的~') // 触发change事件,传出值
            }
        }
    })
    Vue.component('child2', {
        data() {
            return {
                childVal: ''
            }
        },
        props: {
            content: String,
        },
        template: '<button>{{content}} + {{childVal}}</button>',
        mounted() {
            this.bus.$on('change', (msg) => { // 绑定change事件,执行函数接收值
                this.childVal = msg
            })
        }
    })
    var vm = new Vue({
        el: '#root'
    })
</script>

上面代码中,在Vue原型上绑定一个bus属性,指向一个Vue实例,之后每个Vue实例都会有一个bus属性。

此方法传值,不限于兄弟组件之间,其他关系组件间都适用。

See the Pen  非父子组件间传值2(Bus /总线/发布订阅模式/观察者模式) by xugaoyi (@xugaoyi)   on CodePen.

相关文章
|
消息中间件 RocketMQ
RocketMQ 消费者监听日志不打印问题
RocketMQ 消费者监听日志不打印问题
479 0
RocketMQ 消费者监听日志不打印问题
sklearn中分类模型评估指标(一):准确率、Top准确率、平衡准确率
accuracy_score函数计算准确率分数,即预测正确的分数(默认)或计数(当normalize=False时)。 在多标签分类中,该函数返回子集准确率(subset accuracy)。 如果样本的整个预测标签集与真实标签集严格匹配,则子集准确率为 1.0; 否则为 0.0。
|
Cloud Native Docker 容器
云原生之使用Docker部署etherpad文档编辑器
云原生之使用Docker部署etherpad文档编辑器
1113 2
|
缓存 前端开发 JavaScript
网页中F5刷新与ctrl + F5强制刷新的区别?
网页中F5刷新与ctrl + F5强制刷新的区别?
网页中F5刷新与ctrl + F5强制刷新的区别?
|
存储 SQL Kubernetes
云原生向量数据库Milvus(一)-简述、系统架构及应用场景(下)
Milvus 是一款云原生向量数据库,它具备高可用、高性能、易拓展的特点,用于海量向量数据的实时召回。
|
弹性计算 编解码 前端开发
阿里云ecs.c6.large服务器ECS计算型c6性能评测
阿里云服务器ECS计算型c6实例ecs.c6.large为2核4G配置,CPU采用Intel Xeon(Cascade Lake) Platinum 8269CY
799 0
阿里云ecs.c6.large服务器ECS计算型c6性能评测
|
存储 小程序 容器
日程安排小程序实战教程(上篇)
日程安排小程序实战教程(上篇)
日程安排小程序实战教程(上篇)
|
存储 算法 C语言
数据结构题:克鲁斯卡尔(Kruscal)算法求最小生成树
数据结构题:克鲁斯卡尔(Kruscal)算法求最小生成树
数据结构题:克鲁斯卡尔(Kruscal)算法求最小生成树
|
小程序
零基础,搞外卖CPS小程序
外卖CPS,其实和淘宝客有点类似,淘客是别人通过你的推广链接购物产生佣金,同理外卖CPS也就是别人通过你的推广链接点了外卖产生佣金。做淘客买东西还不一定每天都有,你可能一个月都买不了几次,但是外卖CPS就不一样了,你可以不购物,但你不可以不吃饭,吃饭是刚需。当然,这些都是建立在你有精准的推广渠道,推广引流做好了,还是可以赚钱的,起码每个月的饭钱是有的。
344 0
零基础,搞外卖CPS小程序
|
存储 关系型数据库 MySQL
在centos7上利用docker部署wordpress博客
Docker简介 1.1 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。 ​在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用 虚拟化技术种类很多,例如:软件虚拟化、